Change to scrollable content, bug fixes with time calculations, optimized calculations, cairo based couse plot (experimental)

old-version-gtk3
Zwarf 2021-03-27 23:07:17 +01:00
rodzic ffd099cea4
commit 059e918f59
6 zmienionych plików z 829 dodań i 628 usunięć

Wyświetl plik

@ -60,7 +60,6 @@ void utc_zone_to_time (int *time_utc, int *time_local){
}
void time_to_utc (int *time_local, int *time_utc){
calc_time_utc (time_utc);
int sign = *(time_utc+5)/abs(*(time_utc+5));
*time_utc=*time_local;

Wyświetl plik

@ -101,11 +101,6 @@ void hand_plot_sun(GtkBuilder *builder, float latitude, float longitude, int *ti
int time_dyn[6] = {*time_utc, *(time_utc+1), *(time_utc+2), *(time_utc+3), *(time_utc+4), -*(time_utc+5)};
int time_dyn_local[6];
float elevation[290];
float result[2];
float elevation_last;
float min_elevation, max_elevation;
float azimuth_max, azimuth_sunrise, azimuth_sunset;
int time_max_elevation[2]={-90,0};
int time_sunrise[2]={-1,0};
int time_sunset[2]={-1,0};
@ -118,6 +113,12 @@ void hand_plot_sun(GtkBuilder *builder, float latitude, float longitude, int *ti
int time_dark_night_end[2];
int time_dark_night_begin[2];
float azimuth[290], elevation[290];
float result[2];
float elevation_last;
float min_elevation, max_elevation;
float azimuth_max, azimuth_sunrise, azimuth_sunset;
char c_time_culmination[16];
char c_elevation_culmination[7];
char c_time_sunrise[16];
@ -137,6 +138,7 @@ void hand_plot_sun(GtkBuilder *builder, float latitude, float longitude, int *ti
hand_sun (latitude, longitude, time_dyn_local, result);
if (i%5==0){
azimuth[i/5+2] = result[0];
elevation[i/5+2] = result[1];
}
@ -204,6 +206,8 @@ void hand_plot_sun(GtkBuilder *builder, float latitude, float longitude, int *ti
/* g_print("Time max elevation: %02d:%02d, Time sunrise: %02d:%02d, Time sunset: %02d:%02d\n",
time_max_elevation[0],time_max_elevation[1],time_sunrise[0],time_sunrise[1],time_sunset[0],time_sunset[1]); */
elevation[0] = min_elevation;
elevation[1] = max_elevation;
@ -221,6 +225,7 @@ void hand_plot_sun(GtkBuilder *builder, float latitude, float longitude, int *ti
gtk_container_foreach (GTK_CONTAINER (box), (GtkCallback) gtk_widget_destroy, NULL);
plot_elevation_sun (elevation, box);
course_sun_overview (azimuth, elevation);
sprintf (c_time_culmination, "%02d:%02d (@ %.1f\u00B0)", time_max_elevation[0], time_max_elevation[1], azimuth_max);
gtk_label_set_text (label_time_culmination, c_time_culmination);
@ -261,7 +266,7 @@ void hand_plot_moon(GtkBuilder *builder, float latitude, float longitude, int *t
GtkWidget *box;
int time_dyn[6] = {*time_utc, *(time_utc+1), *(time_utc+2), *(time_utc+3), *(time_utc+4), -*(time_utc+5)};
int time_dyn_local[6];
float elevation[290];
float azimuth[290], elevation[290];
float result[2];
float min_elevation, max_elevation;
float elevation_last;
@ -290,6 +295,7 @@ void hand_plot_moon(GtkBuilder *builder, float latitude, float longitude, int *t
hand_moon (latitude, longitude, time_dyn_local, result);
if (i%5==0){
azimuth[i/5+2] = result[0];
elevation[i/5+2] = result[1];
}
@ -327,6 +333,7 @@ void hand_plot_moon(GtkBuilder *builder, float latitude, float longitude, int *t
box = GTK_WIDGET (gtk_builder_get_object(builder, "box_moon_elevation_plot"));
gtk_container_foreach (GTK_CONTAINER (box), (GtkCallback) gtk_widget_destroy, NULL);
plot_elevation_moon (elevation, box);
course_moon_overview (azimuth, elevation);
label_rise = GTK_LABEL (gtk_builder_get_object (builder, "moon_rise"));
label_set = GTK_LABEL (gtk_builder_get_object (builder, "moon_set"));
@ -351,7 +358,7 @@ void hand_plot_mw(GtkBuilder *builder, float latitude, float longitude, int *tim
GtkWidget *box;
int time_dyn[6] = {*time_utc, *(time_utc+1), *(time_utc+2), *(time_utc+3), *(time_utc+4), -*(time_utc+5)};
int time_dyn_local[6];
float elevation[290];
float azimuth[290], elevation[290];
float result[2];
float min_elevation, max_elevation;
float elevation_last;
@ -380,6 +387,7 @@ void hand_plot_mw(GtkBuilder *builder, float latitude, float longitude, int *tim
hand_milky_way (latitude, longitude, time_dyn_local, result);
if (i%5==0){
azimuth[i/5+2] = result[0];
elevation[i/5+2] = result[1];
}
@ -417,6 +425,7 @@ void hand_plot_mw(GtkBuilder *builder, float latitude, float longitude, int *tim
box = GTK_WIDGET (gtk_builder_get_object(builder, "box_mw_elevation_plot"));
gtk_container_foreach (GTK_CONTAINER (box), (GtkCallback) gtk_widget_destroy, NULL);
plot_elevation_mw (elevation, box);
course_mw_overview (azimuth, elevation);
label_rise = GTK_LABEL (gtk_builder_get_object (builder, "mw_rise"));
label_set = GTK_LABEL (gtk_builder_get_object (builder, "mw_set"));

Wyświetl plik

@ -5,6 +5,7 @@
#include <calculations.h>
#include <webconnection.h>
#include <handler.h>
#include <plot.h>
/* TODO
* Clock should show allways TWO digits
@ -16,6 +17,8 @@ GtkWidget *button_search;
GtkWidget *button_now;
GtkWidget *button_calculate;
GtkWidget *label_heading;
GtkWidget *box_scale;
GtkWidget *scale_button;
GtkEntry *north_entry;
GtkEntry *east_entry;
@ -203,6 +206,11 @@ static int adjust_time (GtkWidget *widget, gpointer data){
return 1;
}
void scale_button_changed (GtkRange *range, GtkScrollType scroll, double value, gpointer user_data){
if (plotted){
plot_adjust_teta(G_PI/180*value);
}
}
static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
@ -252,6 +260,13 @@ int main( int argc, char *argv[] )
east_entry = GTK_ENTRY(gtk_builder_get_object(builder, "east_entry"));
searchentry = GTK_SEARCH_ENTRY(gtk_builder_get_object(builder, "searchentry"));
box_scale = GTK_WIDGET (gtk_builder_get_object (builder, "scale_rotation"));
scale_button = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 360, 1);
gtk_widget_set_hexpand (scale_button, TRUE);
gtk_container_add (GTK_CONTAINER (box_scale), scale_button);
g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL);
g_signal_connect (window, "configure-event", G_CALLBACK(hdy_size_config), NULL);
@ -262,14 +277,14 @@ int main( int argc, char *argv[] )
g_signal_connect (entry_year, "changed", G_CALLBACK (correct_time), NULL);
g_signal_connect (entry_hour, "changed", G_CALLBACK (adjust_time), NULL);
g_signal_connect (entry_min, "changed", G_CALLBACK (adjust_time), NULL);
g_signal_connect (searchentry, "activate", G_CALLBACK (search), NULL);
g_signal_connect (scale_button, "change-value", G_CALLBACK(scale_button_changed), NULL);
set_time_now (window, NULL);
gtk_widget_show (window);
gtk_widget_show_all (window);
gtk_main ();

Plik diff jest za duży Load Diff

Wyświetl plik

@ -5,12 +5,13 @@ GtkWidget *da_overview;
float coordinate_system_settings[5];
float teta;
float sun_az;
float sun_el;
float moon_az;
float moon_el;
float mw_az;
float mw_el;
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];
void plot_set_basic_coordinate_system_settings (void){
coordinate_system_settings[0] = -G_PI*3/5;
@ -20,9 +21,9 @@ void plot_set_basic_coordinate_system_settings (void){
coordinate_system_settings[4] = 1.5;
}
void plot_adjust_teta (GtkRange *range, GtkScrollType scroll, double value, gpointer widget){
void plot_adjust_teta (float value){
teta = -value;
gtk_widget_queue_draw (widget);
gtk_widget_queue_draw (da_overview);
}
void plot_adjust_coordinate_system_settings (double s0, double s1, double s2, double s3, double s4){
@ -96,8 +97,8 @@ void plot_vector_to (cairo_t *cr, double a1, double a2, double a3) {
float gamma = 0.5326;
cairo_line_to (cr, x_2, y_2);
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);
cairo_move_to (cr, x_2, y_2);
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);
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);
}
@ -180,15 +181,44 @@ void plot_overview (GtkWidget *box){
g_signal_connect (da_overview, "draw", G_CALLBACK (on_draw_overview), NULL);
}
void update_overview (float sun_az_ud, float sun_el_ud, float moon_az_ud, float moon_el_ud, float mw_az_ud, float mw_el_ud){
sun_az = sun_az_ud;
sun_el = sun_el_ud;
moon_az = moon_az_ud;
moon_el = moon_el_ud;
mw_az = mw_az_ud;
mw_el = mw_el_ud;
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);
g_print("Sun Elevation update: %f\n", sun_el);
gtk_widget_queue_draw(da_overview);
}
@ -198,25 +228,97 @@ gboolean on_draw_overview (GtkWidget *widget, cairo_t *cr, gpointer gpoint){
cairo_region_t *cairo_region;
GdkDrawingContext *drawing_context;
GdkRectangle da;
gdouble dx, dy;
gdouble clip_x1, clip_y1, clip_x2, clip_y2;
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_translate (cr, da.width*0.5, da.height*0.5);
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;
dx = da.width, dy = da.height;
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);
plot_set_basic_coordinate_system_settings();
cairo_set_source_rgb (cr, 0.8, 0.8, 0.8);
cairo_paint (cr);
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);
gdk_window_end_draw_frame(drawing_window,drawing_context);
cairo_region_destroy(cairo_region);

Wyświetl plik

@ -2,6 +2,8 @@
#include <math.h>
#include <cairo.h>
void plot_adjust_teta (float value);
double plot_calc_coordinate_x (double a1, double a2);
double plot_calc_coordinate_y (double a1, double a2, double a3);
@ -20,6 +22,12 @@ void plot_overview (GtkWidget *box);
void update_overview (float sun_az_ud, float sun_el_ud, float moon_az_ud, float moon_el_ud, float mw_az_ud, float mw_el_ud);
void course_sun_overview (float *array_az_sun, float *array_el_sun);
void course_moon_overview (float *array_az_moon, float *array_el_moon);
void course_mw_overview (float *array_az_mw, float *array_el_mw);
gboolean on_draw_overview (GtkWidget *widget, cairo_t *cr, gpointer gpoint);
void plot_elevation_mw (float *elevations, GtkWidget *box);