diff --git a/src/gswe-antiscion-data.c b/src/gswe-antiscion-data.c
index f5ad3b1..8133a63 100644
--- a/src/gswe-antiscion-data.c
+++ b/src/gswe-antiscion-data.c
@@ -15,6 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this library; if not, see .
*/
+#include
#include
#include "swe-glib-private.h"
@@ -70,6 +71,62 @@ gswe_antiscion_data_new(void)
return ret;
}
+static gboolean
+find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, GsweAntiscionData *antiscion_data)
+{
+ GsweAntiscionAxis axis;
+ gdouble start_point,
+ axis_position,
+ planet_orb;
+
+ if ((axis = GPOINTER_TO_INT(axis_p)) == GSWE_ANTISCION_AXIS_NONE) {
+ return FALSE;
+ }
+
+ planet_orb = fmin(antiscion_data->planet1->planet_info->orb, antiscion_data->planet2->planet_info->orb);
+ start_point = (antiscion_axis_info->start_sign->sign - 1) * 30.0;
+
+ start_point += antiscion_axis_info->sign_offset;
+
+ axis_position = 2 * start_point - antiscion_data->planet1->position;
+
+ if (axis_position < 0) {
+ axis_position += 360.0;
+ }
+
+ if ((antiscion_data->difference = fabs(antiscion_data->planet2->position - axis_position)) <= planet_orb) {
+ antiscion_data->antiscion_axis_info = antiscion_axis_info;
+
+ return TRUE;
+ } else {
+ antiscion_data->difference = 0.0;
+ }
+
+ return FALSE;
+}
+
+void
+gswe_antiscion_data_calculate(GsweAntiscionData *antiscion_data)
+{
+ if ((antiscion_data->antiscion_axis_info = g_hash_table_find(gswe_antiscion_axis_info_table, (GHRFunc)find_antiscion, antiscion_data)) == NULL) {
+ antiscion_data->antiscion_axis_info = g_hash_table_lookup(gswe_antiscion_axis_info_table, GINT_TO_POINTER(GSWE_ANTISCION_AXIS_NONE));
+ }
+}
+
+GsweAntiscionData *
+gswe_antiscion_data_new_with_planets(GswePlanetData *planet1, GswePlanetData *planet2)
+{
+ GsweAntiscionData *ret;
+
+ ret = gswe_antiscion_data_new();
+ ret->planet1 = planet1;
+ ret->planet2 = planet2;
+
+ gswe_antiscion_data_calculate(ret);
+
+ return ret;
+}
+
/**
* gswe_antiscion_data_ref:
* @antiscion_data: (in): a #GsweAntiscionData
diff --git a/src/gswe-moment.c b/src/gswe-moment.c
index baa421a..62e60a8 100644
--- a/src/gswe-moment.c
+++ b/src/gswe-moment.c
@@ -1109,40 +1109,6 @@ gswe_moment_get_planet_aspects(GsweMoment *moment, GswePlanet planet, GError **e
return ret;
}
-static gboolean
-find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, GsweAntiscionData *antiscion_data)
-{
- GsweAntiscionAxis axis;
- gdouble start_point,
- axis_position,
- planet_orb;
-
- if ((axis = GPOINTER_TO_INT(axis_p)) == GSWE_ANTISCION_AXIS_NONE) {
- return FALSE;
- }
-
- planet_orb = fmin(antiscion_data->planet1->planet_info->orb, antiscion_data->planet2->planet_info->orb);
- start_point = (antiscion_axis_info->start_sign->sign - 1) * 30.0;
-
- start_point += antiscion_axis_info->sign_offset;
-
- axis_position = 2 * start_point - antiscion_data->planet1->position;
-
- if (axis_position < 0) {
- axis_position += 360.0;
- }
-
- if ((antiscion_data->difference = fabs(antiscion_data->planet2->position - axis_position)) <= planet_orb) {
- antiscion_data->antiscion_axis_info = antiscion_axis_info;
-
- return TRUE;
- } else {
- antiscion_data->difference = 0.0;
- }
-
- return FALSE;
-}
-
static gint
find_antiscion_by_both_planets(GsweAntiscionData *antiscion, struct GsweAspectFinder *antiscion_finder)
{
@@ -1180,8 +1146,9 @@ gswe_moment_calculate_antiscia(GsweMoment *moment)
for (iplanet = moment->priv->planet_list; iplanet; iplanet = iplanet->next) {
GswePlanetData *outer_planet = oplanet->data,
*inner_planet = iplanet->data;
- GsweAntiscionData *antiscion_data;
struct GsweAspectFinder antiscion_finder;
+ GsweAntiscionData *antiscion_data;
+ GList *antiscion_data_element;
if (outer_planet->planet_info->planet == inner_planet->planet_info->planet) {
continue;
@@ -1190,22 +1157,12 @@ gswe_moment_calculate_antiscia(GsweMoment *moment)
antiscion_finder.planet1 = outer_planet->planet_info->planet;
antiscion_finder.planet2 = inner_planet->planet_info->planet;
- if (g_list_find_custom(moment->priv->antiscia_list, &antiscion_finder, (GCompareFunc)find_antiscion_by_both_planets) != NULL) {
- continue;
+ if ((antiscion_data_element = g_list_find_custom(moment->priv->antiscia_list, &antiscion_finder, (GCompareFunc)find_antiscion_by_both_planets)) != NULL) {
+ gswe_antiscion_data_calculate(antiscion_data_element->data);
+ } else {
+ antiscion_data = gswe_antiscion_data_new_with_planets(inner_planet, outer_planet);
+ moment->priv->antiscia_list = g_list_prepend(moment->priv->antiscia_list, antiscion_data);
}
-
- antiscion_data = gswe_antiscion_data_new();
- antiscion_data->planet1 = outer_planet;
- antiscion_data->planet2 = inner_planet;
- antiscion_data->antiscion_axis_info = NULL;
-
- (void)g_hash_table_find(gswe_antiscion_axis_info_table, (GHRFunc)find_antiscion, antiscion_data);
-
- if (antiscion_data->antiscion_axis_info == NULL) {
- antiscion_data->antiscion_axis_info = g_hash_table_lookup(gswe_antiscion_axis_info_table, GINT_TO_POINTER(GSWE_ANTISCION_AXIS_NONE));
- }
-
- moment->priv->antiscia_list = g_list_prepend(moment->priv->antiscia_list, antiscion_data);
}
}