2020-08-19 17:41:15 +00:00
# include <plot.h>
2020-12-02 00:57:38 +00:00
GtkWidget * da_overview ;
2020-08-28 21:30:48 +00:00
float coordinate_system_settings [ 5 ] ;
float teta ;
2020-08-23 16:28:32 +00:00
2021-03-27 22:07:17 +00:00
float sun_x , sun_y , sun_z ;
float moon_x , moon_y , moon_z ;
float mw_x , mw_y , mw_z ;
float array_sun_x [ 288 ] , array_sun_y [ 288 ] , array_sun_z [ 288 ] ;
float array_moon_x [ 288 ] , array_moon_y [ 288 ] , array_moon_z [ 288 ] ;
float array_mw_x [ 288 ] , array_mw_y [ 288 ] , array_mw_z [ 288 ] ;
2020-12-02 00:57:38 +00:00
2020-08-28 21:30:48 +00:00
void plot_set_basic_coordinate_system_settings ( void ) {
coordinate_system_settings [ 0 ] = - G_PI * 3 / 5 ;
coordinate_system_settings [ 1 ] = - G_PI * 2 / 5 ;
coordinate_system_settings [ 2 ] = 1 ;
coordinate_system_settings [ 3 ] = 1 ;
coordinate_system_settings [ 4 ] = 1.5 ;
}
2021-03-27 22:07:17 +00:00
void plot_adjust_teta ( float value ) {
2020-08-28 21:30:48 +00:00
teta = - value ;
2021-03-27 22:07:17 +00:00
gtk_widget_queue_draw ( da_overview ) ;
2020-08-28 21:30:48 +00:00
}
void plot_adjust_coordinate_system_settings ( double s0 , double s1 , double s2 , double s3 , double s4 ) {
coordinate_system_settings [ 0 ] = s0 ;
coordinate_system_settings [ 1 ] = s1 ;
coordinate_system_settings [ 2 ] = s2 ;
coordinate_system_settings [ 3 ] = s3 ;
coordinate_system_settings [ 4 ] = s4 ;
}
double plot_calc_coordinate_x ( double a1 , double a2 ) {
float alpha , beta ;
double x , a1_new , a2_new ;
if ( ! coordinate_system_settings [ 0 ] ) {
plot_set_basic_coordinate_system_settings ( ) ;
}
alpha = * coordinate_system_settings + G_PI ;
beta = * ( coordinate_system_settings + 1 ) ;
a1_new = cos ( teta ) * a1 - sin ( teta ) * a2 ;
a2_new = sin ( teta ) * a1 + cos ( teta ) * a2 ;
a1_new * = coordinate_system_settings [ 2 ] ;
a2_new * = coordinate_system_settings [ 3 ] ;
x = ( sin ( alpha ) * a1_new - sin ( beta ) * a2_new ) / ( cos ( beta ) * sin ( alpha ) - sin ( beta ) * cos ( alpha ) ) ;
2020-08-19 17:41:15 +00:00
return x ;
}
2020-08-28 21:30:48 +00:00
double plot_calc_coordinate_y ( double a1 , double a2 , double a3 ) {
float alpha , beta ;
double y , a1_new , a2_new ;
if ( ! coordinate_system_settings [ 0 ] ) {
plot_set_basic_coordinate_system_settings ( ) ;
}
alpha = * coordinate_system_settings + G_PI ;
beta = * ( coordinate_system_settings + 1 ) ;
a1_new = cos ( teta ) * a1 - sin ( teta ) * a2 ;
a2_new = sin ( teta ) * a1 + cos ( teta ) * a2 ;
a1_new * = coordinate_system_settings [ 2 ] ;
a2_new * = coordinate_system_settings [ 3 ] ;
a3 * = coordinate_system_settings [ 4 ] ;
y = ( - cos ( alpha ) * a1_new + cos ( beta ) * a2_new ) / ( cos ( beta ) * sin ( alpha ) - sin ( beta ) * cos ( alpha ) ) + a3 ;
2020-08-19 17:41:15 +00:00
return y ;
}
2020-08-28 21:30:48 +00:00
void plot_line_to ( cairo_t * cr , double a1 , double a2 , double a3 ) {
cairo_line_to ( cr , plot_calc_coordinate_x ( a1 , a2 ) , plot_calc_coordinate_y ( a1 , a2 , a3 ) ) ;
2020-08-19 17:41:15 +00:00
}
2020-08-28 21:30:48 +00:00
void plot_move_to ( cairo_t * cr , double a1 , double a2 , double a3 ) {
cairo_move_to ( cr , plot_calc_coordinate_x ( a1 , a2 ) , plot_calc_coordinate_y ( a1 , a2 , a3 ) ) ;
2020-08-19 17:41:15 +00:00
}
2020-08-28 21:30:48 +00:00
void plot_vector_to ( cairo_t * cr , double a1 , double a2 , double a3 ) {
2020-08-19 17:41:15 +00:00
double current_x = 0 ;
double current_y = 0 ;
double * x_1 = & current_x ;
double * y_1 = & current_y ;
2020-08-28 21:30:48 +00:00
double x_2 = plot_calc_coordinate_x ( a1 , a2 ) ;
double y_2 = plot_calc_coordinate_y ( a1 , a2 , a3 ) ;
2020-08-19 17:41:15 +00:00
cairo_get_current_point ( cr , x_1 , y_1 ) ;
double direct_x = x_2 - * x_1 ;
double direct_y = y_2 - * y_1 ;
double norm = pow ( pow ( direct_x , 2 ) + pow ( direct_y , 2 ) , 0.5 ) ;
direct_x / = norm ;
direct_y / = norm ;
2020-08-28 21:30:48 +00:00
/*g_print("direct_x: %f, direct_y: %f\n", direct_x, direct_y);*/
2020-08-19 17:41:15 +00:00
float gamma = 0.5326 ;
cairo_line_to ( cr , x_2 , y_2 ) ;
2021-03-27 22:07:17 +00:00
cairo_move_to ( cr , x_2 + ( - direct_x * cos ( gamma ) + direct_y * sin ( gamma ) ) * 0.2 , y_2 + ( - direct_y * cos ( gamma ) - direct_x * sin ( gamma ) ) * 0.2 ) ;
cairo_line_to ( cr , x_2 , y_2 ) ;
2020-08-19 17:41:15 +00:00
cairo_line_to ( cr , x_2 + ( - direct_x * cos ( gamma ) - direct_y * sin ( gamma ) ) * 0.2 , y_2 + ( - direct_y * cos ( gamma ) + direct_x * sin ( gamma ) ) * 0.2 ) ;
2020-08-28 21:30:48 +00:00
}
double plot_rotate_coordinate ( double x , double y , double z , int coordinate_index , float rot , int rot_index ) {
/* coordniate_index is used to specify if the coordinate is x, y or z component
* rot_index is used to specify if the rotation is around the x , y or z achsis */
if ( rot_index = = 0 ) {
if ( coordinate_index = = 0 ) { return x ; }
else if ( coordinate_index = = 1 ) { return cos ( rot ) * y - sin ( rot ) * z ; }
else { return sin ( rot ) * y + cos ( rot ) * z ; }
}
else if ( rot_index = = 1 ) {
if ( coordinate_index = = 0 ) { return cos ( rot ) * x + sin ( rot ) * z ; }
else if ( coordinate_index = = 1 ) { return y ; }
else { return - sin ( rot ) * x + cos ( rot ) * z ; }
}
else {
if ( coordinate_index = = 0 ) { return cos ( rot ) * x - sin ( rot ) * y ; }
else if ( coordinate_index = = 1 ) { return sin ( rot ) * x + cos ( rot ) * y ; }
else { return z ; }
}
}
void plot_circle ( cairo_t * cr , double radius , float rot1 , float rot2 , double render ) {
double x = radius ;
double y = 0 ;
double z = 0 ;
double x_plot , y_plot , z_plot ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot1 , 0 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot1 , 0 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot1 , 0 ) ;
x = x_plot ; y = y_plot ; z = z_plot ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot2 , 1 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot2 , 1 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot2 , 1 ) ;
plot_move_to ( cr , x_plot , y_plot , z_plot ) ;
for ( double ang = 2 * G_PI / render ; ang < = 2 * G_PI ; ang + = 2 * G_PI / render ) {
x = radius * cos ( ang ) ;
y = radius * sin ( ang ) ;
z = 0 ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot1 , 0 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot1 , 0 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot1 , 0 ) ;
x = x_plot ; y = y_plot ; z = z_plot ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot2 , 1 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot2 , 1 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot2 , 1 ) ;
plot_line_to ( cr , x_plot , y_plot , z_plot ) ;
}
x = radius ;
y = 0 ;
z = 0 ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot1 , 0 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot1 , 0 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot1 , 0 ) ;
x = x_plot ; y = y_plot ; z = z_plot ;
x_plot = plot_rotate_coordinate ( x , y , z , 0 , rot2 , 1 ) ;
y_plot = plot_rotate_coordinate ( x , y , z , 1 , rot2 , 1 ) ;
z_plot = plot_rotate_coordinate ( x , y , z , 2 , rot2 , 1 ) ;
plot_line_to ( cr , x_plot , y_plot , z_plot ) ;
2020-08-19 17:41:15 +00:00
}
2020-10-29 00:05:03 +00:00
2020-12-02 00:57:38 +00:00
void plot_overview ( GtkWidget * box ) {
g_print ( " plots_overview \n " ) ;
da_overview = gtk_drawing_area_new ( ) ;
gtk_widget_set_size_request ( da_overview , 200 , 100 ) ;
gtk_widget_set_hexpand ( da_overview , TRUE ) ;
gtk_widget_set_vexpand ( da_overview , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( box ) , da_overview ) ;
gtk_widget_show_all ( box ) ;
g_signal_connect ( da_overview , " draw " , G_CALLBACK ( on_draw_overview ) , NULL ) ;
}
2021-03-27 22:07:17 +00:00
void course_sun_overview ( float * array_az_sun , float * array_el_sun ) {
for ( int i = 0 ; i < 288 ; i + + ) {
array_sun_x [ i ] = cos ( M_PI / 180 * array_az_sun [ i + 2 ] ) * cos ( M_PI / 180 * array_el_sun [ i + 2 ] ) ;
array_sun_y [ i ] = sin ( M_PI / 180 * array_az_sun [ i + 2 ] ) * cos ( M_PI / 180 * array_el_sun [ i + 2 ] ) ;
array_sun_z [ i ] = - sin ( M_PI / 180 * array_el_sun [ i + 2 ] ) ;
}
}
void course_moon_overview ( float * array_az_moon , float * array_el_moon ) {
for ( int i = 0 ; i < 288 ; i + + ) {
array_moon_x [ i ] = cos ( M_PI / 180 * array_az_moon [ i + 2 ] ) * cos ( M_PI / 180 * array_el_moon [ i + 2 ] ) ;
array_moon_y [ i ] = sin ( M_PI / 180 * array_az_moon [ i + 2 ] ) * cos ( M_PI / 180 * array_el_moon [ i + 2 ] ) ;
array_moon_z [ i ] = - sin ( M_PI / 180 * array_el_moon [ i + 2 ] ) ;
}
}
void course_mw_overview ( float * array_az_mw , float * array_el_mw ) {
for ( int i = 0 ; i < 288 ; i + + ) {
array_mw_x [ i ] = cos ( M_PI / 180 * array_az_mw [ i + 2 ] ) * cos ( M_PI / 180 * array_el_mw [ i + 2 ] ) ;
array_mw_y [ i ] = sin ( M_PI / 180 * array_az_mw [ i + 2 ] ) * cos ( M_PI / 180 * array_el_mw [ i + 2 ] ) ;
array_mw_z [ i ] = - sin ( M_PI / 180 * array_el_mw [ i + 2 ] ) ;
}
}
void update_overview ( float sun_az , float sun_el , float moon_az , float moon_el , float mw_az , float mw_el ) {
sun_x = cos ( M_PI / 180 * sun_az ) * cos ( M_PI / 180 * sun_el ) ;
sun_y = sin ( M_PI / 180 * sun_az ) * cos ( M_PI / 180 * sun_el ) ;
sun_z = - sin ( M_PI / 180 * sun_el ) ;
moon_x = cos ( M_PI / 180 * moon_az ) * cos ( M_PI / 180 * moon_el ) ;
moon_y = sin ( M_PI / 180 * moon_az ) * cos ( M_PI / 180 * moon_el ) ;
moon_z = - sin ( M_PI / 180 * moon_el ) ;
mw_x = cos ( M_PI / 180 * mw_az ) * cos ( M_PI / 180 * mw_el ) ;
mw_y = sin ( M_PI / 180 * mw_az ) * cos ( M_PI / 180 * mw_el ) ;
mw_z = - sin ( M_PI / 180 * mw_el ) ;
2020-12-02 00:57:38 +00:00
gtk_widget_queue_draw ( da_overview ) ;
}
gboolean on_draw_overview ( GtkWidget * widget , cairo_t * cr , gpointer gpoint ) {
GdkWindow * drawing_window ;
cairo_region_t * cairo_region ;
GdkDrawingContext * drawing_context ;
GdkRectangle da ;
2021-03-27 22:07:17 +00:00
gdouble dx , dy ;
gdouble clip_x1 , clip_y1 , clip_x2 , clip_y2 ;
2020-12-02 00:57:38 +00:00
drawing_window = gtk_widget_get_window ( widget ) ;
cairo_region = cairo_region_create ( ) ;
drawing_context = gdk_window_begin_draw_frame ( drawing_window , cairo_region ) ;
cr = gdk_drawing_context_get_cairo_context ( drawing_context ) ;
gdk_window_get_geometry ( drawing_window , & da . x , & da . y , & da . width , & da . height ) ;
2021-03-27 22:07:17 +00:00
cairo_translate ( cr , da . width * 0.5 , da . height * 0.5 ) ;
2020-12-02 00:57:38 +00:00
cairo_scale ( cr , 100 , 100 ) ;
2021-03-27 22:07:17 +00:00
dx = da . width , dy = da . height ;
clip_x1 = 0.0 , clip_y1 = 0.0 , clip_x2 = 0.0 , clip_y2 = 0.0 ;
2020-12-02 00:57:38 +00:00
cairo_device_to_user_distance ( cr , & dx , & dy ) ;
cairo_clip_extents ( cr , & clip_x1 , & clip_y1 , & clip_x2 , & clip_y2 ) ;
2021-03-27 22:07:17 +00:00
plot_set_basic_coordinate_system_settings ( ) ;
2020-12-02 00:57:38 +00:00
cairo_set_source_rgb ( cr , 0.8 , 0.8 , 0.8 ) ;
cairo_paint ( cr ) ;
2021-03-27 22:07:17 +00:00
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
cairo_set_line_width ( cr , 0.02 ) ;
plot_move_to ( cr , 0 , 0 , 0 ) ;
plot_circle ( cr , 1 , 0 , 0 , 50 ) ;
cairo_fill ( cr ) ;
cairo_stroke ( cr ) ;
cairo_set_line_width ( cr , 0.05 ) ;
if ( sun_z < 0 ) {
cairo_set_source_rgb ( cr , 1 , 0 , 0 ) ;
plot_move_to ( cr , 0 , 0 , 0 ) ;
plot_vector_to ( cr , sun_x , sun_y , sun_z ) ;
cairo_stroke ( cr ) ;
}
if ( moon_z < 0 ) {
cairo_set_source_rgb ( cr , 0 , 1 , 0 ) ;
plot_move_to ( cr , 0 , 0 , 0 ) ;
plot_vector_to ( cr , moon_x , moon_y , moon_z ) ;
cairo_stroke ( cr ) ;
}
if ( mw_z < 0 ) {
cairo_set_source_rgb ( cr , 0 , 0 , 1 ) ;
plot_move_to ( cr , 0 , 0 , 0 ) ;
plot_vector_to ( cr , mw_x , mw_y , mw_z ) ;
cairo_stroke ( cr ) ;
}
cairo_set_source_rgb ( cr , 1 , 0.9 , 0 ) ;
plot_move_to ( cr , array_sun_x [ 0 ] , array_sun_y [ 0 ] , array_sun_z [ 0 ] ) ;
for ( int i = 1 ; i < 288 ; i + + ) {
if ( array_sun_z [ i ] < 0 ) {
plot_line_to ( cr , array_sun_x [ i ] , array_sun_y [ i ] , array_sun_z [ i ] ) ;
}
else {
plot_move_to ( cr , array_sun_x [ i ] , array_sun_y [ i ] , array_sun_z [ i ] ) ;
}
}
cairo_stroke ( cr ) ;
cairo_set_source_rgb ( cr , 0.1 , 0.9 , 1 ) ;
plot_move_to ( cr , array_moon_x [ 0 ] , array_moon_y [ 0 ] , array_moon_z [ 0 ] ) ;
for ( int i = 0 ; i < 288 ; i + + ) {
if ( array_moon_z [ i ] < 0 ) {
plot_line_to ( cr , array_moon_x [ i ] , array_moon_y [ i ] , array_moon_z [ i ] ) ;
}
else {
plot_move_to ( cr , array_moon_x [ i ] , array_moon_y [ i ] , array_moon_z [ i ] ) ;
}
}
cairo_stroke ( cr ) ;
cairo_set_source_rgb ( cr , 0.9 , 0.9 , 0.9 ) ;
plot_move_to ( cr , array_mw_x [ 0 ] , array_mw_y [ 0 ] , array_mw_z [ 0 ] ) ;
for ( int i = 0 ; i < 288 ; i + + ) {
if ( array_mw_z [ i ] < 0 ) {
plot_line_to ( cr , array_mw_x [ i ] , array_mw_y [ i ] , array_mw_z [ i ] ) ;
}
else {
plot_move_to ( cr , array_mw_x [ i ] , array_mw_y [ i ] , array_mw_z [ i ] ) ;
}
}
cairo_stroke ( cr ) ;
cairo_surface_t * cairo_surface = cairo_get_target ( cr ) ;
unsigned char * data = cairo_image_surface_get_data ( cairo_surface ) ;
2020-12-02 00:57:38 +00:00
gdk_window_end_draw_frame ( drawing_window , drawing_context ) ;
cairo_region_destroy ( cairo_region ) ;
return FALSE ;
}
2020-10-29 00:05:03 +00:00
void plot_elevation_mw ( float * elevations , GtkWidget * box ) {
g_print ( " plots_mw_elevation \n " ) ;
GtkWidget * da ; /* Drawing Area */
da = gtk_drawing_area_new ( ) ;
2020-12-02 00:57:38 +00:00
gtk_widget_set_size_request ( da , 200 , 100 ) ;
gtk_widget_set_hexpand ( da , TRUE ) ;
gtk_widget_set_vexpand ( da , TRUE ) ;
2020-10-29 00:05:03 +00:00
gtk_container_add ( GTK_CONTAINER ( box ) , da ) ;
gtk_widget_show_all ( box ) ;
static float stat_elevation [ 290 ] ;
for ( int i = 0 ; i < 290 ; i + + ) {
stat_elevation [ i ] = elevations [ i ] ;
}
/* I found this by trail and error... Why do I need a static array? A non static arry is not able to pass data through the g_signal_connect function...? */
g_signal_connect ( da , " draw " , G_CALLBACK ( on_draw_elevation_mw ) , stat_elevation ) ;
}
gboolean on_draw_elevation_mw ( GtkWidget * widget , cairo_t * cr , gpointer gpoint ) {
float * elevation = gpoint ;
GdkWindow * drawing_window ;
cairo_region_t * cairo_region ;
GdkDrawingContext * drawing_context ;
GdkRectangle da ;
drawing_window = gtk_widget_get_window ( widget ) ;
cairo_region = cairo_region_create ( ) ;
drawing_context = gdk_window_begin_draw_frame ( drawing_window , cairo_region ) ;
cr = gdk_drawing_context_get_cairo_context ( drawing_context ) ;
gdk_window_get_geometry ( drawing_window , & da . x , & da . y , & da . width , & da . height ) ;
2020-11-20 01:05:38 +00:00
cairo_translate ( cr , 0 , da . height * 0.4 ) ;
cairo_scale ( cr , 100 , 100 ) ;
gdouble dx = da . width , dy = da . height * 0.4 ;
2020-10-29 00:05:03 +00:00
gdouble clip_x1 = 0.0 , clip_y1 = 0.0 , clip_x2 = 0.0 , clip_y2 = 0.0 ;
cairo_device_to_user_distance ( cr , & dx , & dy ) ;
cairo_clip_extents ( cr , & clip_x1 , & clip_y1 , & clip_x2 , & clip_y2 ) ;
cairo_set_line_width ( cr , 0.05 ) ;
cairo_set_source_rgb ( cr , 0.8 , 0.8 , 0.8 ) ;
cairo_paint ( cr ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_line_to ( cr , dx , 0 ) ;
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
cairo_stroke ( cr ) ;
float extr = 0 ;
if ( fabs ( * elevation ) > * ( elevation + 1 ) ) {
extr = fabs ( * elevation ) ;
}
else {
2020-11-20 01:05:38 +00:00
extr = fabs ( * ( elevation + 1 ) ) ;
2020-10-29 00:05:03 +00:00
}
2020-11-20 01:05:38 +00:00
for ( int i = 0 ; i < 25 ; i + + ) {
float x = ( float ) i / 24. * dx * 0.9 + 0.05 * dx ;
cairo_move_to ( cr , x , - dy ) ;
cairo_set_line_width ( cr , 0.02 ) ;
cairo_set_source_rgb ( cr , 0.95 , 0.95 , 0.95 ) ;
cairo_line_to ( cr , x , dy ) ;
if ( i % 2 = = 0 ) {
cairo_move_to ( cr , x - 0.1 , dy * 1.4 ) ;
static char label [ 3 ] ;
sprintf ( label , " %02d " , i ) ;
cairo_set_font_size ( cr , 0.15 ) ;
cairo_select_font_face ( cr , " sans-serif " , CAIRO_FONT_SLANT_NORMAL , CAIRO_FONT_WEIGHT_BOLD ) ;
cairo_show_text ( cr , label ) ;
}
cairo_stroke ( cr ) ;
}
cairo_set_line_width ( cr , 0.05 ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
2020-10-29 00:05:03 +00:00
for ( int i = 0 ; i < 288 ; i + + ) {
2020-11-20 01:05:38 +00:00
float x = ( float ) i / 288. * dx * 0.9 + 0.05 * dx ;
float y = - * ( elevation + i + 2 ) / extr * dy * 0.95 ;
/*g_print("Elevation: %f\n", elevation[i+2]);*/
2020-10-29 00:05:03 +00:00
if ( i = = 0 ) {
2020-11-20 01:05:38 +00:00
cairo_move_to ( cr , x , y ) ;
2020-10-29 00:05:03 +00:00
}
else {
2020-11-20 01:05:38 +00:00
cairo_line_to ( cr , x , y ) ;
2020-10-29 00:05:03 +00:00
}
2020-11-20 01:05:38 +00:00
2020-10-29 00:05:03 +00:00
}
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
cairo_stroke ( cr ) ;
gdk_window_end_draw_frame ( drawing_window , drawing_context ) ;
cairo_region_destroy ( cairo_region ) ;
2020-11-20 01:05:38 +00:00
2020-10-29 00:05:03 +00:00
return FALSE ;
}
void plot_elevation_sun ( float * elevations , GtkWidget * box ) {
2020-12-02 00:57:38 +00:00
g_print ( " plots_sun_elevation \n " ) ;
2020-10-29 00:05:03 +00:00
GtkWidget * da ; /* Drawing Area */
da = gtk_drawing_area_new ( ) ;
gtk_widget_set_size_request ( GTK_WIDGET ( da ) , 200 , 100 ) ;
gtk_widget_set_hexpand ( GTK_WIDGET ( da ) , TRUE ) ;
gtk_widget_set_vexpand ( GTK_WIDGET ( da ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( box ) , da ) ;
gtk_widget_show_all ( box ) ;
/*g_print("Elevation 1: %f\n",*(elevations+2));*/
static float stat_elevation [ 290 ] ;
for ( int i = 0 ; i < 290 ; i + + ) {
stat_elevation [ i ] = elevations [ i ] ;
}
/* I found this by trail and error... Why do I need a static array? A non static arry is not able to pass data through the g_signal_connect function...? */
/*g_print("Elevation 1.1: %f\n",stat_elevation[2]);*/
g_signal_connect ( da , " draw " , G_CALLBACK ( on_draw_elevation_sun ) , stat_elevation ) ;
}
gboolean on_draw_elevation_sun ( GtkWidget * widget , cairo_t * cr , gpointer gpoint ) {
float * elevation = gpoint ;
/*g_print("on_draw_elevation_sun\n");*/
GdkWindow * drawing_window ;
cairo_region_t * cairo_region ;
GdkDrawingContext * drawing_context ;
GdkRectangle da ;
drawing_window = gtk_widget_get_window ( widget ) ;
cairo_region = cairo_region_create ( ) ;
drawing_context = gdk_window_begin_draw_frame ( drawing_window , cairo_region ) ;
cr = gdk_drawing_context_get_cairo_context ( drawing_context ) ;
gdk_window_get_geometry ( drawing_window , & da . x , & da . y , & da . width , & da . height ) ;
2020-10-31 00:27:08 +00:00
cairo_translate ( cr , 0 , da . height * 0.4 ) ;
cairo_scale ( cr , 100 , 100 ) ;
gdouble dx = da . width , dy = da . height * 0.4 ;
2020-10-29 00:05:03 +00:00
gdouble clip_x1 = 0.0 , clip_y1 = 0.0 , clip_x2 = 0.0 , clip_y2 = 0.0 ;
cairo_device_to_user_distance ( cr , & dx , & dy ) ;
cairo_clip_extents ( cr , & clip_x1 , & clip_y1 , & clip_x2 , & clip_y2 ) ;
cairo_set_line_width ( cr , 0.05 ) ;
cairo_set_source_rgb ( cr , 0.8 , 0.8 , 0.8 ) ;
cairo_paint ( cr ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_line_to ( cr , dx , 0 ) ;
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
cairo_stroke ( cr ) ;
float extr = 0 ;
if ( fabs ( * elevation ) > * ( elevation + 1 ) ) {
extr = fabs ( * elevation ) ;
}
else {
extr = * ( elevation + 1 ) ;
}
2020-10-31 00:27:08 +00:00
for ( int i = 0 ; i < 25 ; i + + ) {
float x = ( float ) i / 24. * dx * 0.9 + 0.05 * dx ;
cairo_move_to ( cr , x , - dy ) ;
cairo_set_line_width ( cr , 0.02 ) ;
cairo_set_source_rgb ( cr , 0.95 , 0.95 , 0.95 ) ;
cairo_line_to ( cr , x , dy ) ;
if ( i % 2 = = 0 ) {
cairo_move_to ( cr , x - 0.1 , dy * 1.4 ) ;
static char label [ 3 ] ;
sprintf ( label , " %02d " , i ) ;
cairo_set_font_size ( cr , 0.15 ) ;
cairo_select_font_face ( cr , " sans-serif " , CAIRO_FONT_SLANT_NORMAL , CAIRO_FONT_WEIGHT_BOLD ) ;
cairo_show_text ( cr , label ) ;
}
cairo_stroke ( cr ) ;
}
cairo_set_line_width ( cr , 0.05 ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
2020-10-29 00:05:03 +00:00
for ( int i = 0 ; i < 288 ; i + + ) {
2020-10-31 00:27:08 +00:00
float x = ( float ) i / 288. * dx * 0.9 + 0.05 * dx ;
float y = - * ( elevation + i + 2 ) / extr * dy * 0.95 ;
2020-10-29 00:05:03 +00:00
/*g_print("Elevation: %f\n", elevation[i+2]);*/
if ( i = = 0 ) {
2020-10-31 00:27:08 +00:00
cairo_move_to ( cr , x , y ) ;
2020-10-29 00:05:03 +00:00
}
else {
2020-10-31 00:27:08 +00:00
cairo_line_to ( cr , x , y ) ;
2020-10-29 00:05:03 +00:00
}
2020-10-31 00:27:08 +00:00
/*
int hour = ( int ) ( i * 5 / 60 ) ;
int min = i * 5 - ( int ) ( i * 5 / 60 ) * 60 ;
if ( elevation [ i + 2 ] = = elevation [ 1 ] ) {
cairo_stroke ( cr ) ;
static char label [ 30 ] ;
sprintf ( label , " %02d:%02d @ %.1f \u00B0 " , hour , min , elevation [ i + 2 ] ) ;
cairo_move_to ( cr , x - 0.7 , y - 0.08 ) ;
cairo_set_font_size ( cr , 0.2 ) ;
cairo_select_font_face ( cr , " Georgia " , CAIRO_FONT_SLANT_NORMAL , CAIRO_FONT_WEIGHT_BOLD ) ;
cairo_show_text ( cr , label ) ;
cairo_move_to ( cr , x , y ) ;
} */
2020-10-29 00:05:03 +00:00
}
/*cairo_line_to (cr, 160./288.*dx, -35./60.*dy);*/
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
cairo_stroke ( cr ) ;
gdk_window_end_draw_frame ( drawing_window , drawing_context ) ;
cairo_region_destroy ( cairo_region ) ;
return FALSE ;
}
2020-11-20 01:05:38 +00:00
void plot_elevation_moon ( float * elevations , GtkWidget * box ) {
GtkWidget * da ;
da = gtk_drawing_area_new ( ) ;
gtk_widget_set_size_request ( GTK_WIDGET ( da ) , 200 , 100 ) ;
gtk_widget_set_hexpand ( GTK_WIDGET ( da ) , TRUE ) ;
gtk_widget_set_vexpand ( GTK_WIDGET ( da ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( box ) , da ) ;
gtk_widget_show_all ( box ) ;
/*g_print("Elevation 1: %f\n",*(elevations+2));*/
static float stat_elevation [ 290 ] ;
for ( int i = 0 ; i < 290 ; i + + ) {
stat_elevation [ i ] = elevations [ i ] ;
}
/* I found this by trail and error... Why do I need a static array? A non static arry is not able to pass data through the g_signal_connect function...? */
/*g_print("Elevation 1.1: %f\n",stat_elevation[2]);*/
g_signal_connect ( da , " draw " , G_CALLBACK ( on_draw_elevation_moon ) , stat_elevation ) ;
}
gboolean on_draw_elevation_moon ( GtkWidget * widget , cairo_t * cr , gpointer gpoint ) {
float * elevation = gpoint ;
GdkWindow * drawing_window ;
cairo_region_t * cairo_region ;
GdkDrawingContext * drawing_context ;
GdkRectangle da ;
drawing_window = gtk_widget_get_window ( widget ) ;
cairo_region = cairo_region_create ( ) ;
drawing_context = gdk_window_begin_draw_frame ( drawing_window , cairo_region ) ;
cr = gdk_drawing_context_get_cairo_context ( drawing_context ) ;
gdk_window_get_geometry ( drawing_window , & da . x , & da . y , & da . width , & da . height ) ;
cairo_translate ( cr , 0 , da . height * 0.4 ) ;
cairo_scale ( cr , 100 , 100 ) ;
gdouble dx = da . width , dy = da . height * 0.4 ;
gdouble clip_x1 = 0.0 , clip_y1 = 0.0 , clip_x2 = 0.0 , clip_y2 = 0.0 ;
cairo_device_to_user_distance ( cr , & dx , & dy ) ;
cairo_clip_extents ( cr , & clip_x1 , & clip_y1 , & clip_x2 , & clip_y2 ) ;
cairo_set_line_width ( cr , 0.05 ) ;
cairo_set_source_rgb ( cr , 0.8 , 0.8 , 0.8 ) ;
cairo_paint ( cr ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_line_to ( cr , dx , 0 ) ;
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
cairo_stroke ( cr ) ;
float extr = 0 ;
if ( fabs ( * elevation ) > * ( elevation + 1 ) ) {
extr = fabs ( * elevation ) ;
}
else {
extr = * ( elevation + 1 ) ;
}
for ( int i = 0 ; i < 25 ; i + + ) {
float x = ( float ) i / 24. * dx * 0.9 + 0.05 * dx ;
cairo_move_to ( cr , x , - dy ) ;
cairo_set_line_width ( cr , 0.02 ) ;
cairo_set_source_rgb ( cr , 0.95 , 0.95 , 0.95 ) ;
cairo_line_to ( cr , x , dy ) ;
if ( i % 2 = = 0 ) {
cairo_move_to ( cr , x - 0.1 , dy * 1.4 ) ;
static char label [ 3 ] ;
sprintf ( label , " %02d " , i ) ;
cairo_set_font_size ( cr , 0.15 ) ;
cairo_select_font_face ( cr , " sans-serif " , CAIRO_FONT_SLANT_NORMAL , CAIRO_FONT_WEIGHT_BOLD ) ;
cairo_show_text ( cr , label ) ;
}
cairo_stroke ( cr ) ;
}
cairo_set_line_width ( cr , 0.05 ) ;
cairo_move_to ( cr , 0 , 0 ) ;
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
for ( int i = 0 ; i < 288 ; i + + ) {
float x = ( float ) i / 288. * dx * 0.9 + 0.05 * dx ;
float y = - * ( elevation + i + 2 ) / extr * dy * 0.95 ;
/*g_print("Elevation: %f\n", elevation[i+2]);*/
if ( i = = 0 ) {
cairo_move_to ( cr , x , y ) ;
}
else {
cairo_line_to ( cr , x , y ) ;
}
}
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
cairo_stroke ( cr ) ;
gdk_window_end_draw_frame ( drawing_window , drawing_context ) ;
cairo_region_destroy ( cairo_region ) ;
return FALSE ;
}