SWE-GLib can now calculate mirrorpoints (antiscia)
This commit is contained in:
		@@ -34,6 +34,8 @@ struct _GsweMomentPrivate {
 | 
				
			|||||||
    GsweMoonPhaseData moon_phase;
 | 
					    GsweMoonPhaseData moon_phase;
 | 
				
			||||||
    GList *aspect_list;
 | 
					    GList *aspect_list;
 | 
				
			||||||
    guint aspect_revision;
 | 
					    guint aspect_revision;
 | 
				
			||||||
 | 
					    GList *mirrorpoint_list;
 | 
				
			||||||
 | 
					    guint mirrorpoint_revision;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
@@ -103,12 +105,14 @@ gswe_moment_init(GsweMoment *moment)
 | 
				
			|||||||
    moment->priv->house_list = NULL;
 | 
					    moment->priv->house_list = NULL;
 | 
				
			||||||
    moment->priv->planet_list = NULL;
 | 
					    moment->priv->planet_list = NULL;
 | 
				
			||||||
    moment->priv->aspect_list = NULL;
 | 
					    moment->priv->aspect_list = NULL;
 | 
				
			||||||
 | 
					    moment->priv->mirrorpoint_list = NULL;
 | 
				
			||||||
    moment->priv->element_points = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
 | 
					    moment->priv->element_points = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
 | 
				
			||||||
    moment->priv->quality_points = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
 | 
					    moment->priv->quality_points = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
 | 
				
			||||||
    moment->priv->house_revision = 0;
 | 
					    moment->priv->house_revision = 0;
 | 
				
			||||||
    moment->priv->points_revision = 0;
 | 
					    moment->priv->points_revision = 0;
 | 
				
			||||||
    moment->priv->moon_phase_revision = 0;
 | 
					    moment->priv->moon_phase_revision = 0;
 | 
				
			||||||
    moment->priv->aspect_revision = 0;
 | 
					    moment->priv->aspect_revision = 0;
 | 
				
			||||||
 | 
					    moment->priv->mirrorpoint_revision = 0;
 | 
				
			||||||
    moment->priv->revision = 1;
 | 
					    moment->priv->revision = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -739,3 +743,164 @@ gswe_moment_get_planet_aspects(GsweMoment *moment, GswePlanet planet)
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					find_mirror(gpointer mirror_p, GsweMirrorInfo *mirror_info, GsweMirrorData *mirror_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GsweMirror mirror = GPOINTER_TO_INT(mirror_p);
 | 
				
			||||||
 | 
					    gdouble start_point,
 | 
				
			||||||
 | 
					            mirror_position,
 | 
				
			||||||
 | 
					            planet_orb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (mirror == GSWE_MIRROR_NONE) {
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    planet_orb = fmin(mirror_data->planet1->planet_info->orb, mirror_data->planet2->planet_info->orb);
 | 
				
			||||||
 | 
					    start_point = (mirror_info->start_sign->sign_id - 1) * 30.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (mirror_info->middle_axis == TRUE) {
 | 
				
			||||||
 | 
					        start_point += 15.0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mirror_position = 2 * start_point - mirror_data->planet1->position;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (mirror_position < 0) {
 | 
				
			||||||
 | 
					        mirror_position += 360.0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((mirror_data->difference = fabs(mirror_data->planet2->position - mirror_position)) <= planet_orb) {
 | 
				
			||||||
 | 
					        mirror_data->mirror_info = mirror_info;
 | 
				
			||||||
 | 
					        mirror_data->mirror = mirror;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        mirror_data->difference = 0.0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gint
 | 
				
			||||||
 | 
					find_mirror_by_both_planets(GsweMirrorData *mirror, struct GsweAspectFinder *mirror_finder)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (((mirror->planet1->planet_id == mirror_finder->planet1) && (mirror->planet2->planet_id == mirror_finder->planet2)) || ((mirror->planet1->planet_id == mirror_finder->planet2) && (mirror->planet2->planet_id == mirror_finder->planet1))) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					gswe_moment_calculate_mirrorpoints(GsweMoment *moment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GList *oplanet,
 | 
				
			||||||
 | 
					          *iplanet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (moment->priv->mirrorpoint_revision == moment->priv->revision) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gswe_moment_calculate_all_planets(moment);
 | 
				
			||||||
 | 
					    g_list_free_full(moment->priv->mirrorpoint_list, g_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (oplanet = moment->priv->planet_list; oplanet; oplanet = oplanet->next) {
 | 
				
			||||||
 | 
					        for (iplanet = moment->priv->planet_list; iplanet; iplanet = iplanet->next) {
 | 
				
			||||||
 | 
					            GswePlanetData *outer_planet = oplanet->data,
 | 
				
			||||||
 | 
					                           *inner_planet = iplanet->data;
 | 
				
			||||||
 | 
					            GsweMirrorData *mirror_data;
 | 
				
			||||||
 | 
					            struct GsweAspectFinder mirror_finder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (outer_planet->planet_id == inner_planet->planet_id) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mirror_finder.planet1 = outer_planet->planet_id;
 | 
				
			||||||
 | 
					            mirror_finder.planet2 = inner_planet->planet_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (g_list_find_custom(moment->priv->mirrorpoint_list, &mirror_finder, (GCompareFunc)find_mirror_by_both_planets) != NULL) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mirror_data = g_new0(GsweMirrorData, 1);
 | 
				
			||||||
 | 
					            mirror_data->planet1 = outer_planet;
 | 
				
			||||||
 | 
					            mirror_data->planet2 = inner_planet;
 | 
				
			||||||
 | 
					            mirror_data->mirror = GSWE_MIRROR_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            (void)g_hash_table_find(gswe_mirror_info_table, (GHRFunc)find_mirror, mirror_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (mirror_data->mirror == GSWE_MIRROR_NONE) {
 | 
				
			||||||
 | 
					                mirror_data->mirror_info = g_hash_table_lookup(gswe_mirror_info_table, GINT_TO_POINTER(GSWE_MIRROR_NONE));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            moment->priv->mirrorpoint_list = g_list_prepend(moment->priv->mirrorpoint_list, mirror_data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    moment->priv->mirrorpoint_revision = moment->priv->revision;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GList *
 | 
				
			||||||
 | 
					gswe_moment_get_all_mirrorpoints(GsweMoment *moment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gswe_moment_calculate_mirrorpoints(moment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return moment->priv->mirrorpoint_list;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GList *
 | 
				
			||||||
 | 
					gswe_moment_get_all_planet_mirrorpoints(GsweMoment *moment, GswePlanet planet)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GList *ret = NULL,
 | 
				
			||||||
 | 
					          *mirror;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gswe_moment_calculate_mirrorpoints(moment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (mirror = moment->priv->mirrorpoint_list; mirror; mirror = mirror->next) {
 | 
				
			||||||
 | 
					        GsweMirrorData *mirror_data = mirror->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ((mirror_data->planet1->planet_id == planet) || (mirror_data->planet2->planet_id == planet)) {
 | 
				
			||||||
 | 
					            ret = g_list_prepend(ret, mirror_data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GList *
 | 
				
			||||||
 | 
					gswe_moment_get_mirror_mirrorpoints(GsweMoment *moment, GsweMirror mirror)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GList *ret = NULL,
 | 
				
			||||||
 | 
					          *mirror_l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gswe_moment_calculate_mirrorpoints(moment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (mirror_l = moment->priv->mirrorpoint_list; mirror_l; mirror_l = mirror_l->next) {
 | 
				
			||||||
 | 
					        GsweMirrorData *mirror_data = mirror_l->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mirror_data->mirror == mirror) {
 | 
				
			||||||
 | 
					            ret = g_list_prepend(ret, mirror_data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GList *
 | 
				
			||||||
 | 
					gswe_moment_get_mirror_planet_mirrorpoints(GsweMoment *moment, GsweMirror mirror, GswePlanet planet)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GList *ret = NULL,
 | 
				
			||||||
 | 
					          *mirror_l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gswe_moment_calculate_mirrorpoints(moment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (mirror_l = moment->priv->mirrorpoint_list; mirror_l; mirror_l = mirror_l->next) {
 | 
				
			||||||
 | 
					        GsweMirrorData *mirror_data = mirror_l->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (((mirror_data->planet1->planet_id == planet) || (mirror_data->planet2->planet_id == planet))  && (mirror_data->mirror == mirror)) {
 | 
				
			||||||
 | 
					            ret = g_list_prepend(ret, mirror_data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,12 +74,20 @@ typedef struct {
 | 
				
			|||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    GswePlanetData *planet1;
 | 
					    GswePlanetData *planet1;
 | 
				
			||||||
    GswePlanetData *planet2;
 | 
					    GswePlanetData *planet2;
 | 
				
			||||||
    GsweAspect aspect;
 | 
					 | 
				
			||||||
    gdouble distance;
 | 
					    gdouble distance;
 | 
				
			||||||
    gdouble difference;
 | 
					    GsweAspect aspect;
 | 
				
			||||||
    GsweAspectInfo *aspect_info;
 | 
					    GsweAspectInfo *aspect_info;
 | 
				
			||||||
 | 
					    gdouble difference;
 | 
				
			||||||
} GsweAspectData;
 | 
					} GsweAspectData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    GswePlanetData *planet1;
 | 
				
			||||||
 | 
					    GswePlanetData *planet2;
 | 
				
			||||||
 | 
					    GsweMirror mirror;
 | 
				
			||||||
 | 
					    GsweMirrorInfo *mirror_info;
 | 
				
			||||||
 | 
					    gdouble difference;
 | 
				
			||||||
 | 
					} GsweMirrorData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _GsweMoment {
 | 
					struct _GsweMoment {
 | 
				
			||||||
    /* Parent instance structure */
 | 
					    /* Parent instance structure */
 | 
				
			||||||
    GObject parent_instance;
 | 
					    GObject parent_instance;
 | 
				
			||||||
@@ -119,6 +127,10 @@ guint gswe_moment_get_quality_points(GsweMoment *moment, GsweQuality quality);
 | 
				
			|||||||
GsweMoonPhaseData *gswe_moment_get_moon_phase(GsweMoment *moment);
 | 
					GsweMoonPhaseData *gswe_moment_get_moon_phase(GsweMoment *moment);
 | 
				
			||||||
GList *gswe_moment_get_aspects(GsweMoment *moment);
 | 
					GList *gswe_moment_get_aspects(GsweMoment *moment);
 | 
				
			||||||
GList *gswe_moment_get_planet_aspects(GsweMoment *moment, GswePlanet planet);
 | 
					GList *gswe_moment_get_planet_aspects(GsweMoment *moment, GswePlanet planet);
 | 
				
			||||||
 | 
					GList *gswe_moment_get_all_mirrorpoints(GsweMoment *moment);
 | 
				
			||||||
 | 
					GList *gswe_moment_get_all_planet_mirrorpoints(GsweMoment *moment, GswePlanet planet);
 | 
				
			||||||
 | 
					GList *gswe_moment_get_mirror_mirrorpoints(GsweMoment *moment, GsweMirror mirror);
 | 
				
			||||||
 | 
					GList *gswe_moment_get_mirror_planet_mirrorpoints(GsweMoment *moment, GsweMirror mirror, GswePlanet planet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __GSWE_MOMENT_H__ */
 | 
					#endif /* __GSWE_MOMENT_H__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user