|
|
|
@ -35,7 +35,12 @@
|
|
|
|
|
* between two planets, based on a specified axis.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
G_DEFINE_BOXED_TYPE(GsweAntiscionData, gswe_antiscion_data, (GBoxedCopyFunc)gswe_antiscion_data_ref, (GBoxedFreeFunc)gswe_antiscion_data_unref);
|
|
|
|
|
G_DEFINE_BOXED_TYPE(
|
|
|
|
|
GsweAntiscionData,
|
|
|
|
|
gswe_antiscion_data,
|
|
|
|
|
(GBoxedCopyFunc)gswe_antiscion_data_ref,
|
|
|
|
|
(GBoxedFreeFunc)gswe_antiscion_data_unref
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gswe_antiscion_data_free(GsweAntiscionData *antiscion_data)
|
|
|
|
@ -74,15 +79,20 @@ gswe_antiscion_data_new(void)
|
|
|
|
|
/*
|
|
|
|
|
* find_antiscion:
|
|
|
|
|
* @axis_p: a pointer made with GINT_TO_POINTER(), holding the antiscion axis ID
|
|
|
|
|
* @antiscion_axis_info: a GsweAntiscionAxisInfo, which will be checked against @antiscion_data
|
|
|
|
|
* @antiscion_data: a GsweAntiscionData, whose planets' positions will be checked against @antiscion_axis_info
|
|
|
|
|
* @antiscion_axis_info: a GsweAntiscionAxisInfo, which will be checked against
|
|
|
|
|
* @antiscion_data
|
|
|
|
|
* @antiscion_data: a GsweAntiscionData, whose planets' positions will be
|
|
|
|
|
* checked against @antiscion_axis_info
|
|
|
|
|
*
|
|
|
|
|
* This function is called internally by gswe_antiscion_data_calculate() to
|
|
|
|
|
* check if the two planets in @antiscion_data are antiscia of each other on
|
|
|
|
|
* the axis in @antiscion_axis_info
|
|
|
|
|
*/
|
|
|
|
|
static gboolean
|
|
|
|
|
find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, GsweAntiscionData *antiscion_data)
|
|
|
|
|
find_antiscion(
|
|
|
|
|
gpointer axis_p,
|
|
|
|
|
GsweAntiscionAxisInfo *antiscion_axis_info,
|
|
|
|
|
GsweAntiscionData *antiscion_data)
|
|
|
|
|
{
|
|
|
|
|
GsweAntiscionAxis axis;
|
|
|
|
|
gdouble start_point,
|
|
|
|
@ -93,7 +103,10 @@ find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, Gswe
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
planet_orb = fmin(antiscion_data->planet1->planet_info->orb, antiscion_data->planet2->planet_info->orb);
|
|
|
|
|
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;
|
|
|
|
@ -104,7 +117,9 @@ find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, Gswe
|
|
|
|
|
axis_position += 360.0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((antiscion_data->difference = fabs(antiscion_data->planet2->position - axis_position)) <= planet_orb) {
|
|
|
|
|
if ((antiscion_data->difference = fabs(
|
|
|
|
|
antiscion_data->planet2->position - axis_position
|
|
|
|
|
)) <= planet_orb) {
|
|
|
|
|
antiscion_data->antiscion_axis_info = antiscion_axis_info;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
@ -137,8 +152,17 @@ find_antiscion(gpointer axis_p, GsweAntiscionAxisInfo *antiscion_axis_info, Gswe
|
|
|
|
|
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 = gswe_antiscion_axis_info_ref(g_hash_table_lookup(gswe_antiscion_axis_info_table, GINT_TO_POINTER(GSWE_ANTISCION_AXIS_NONE)));
|
|
|
|
|
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 = gswe_antiscion_axis_info_ref(
|
|
|
|
|
g_hash_table_lookup(
|
|
|
|
|
gswe_antiscion_axis_info_table,
|
|
|
|
|
GINT_TO_POINTER(GSWE_ANTISCION_AXIS_NONE)
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
gswe_antiscion_axis_info_ref(antiscion_data->antiscion_axis_info);
|
|
|
|
|
}
|
|
|
|
@ -155,7 +179,9 @@ gswe_antiscion_data_calculate(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* Returns: (transfer full): a new #GsweAntiscionData
|
|
|
|
|
*/
|
|
|
|
|
GsweAntiscionData *
|
|
|
|
|
gswe_antiscion_data_new_with_planets(GswePlanetData *planet1, GswePlanetData *planet2)
|
|
|
|
|
gswe_antiscion_data_new_with_planets(
|
|
|
|
|
GswePlanetData *planet1,
|
|
|
|
|
GswePlanetData *planet2)
|
|
|
|
|
{
|
|
|
|
|
GsweAntiscionData *ret;
|
|
|
|
|
|
|
|
|
@ -188,7 +214,8 @@ gswe_antiscion_data_ref(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* gswe_antiscion_data_unref:
|
|
|
|
|
* @antiscion_data: (in): a #GsweAntiscionData
|
|
|
|
|
*
|
|
|
|
|
* Decreases reference count on @antiscion_data. If reference count reaches zero, @antiscion_data is freed.
|
|
|
|
|
* Decreases reference count on @antiscion_data. If reference count reaches
|
|
|
|
|
* zero, @antiscion_data is freed.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_unref(GsweAntiscionData *antiscion_data)
|
|
|
|
@ -206,7 +233,9 @@ gswe_antiscion_data_unref(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* Sets @planet1 as the first planet of the antiscion.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_set_planet1(GsweAntiscionData *antiscion_data, GswePlanetData *planet1)
|
|
|
|
|
gswe_antiscion_data_set_planet1(
|
|
|
|
|
GsweAntiscionData *antiscion_data,
|
|
|
|
|
GswePlanetData *planet1)
|
|
|
|
|
{
|
|
|
|
|
if (antiscion_data->planet1) {
|
|
|
|
|
gswe_planet_data_unref(antiscion_data->planet1);
|
|
|
|
@ -221,7 +250,8 @@ gswe_antiscion_data_set_planet1(GsweAntiscionData *antiscion_data, GswePlanetDat
|
|
|
|
|
*
|
|
|
|
|
* Gets the first in the antiscion relationship.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): The #GswePlanetData associated with the first planet.
|
|
|
|
|
* Returns: (transfer none): The #GswePlanetData associated with the first
|
|
|
|
|
* planet.
|
|
|
|
|
*/
|
|
|
|
|
GswePlanetData *
|
|
|
|
|
gswe_antiscion_data_get_planet1(GsweAntiscionData *antiscion_data)
|
|
|
|
@ -237,7 +267,9 @@ gswe_antiscion_data_get_planet1(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* Sets @planet2 as the second planet of the antiscion.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_set_planet2(GsweAntiscionData *antiscion_data, GswePlanetData *planet2)
|
|
|
|
|
gswe_antiscion_data_set_planet2(
|
|
|
|
|
GsweAntiscionData *antiscion_data,
|
|
|
|
|
GswePlanetData *planet2)
|
|
|
|
|
{
|
|
|
|
|
if (antiscion_data->planet2) {
|
|
|
|
|
gswe_planet_data_unref(antiscion_data->planet2);
|
|
|
|
@ -252,7 +284,8 @@ gswe_antiscion_data_set_planet2(GsweAntiscionData *antiscion_data, GswePlanetDat
|
|
|
|
|
*
|
|
|
|
|
* Gets the second in the antiscion relationship.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): The #GswePlanetData associated with the second planet.
|
|
|
|
|
* Returns: (transfer none): The #GswePlanetData associated with the second
|
|
|
|
|
* planet.
|
|
|
|
|
*/
|
|
|
|
|
GswePlanetData *
|
|
|
|
|
gswe_antiscion_data_get_planet2(GsweAntiscionData *antiscion_data)
|
|
|
|
@ -271,12 +304,22 @@ gswe_antiscion_data_get_planet2(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* the axis is not known.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_set_axis(GsweAntiscionData *antiscion_data, GsweAntiscionAxis axis, GError **err)
|
|
|
|
|
gswe_antiscion_data_set_axis(
|
|
|
|
|
GsweAntiscionData *antiscion_data,
|
|
|
|
|
GsweAntiscionAxis axis,
|
|
|
|
|
GError **err)
|
|
|
|
|
{
|
|
|
|
|
GsweAntiscionAxisInfo *antiscion_axis_info;
|
|
|
|
|
|
|
|
|
|
if ((antiscion_axis_info = g_hash_table_lookup(gswe_antiscion_axis_info_table, GINT_TO_POINTER(axis))) == NULL) {
|
|
|
|
|
g_set_error(err, GSWE_ERROR, GSWE_ERROR_UNKNOWN_ANTISCION_AXIS, "Unknown antiscion axis");
|
|
|
|
|
if ((antiscion_axis_info = g_hash_table_lookup(
|
|
|
|
|
gswe_antiscion_axis_info_table,
|
|
|
|
|
GINT_TO_POINTER(axis)
|
|
|
|
|
)) == NULL) {
|
|
|
|
|
g_set_error(
|
|
|
|
|
err,
|
|
|
|
|
GSWE_ERROR, GSWE_ERROR_UNKNOWN_ANTISCION_AXIS,
|
|
|
|
|
"Unknown antiscion axis"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -285,7 +328,9 @@ gswe_antiscion_data_set_axis(GsweAntiscionData *antiscion_data, GsweAntiscionAxi
|
|
|
|
|
gswe_antiscion_axis_info_unref(antiscion_data->antiscion_axis_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
antiscion_data->antiscion_axis_info = gswe_antiscion_axis_info_ref(antiscion_axis_info);
|
|
|
|
|
antiscion_data->antiscion_axis_info = gswe_antiscion_axis_info_ref(
|
|
|
|
|
antiscion_axis_info
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -314,13 +359,17 @@ gswe_antiscion_data_get_axis(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* Sets @antiscion_axis_info as the axis of this #GsweAntiscionData.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_set_antiscion_axis_info(GsweAntiscionData *antiscion_data, GsweAntiscionAxisInfo *antiscion_axis_info)
|
|
|
|
|
gswe_antiscion_data_set_antiscion_axis_info(
|
|
|
|
|
GsweAntiscionData *antiscion_data,
|
|
|
|
|
GsweAntiscionAxisInfo *antiscion_axis_info)
|
|
|
|
|
{
|
|
|
|
|
if (antiscion_data->antiscion_axis_info) {
|
|
|
|
|
gswe_antiscion_axis_info_unref(antiscion_data->antiscion_axis_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
antiscion_data->antiscion_axis_info = gswe_antiscion_axis_info_ref(antiscion_axis_info);
|
|
|
|
|
antiscion_data->antiscion_axis_info = gswe_antiscion_axis_info_ref(
|
|
|
|
|
antiscion_axis_info
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -329,7 +378,8 @@ gswe_antiscion_data_set_antiscion_axis_info(GsweAntiscionData *antiscion_data, G
|
|
|
|
|
*
|
|
|
|
|
* Gets the axis information related to the antiscion relationship's axis.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): the #GsweAntiscionAxisInfo associated with this axis
|
|
|
|
|
* Returns: (transfer none): the #GsweAntiscionAxisInfo associated with this
|
|
|
|
|
* axis
|
|
|
|
|
*/
|
|
|
|
|
GsweAntiscionAxisInfo *
|
|
|
|
|
gswe_antiscion_data_get_antiscion_axis_info(GsweAntiscionData *antiscion_data)
|
|
|
|
@ -345,7 +395,9 @@ gswe_antiscion_data_get_antiscion_axis_info(GsweAntiscionData *antiscion_data)
|
|
|
|
|
* Sets the difference of this antiscion from an exact antiscion.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gswe_antiscion_data_set_difference(GsweAntiscionData *antiscion_data, gdouble difference)
|
|
|
|
|
gswe_antiscion_data_set_difference(
|
|
|
|
|
GsweAntiscionData *antiscion_data,
|
|
|
|
|
gdouble difference)
|
|
|
|
|
{
|
|
|
|
|
antiscion_data->difference = difference;
|
|
|
|
|
}
|
|
|
|
@ -354,7 +406,8 @@ gswe_antiscion_data_set_difference(GsweAntiscionData *antiscion_data, gdouble di
|
|
|
|
|
* gswe_antiscion_data_get_difference:
|
|
|
|
|
* @antiscion_data: (in): a #GsweAntiscionData
|
|
|
|
|
*
|
|
|
|
|
* Gets the difference between an exact antiscion and this antiscion relationship.
|
|
|
|
|
* Gets the difference between an exact antiscion and this antiscion
|
|
|
|
|
* relationship.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the difference, in degrees
|
|
|
|
|
*/
|
|
|
|
|