SWE-GLib can now calculate aspects
This commit is contained in:
		@@ -32,6 +32,8 @@ struct _GsweMomentPrivate {
 | 
			
		||||
    GHashTable *quality_points;
 | 
			
		||||
    guint moon_phase_revision;
 | 
			
		||||
    GsweMoonPhaseData moon_phase;
 | 
			
		||||
    GList *aspect_list;
 | 
			
		||||
    guint aspect_revision;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
@@ -44,6 +46,11 @@ enum {
 | 
			
		||||
    PROP_TIMESTAMP
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct GsweAspectFinder {
 | 
			
		||||
    GswePlanet planet1;
 | 
			
		||||
    GswePlanet planet2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint gswe_moment_signals[SIGNAL_LAST] = {0};
 | 
			
		||||
 | 
			
		||||
static void gswe_moment_dispose(GObject *gobject);
 | 
			
		||||
@@ -95,11 +102,13 @@ gswe_moment_init(GsweMoment *moment)
 | 
			
		||||
    moment->priv->timestamp = NULL;
 | 
			
		||||
    moment->priv->house_list = NULL;
 | 
			
		||||
    moment->priv->planet_list = NULL;
 | 
			
		||||
    moment->priv->aspect_list = 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->house_revision = 0;
 | 
			
		||||
    moment->priv->points_revision = 0;
 | 
			
		||||
    moment->priv->moon_phase_revision = 0;
 | 
			
		||||
    moment->priv->aspect_revision = 0;
 | 
			
		||||
    moment->priv->revision = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -587,3 +596,111 @@ gswe_moment_get_moon_phase(GsweMoment *moment)
 | 
			
		||||
    return &(moment->priv->moon_phase);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gint
 | 
			
		||||
find_aspect_by_both_planets(GsweAspectData *aspect, struct GsweAspectFinder *aspect_finder)
 | 
			
		||||
{
 | 
			
		||||
    if (((aspect->planet1->planet_id == aspect_finder->planet1) && (aspect->planet2->planet_id == aspect_finder->planet2)) || ((aspect->planet1->planet_id == aspect_finder->planet2) && (aspect->planet2->planet_id == aspect_finder->planet1))) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
find_aspect(gpointer aspect_p, GsweAspectInfo *aspect_info, GsweAspectData *aspect_data)
 | 
			
		||||
{
 | 
			
		||||
    GsweAspect aspect = GPOINTER_TO_INT(aspect_p);
 | 
			
		||||
    gdouble distance,
 | 
			
		||||
            diff,
 | 
			
		||||
            planet_orb,
 | 
			
		||||
            aspect_orb;
 | 
			
		||||
 | 
			
		||||
    distance = fabs(aspect_data->planet1->position - aspect_data->planet2->position);
 | 
			
		||||
 | 
			
		||||
    if (distance > 180.0) {
 | 
			
		||||
        distance = 360.0 - distance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    diff = fabs(aspect_info->size - distance);
 | 
			
		||||
    planet_orb = fmin(aspect_data->planet1->planet_info->orb, aspect_data->planet2->planet_info->orb);
 | 
			
		||||
    aspect_orb = fmax(1.0, planet_orb - aspect_info->orb_modifier);
 | 
			
		||||
 | 
			
		||||
    if (diff < aspect_orb) {
 | 
			
		||||
        aspect_data->aspect = aspect;
 | 
			
		||||
        aspect_data->aspect_info = aspect_info;
 | 
			
		||||
 | 
			
		||||
        if (aspect_info->size == 0) {
 | 
			
		||||
            aspect_data->difference = (1 - ((360.0 - diff) / 360.0)) * 100.0;
 | 
			
		||||
        } else {
 | 
			
		||||
            aspect_data->difference = (1 - ((aspect_info->size - diff) / aspect_info->size)) * 100.0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
gswe_moment_calculate_aspects(GsweMoment *moment)
 | 
			
		||||
{
 | 
			
		||||
    GList *oplanet,
 | 
			
		||||
          *iplanet;
 | 
			
		||||
 | 
			
		||||
    if (moment->priv->aspect_revision == moment->priv->revision) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gswe_moment_calculate_all_planets(moment);
 | 
			
		||||
    g_list_free_full(moment->priv->aspect_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;
 | 
			
		||||
            struct GsweAspectFinder aspect_finder;
 | 
			
		||||
            GsweAspectData *aspect_data;
 | 
			
		||||
 | 
			
		||||
            if (outer_planet->planet_id == inner_planet->planet_id) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            aspect_finder.planet1 = outer_planet->planet_id;
 | 
			
		||||
            aspect_finder.planet2 = inner_planet->planet_id;
 | 
			
		||||
 | 
			
		||||
            if (g_list_find_custom(moment->priv->aspect_list, &aspect_finder, (GCompareFunc)find_aspect_by_both_planets) != NULL) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            aspect_data = g_new0(GsweAspectData, 1);
 | 
			
		||||
            aspect_data->planet1 = outer_planet;
 | 
			
		||||
            aspect_data->planet2 = inner_planet;
 | 
			
		||||
            aspect_data->aspect = GSWE_ASPECT_NONE;
 | 
			
		||||
 | 
			
		||||
            (void)g_hash_table_find(gswe_aspect_info_table, (GHRFunc)find_aspect, aspect_data);
 | 
			
		||||
 | 
			
		||||
            if (aspect_data->aspect == GSWE_ASPECT_NONE) {
 | 
			
		||||
                aspect_data->aspect_info = g_hash_table_lookup(gswe_aspect_info_table, GINT_TO_POINTER(GSWE_ASPECT_NONE));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            moment->priv->aspect_list = g_list_prepend(moment->priv->aspect_list, aspect_data);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    moment->priv->aspect_revision = moment->priv->revision;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GList *
 | 
			
		||||
gswe_moment_get_aspects(GsweMoment *moment)
 | 
			
		||||
{
 | 
			
		||||
    gswe_moment_calculate_aspects(moment);
 | 
			
		||||
 | 
			
		||||
    return moment->priv->aspect_list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GList *
 | 
			
		||||
gswe_moment_get_planet_aspects(GsweMoment *moment, GswePlanet planet)
 | 
			
		||||
{
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,14 @@ typedef struct {
 | 
			
		||||
    gdouble illumination;
 | 
			
		||||
} GsweMoonPhaseData;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    GswePlanetData *planet1;
 | 
			
		||||
    GswePlanetData *planet2;
 | 
			
		||||
    GsweAspect aspect;
 | 
			
		||||
    gdouble difference;
 | 
			
		||||
    GsweAspectInfo *aspect_info;
 | 
			
		||||
} GsweAspectData;
 | 
			
		||||
 | 
			
		||||
struct _GsweMoment {
 | 
			
		||||
    /* Parent instance structure */
 | 
			
		||||
    GObject parent_instance;
 | 
			
		||||
@@ -108,6 +116,7 @@ GswePlanetData *gswe_moment_get_planet(GsweMoment *moment, GswePlanet planet);
 | 
			
		||||
guint gswe_moment_get_element_points(GsweMoment *moment, GsweElement element);
 | 
			
		||||
guint gswe_moment_get_quality_points(GsweMoment *moment, GsweQuality quality);
 | 
			
		||||
GsweMoonPhaseData *gswe_moment_get_moon_phase(GsweMoment *moment);
 | 
			
		||||
GList *gswe_moment_get_aspects(GsweMoment *moment);
 | 
			
		||||
 | 
			
		||||
#endif /* __GSWE_MOMENT_H__ */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user