Added mirrorpoint calculation with several axes
This commit is contained in:
		| @@ -75,6 +75,12 @@ typedef struct { | ||||
|     gboolean major; | ||||
| } aspectData_t; | ||||
|  | ||||
| typedef struct { | ||||
|     gchar *name; | ||||
|     zodiacSign startSign; | ||||
|     gboolean middleAxis; | ||||
| } mirrorpointData_t; | ||||
|  | ||||
| const aspectData_t aspectData[] = { | ||||
|     // Name            Size Orb  Harmonic Major | ||||
|     { "Conjuction",    0,   0,   TRUE,    TRUE  }, | ||||
| @@ -90,6 +96,13 @@ const aspectData_t aspectData[] = { | ||||
|     { "Bi-quintile",   144, 3,   TRUE,    FALSE } | ||||
| }; | ||||
|  | ||||
| const mirrorpointData_t mirrorpointData[] = { | ||||
|     { "Aries/Libra",        SIGN_ARIES,  FALSE }, | ||||
|     { "mid Taurus/Scoripo", SIGN_TAURUS, TRUE  }, | ||||
|     { "Cancer/Capricorn",   SIGN_CANCER, FALSE }, | ||||
|     { "mid Leo/Aquarius",   SIGN_LEO,    TRUE  }, | ||||
| }; | ||||
|  | ||||
| #define ADD_SIGN(ht, v, s, e, t) (v) = g_new0(signData_t, 1); \ | ||||
|                                  (v)->signId = (s); \ | ||||
|                                  (v)->element = (e); \ | ||||
| @@ -211,6 +224,82 @@ check_aspects_outer_loop(gpointer data, gpointer user_data) | ||||
|     checkData->currentOuterPlanetId++; | ||||
| } | ||||
|  | ||||
| void | ||||
| check_mirrorpoints_inner_loop(gpointer data, gpointer user_data) | ||||
| { | ||||
|     struct aspect_check_data *checkData = user_data; | ||||
|     gint outerPlanetId = GPOINTER_TO_INT(g_list_nth_data(checkData->planetIdList, checkData->currentOuterPlanetId)); | ||||
|     gint innerPlanetId = GPOINTER_TO_INT(g_list_nth_data(checkData->planetIdList, checkData->currentInnerPlanetId)); | ||||
|     planetInfo_t *outerPlanet, | ||||
|                  *innerPlanet; | ||||
|     planetData_t *outerPlanetData, | ||||
|                  *innerPlanetData; | ||||
|     gdouble planetOrb, | ||||
|             difference; | ||||
|     gint i; | ||||
|     const mirrorpointData_t *mirrorpoint = NULL; | ||||
|  | ||||
|     if (outerPlanetId == innerPlanetId) { | ||||
|         checkData->currentInnerPlanetId++; | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     outerPlanet = g_hash_table_lookup(checkData->planetInfoTable, GINT_TO_POINTER(outerPlanetId)); | ||||
|     innerPlanet = g_hash_table_lookup(checkData->planetInfoTable, GINT_TO_POINTER(innerPlanetId)); | ||||
|  | ||||
|     g_assert(outerPlanet != NULL); | ||||
|     g_assert(innerPlanet != NULL); | ||||
|  | ||||
|     outerPlanetData = g_hash_table_lookup(checkData->planetDataTable, GINT_TO_POINTER(outerPlanetId)); | ||||
|     innerPlanetData = g_hash_table_lookup(checkData->planetDataTable, GINT_TO_POINTER(innerPlanetId)); | ||||
|  | ||||
|     g_assert(outerPlanetData != NULL); | ||||
|     g_assert(innerPlanetData != NULL); | ||||
|  | ||||
|     planetOrb = fmin(outerPlanetData->orb, innerPlanetData->orb); | ||||
|  | ||||
|     for (i = 0; i < sizeof(mirrorpointData) / sizeof(mirrorpointData_t); i++) { | ||||
|         gdouble mirrorPosition; | ||||
|         gdouble startPoint = (mirrorpointData[i].startSign - 1) * 30; | ||||
|  | ||||
|         if (mirrorpointData[i].middleAxis == TRUE) { | ||||
|             startPoint += 15.0; | ||||
|         } | ||||
|  | ||||
|         mirrorPosition = 2 * startPoint - outerPlanet->position; | ||||
|  | ||||
|         if (mirrorPosition < 0) { | ||||
|             mirrorPosition += 360.0; | ||||
|         } | ||||
|  | ||||
|         if ((difference = fabs(innerPlanet->position - mirrorPosition)) <= planetOrb) { | ||||
|             mirrorpoint = &(mirrorpointData[i]); | ||||
|  | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (mirrorpoint != NULL) { | ||||
|         printf("%s vs. %s: %s (±%f)\n", outerPlanetData->name, innerPlanetData->name, mirrorpoint->name, difference); | ||||
|     } | ||||
|  | ||||
|     checkData->currentInnerPlanetId++; | ||||
| } | ||||
|  | ||||
| void | ||||
| check_mirrorpoints_outer_loop(gpointer data, gpointer user_data) | ||||
| { | ||||
|     struct aspect_check_data *checkData = user_data; | ||||
|  | ||||
|     checkData->currentInnerPlanetId = checkData->currentOuterPlanetId; | ||||
|     printf("\n"); | ||||
|  | ||||
|     g_list_foreach(g_list_nth(checkData->planetIdList, checkData->currentOuterPlanetId), check_mirrorpoints_inner_loop, user_data); | ||||
|  | ||||
|     checkData->currentOuterPlanetId++; | ||||
| } | ||||
|  | ||||
| void | ||||
| free_planet_data(gpointer data) | ||||
| { | ||||
| @@ -449,6 +538,12 @@ main(int argc, char *argv[]) | ||||
|     aspectCheckData.planetInfoTable = planetInfoTable; | ||||
|     aspectCheckData.planetDataTable = planetDataTable; | ||||
|     g_list_foreach(planetIdList, check_aspects_outer_loop, &aspectCheckData); | ||||
|  | ||||
|     aspectCheckData.planetIdList = planetIdList; | ||||
|     aspectCheckData.currentOuterPlanetId = 0; | ||||
|     aspectCheckData.planetInfoTable = planetInfoTable; | ||||
|     aspectCheckData.planetDataTable = planetDataTable; | ||||
|     g_list_foreach(planetIdList, check_mirrorpoints_outer_loop, &aspectCheckData); | ||||
|     g_list_free(planetIdList); | ||||
|  | ||||
|     g_hash_table_unref(planetInfoTable); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user