#ifndef __XGALAXY_H__ #define __XGALAXY_H__ #include #include #include "galaxy.h" typedef struct { double mass; Vector c; /* coordinate */ Vector v; /* velocity */ } StarEntry; typedef struct { Vector d; double w; } Quaternion; typedef struct { GtkWidget *window; GtkWidget *deltaField; GtkWidget *errorField; GtkWidget *dataField; GtkWidget *dataEnergyField; GtkWidget *dataImpulseField; GtkWidget *dataMomentField; GtkWidget *resEnergyField; GtkWidget *resImpulseField; GtkWidget *resMomentField; GtkWidget *resDeltaField; GtkWidget *resTimeField; GtkWidget *resField; GtkWidget *notebook; GtkWidget *XSlider; GtkWidget *YSlider; GtkWidget *ZSlider; double Xangle; double Yangle; double Zangle; Quaternion angle; double Scale; GtkWidget *drawing_area; GdkPixmap *pixmap; GtkWidget *buttonRun; GtkWidget *buttonPause; Galaxy galaxy; char *filename; u_int32_t nentry; u_int32_t lenentry; Star *entry; Star *tmpentry; /* state */ volatile u_int32_t runing:1, paused:1, request_to_exit:1, page_active:4, trace:1, locksignal:1, drawaxis:1, unused:22; double scaleX; double scaleY; pthread_mutex_t mutex; pthread_t thread; double runTime; double beginx; double beginy; Quaternion motion; } XGlalaxyStruct; #define XG_TIME_TICK (20) extern XGlalaxyStruct XGalaxy; /*entry*/ void freeStarEntry(); void addEntry(Star *star); void deleteEntry(u_int32_t i); void editEntry(u_int32_t i, int col, double val); void cntEntry(); void galaxy_set_title(); /* menu action */ gboolean show_resCList( GtkWidget *w, GdkEventExpose *event, gpointer data ); void clearData( GtkWidget *w, gpointer data ); void saveAsFile( GtkWidget *w, gpointer data ); void saveFile( GtkWidget *w, gpointer data ); void openFile( GtkWidget *w, gpointer data ); void showAbout( GtkWidget *w, gpointer data ); void actionRun( GtkWidget *w, gpointer data ); void actionPause( GtkWidget *w, gpointer data ); void actionStop( GtkWidget *w, gpointer data ); /* graphics */ gint expose_event( GtkWidget *widget, GdkEventExpose *event ); gint configure_event( GtkWidget *widget, GdkEventConfigure *event ); void angle_changed(GtkRange *range, gpointer user_data); void fitGalaxy(); void drawGalaxy(); void drawStars(); void drawAxis(); void clearDraw(); void DrawDisk(GdkGC *gc, double CenterX, double CenterY, double Radius, double Feather, double brightness); void antialiasedLine(GdkGC *gc, int x0, int y0, int x1, int y1, GdkColor *color); gboolean mouse_motion_notify(GtkWidget *widget, GdkEventMotion *event); /*quaternions*/ void vector_vmul(Vector *res, Vector *a, Vector *b); double vector_smul(Vector *a, Vector *b); void vector_mul(Vector *res, Vector *a, double b); void quater_vmul(Quaternion *res, Quaternion *a, Quaternion *b); void quater_inverse(Quaternion *res, Quaternion *a); void rotate(Vector *res, Vector *v, Quaternion *q); void quater_normalize(Quaternion *q); double vector_length(Vector *v); void vector_normal(Vector *v); void vector_add(Vector *res, Vector *a, Vector *b); void vector_sub(Vector *res, Vector *a, Vector *b); double quater_length(Quaternion *a); void quater_to_matrix( Quaternion *q, double m[3][3] ); void matrix_to_quater( double m[3][3], Quaternion *q ); void quater_to_angles( Quaternion *q, Vector *a); #endif