(split from Astrognome)Outsourced house cusp position calculations to SWE-GLib.
This commit is contained in:
parent
1c2282324e
commit
dbdb9e90f8
@ -1,11 +1,28 @@
|
|||||||
#include <math.h>
|
#include "swe-glib.h"
|
||||||
|
#include "gswe-types.h"
|
||||||
#include "gswe-moment.h"
|
#include "gswe-moment.h"
|
||||||
|
|
||||||
|
#include "../../swe/src/swephexp.h"
|
||||||
|
|
||||||
#define GSWE_MOMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GSWE_TYPE_MOMENT, GsweMomentPrivate))
|
#define GSWE_MOMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GSWE_TYPE_MOMENT, GsweMomentPrivate))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GsweMomentPrivate:
|
||||||
|
* @timestamp: a #GsweTimestmp object representing the current local time at
|
||||||
|
* the given position specified by @coordinates. Be warned though,
|
||||||
|
* that the time zone is NOT checked against the coordinates!
|
||||||
|
* @coordinates: the coordinates of the observers position
|
||||||
|
* @revision: an internal counter which is incremented whenever the timestamp
|
||||||
|
* or the coordinates change. Planetary positions are recalculated
|
||||||
|
* if this number changes
|
||||||
|
*/
|
||||||
struct _GsweMomentPrivate {
|
struct _GsweMomentPrivate {
|
||||||
GsweTimestamp *timestamp;
|
GsweTimestamp *timestamp;
|
||||||
GsweCoordinates coordinates;
|
GsweCoordinates coordinates;
|
||||||
|
GsweHouseSystem house_system;
|
||||||
|
guint revision;
|
||||||
|
GList *house_list;
|
||||||
|
guint house_revision;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -67,6 +84,9 @@ gswe_moment_init(GsweMoment *moment)
|
|||||||
moment->priv = GSWE_MOMENT_GET_PRIVATE(moment);
|
moment->priv = GSWE_MOMENT_GET_PRIVATE(moment);
|
||||||
|
|
||||||
moment->priv->timestamp = NULL;
|
moment->priv->timestamp = NULL;
|
||||||
|
moment->priv->house_list = NULL;
|
||||||
|
moment->priv->planet_list = NULL;
|
||||||
|
moment->priv->revision = 1;
|
||||||
|
|
||||||
//moment->priv->a_string = g_strdup("Maman");
|
//moment->priv->a_string = g_strdup("Maman");
|
||||||
}
|
}
|
||||||
@ -74,6 +94,8 @@ gswe_moment_init(GsweMoment *moment)
|
|||||||
static void
|
static void
|
||||||
gswe_moment_timestamp_changed(GsweMoment *moment, gpointer data)
|
gswe_moment_timestamp_changed(GsweMoment *moment, gpointer data)
|
||||||
{
|
{
|
||||||
|
moment->priv->revision++;
|
||||||
|
gswe_moment_emit_changed(moment);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -91,9 +113,9 @@ gswe_moment_dispose(GObject *gobject)
|
|||||||
static void
|
static void
|
||||||
gswe_moment_finalize(GObject *gobject)
|
gswe_moment_finalize(GObject *gobject)
|
||||||
{
|
{
|
||||||
//GsweMoment *moment = GSWE_MOMENT(gobject);
|
GsweMoment *moment = GSWE_MOMENT(gobject);
|
||||||
|
|
||||||
//g_free(moment->priv->a_string);
|
g_list_free_full(moment->priv->house_list, g_free);
|
||||||
|
|
||||||
G_OBJECT_CLASS(gswe_moment_parent_class)->finalize(gobject);
|
G_OBJECT_CLASS(gswe_moment_parent_class)->finalize(gobject);
|
||||||
}
|
}
|
||||||
@ -175,3 +197,56 @@ gswe_moment_new(void)
|
|||||||
return (GsweMoment *)g_object_new(GSWE_TYPE_MOMENT, NULL);
|
return (GsweMoment *)g_object_new(GSWE_TYPE_MOMENT, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GsweMoment *
|
||||||
|
gswe_moment_new_full(GsweTimestamp *timestamp, gdouble longitude, gdouble latitude, gdouble altitude, GsweHouseSystem house_system)
|
||||||
|
{
|
||||||
|
GsweMoment *moment = gswe_moment_new();
|
||||||
|
|
||||||
|
moment->priv->timestamp = timestamp;
|
||||||
|
g_object_ref(timestamp);
|
||||||
|
g_signal_connect(G_OBJECT(timestamp), "changed", G_CALLBACK(gswe_moment_timestamp_changed), NULL);
|
||||||
|
moment->priv->coordinates.longitude = longitude;
|
||||||
|
moment->priv->coordinates.latitude = latitude;
|
||||||
|
moment->priv->coordinates.altitude = altitude;
|
||||||
|
moment->priv->house_system = house_system;
|
||||||
|
|
||||||
|
return moment;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gswe_moment_calculate_house_positions(GsweMoment *moment)
|
||||||
|
{
|
||||||
|
gdouble cusps[13],
|
||||||
|
ascmc[10];
|
||||||
|
gint i;
|
||||||
|
GsweHouseSystemInfo *house_system_data;
|
||||||
|
|
||||||
|
if ((house_system_data = g_hash_table_lookup(gswe_house_system_info_table, GINT_TO_POINTER(moment->priv->house_system))) == NULL) {
|
||||||
|
g_error("Unknown house system!");
|
||||||
|
}
|
||||||
|
|
||||||
|
swe_houses(gswe_timestamp_get_julian_day(moment->priv->timestamp), moment->priv->coordinates.latitude, moment->priv->coordinates.longitude, house_system_data->sweph_id, cusps, ascmc);
|
||||||
|
|
||||||
|
g_list_free_full(moment->priv->house_list, g_free);
|
||||||
|
moment->priv->house_list = NULL;
|
||||||
|
|
||||||
|
for (i = 12; i >= 1; i--) {
|
||||||
|
gdouble *cusp = g_new0(gdouble, 1);
|
||||||
|
|
||||||
|
*cusp = cusps[i];
|
||||||
|
moment->priv->house_list = g_list_prepend(moment->priv->house_list, cusp);
|
||||||
|
}
|
||||||
|
|
||||||
|
moment->priv->house_revision = moment->priv->revision;
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *
|
||||||
|
gswe_moment_get_house_cusps(GsweMoment *moment)
|
||||||
|
{
|
||||||
|
if (moment->priv->house_revision != moment->priv->revision) {
|
||||||
|
gswe_moment_calculate_house_positions(moment);
|
||||||
|
}
|
||||||
|
|
||||||
|
return moment->priv->house_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -31,12 +31,14 @@ GQuark gswe_moment_error_quark(void);
|
|||||||
* GsweCoordinates:
|
* GsweCoordinates:
|
||||||
* @longitude: longitude part of the coordinates
|
* @longitude: longitude part of the coordinates
|
||||||
* @latitude: latitude part of the coordinates
|
* @latitude: latitude part of the coordinates
|
||||||
|
* @altitude: altitude relative to sea level
|
||||||
*
|
*
|
||||||
* GsweCoordinates specifies an exact point on Earth's surface
|
* GsweCoordinates specifies an exact point on Earth's surface
|
||||||
*/
|
*/
|
||||||
typedef struct _GsweCoordinates {
|
typedef struct _GsweCoordinates {
|
||||||
gdouble longitude;
|
gdouble longitude;
|
||||||
gdouble latitude;
|
gdouble latitude;
|
||||||
|
gdouble altitude;
|
||||||
} GsweCoordinates;
|
} GsweCoordinates;
|
||||||
|
|
||||||
struct _GsweMoment {
|
struct _GsweMoment {
|
||||||
@ -64,7 +66,9 @@ GType gswe_moment_get_type(void);
|
|||||||
|
|
||||||
/* Method definitions */
|
/* Method definitions */
|
||||||
GsweMoment *gswe_moment_new(void);
|
GsweMoment *gswe_moment_new(void);
|
||||||
|
GsweMoment *gswe_moment_new_full(GsweTimestamp *timestamp, gdouble longitude, gdouble latitude, gdouble altitude, GsweHouseSystem house_system);
|
||||||
void gswe_moment_set_timestamp(GsweMoment *moment, GsweTimestamp *timestamp);
|
void gswe_moment_set_timestamp(GsweMoment *moment, GsweTimestamp *timestamp);
|
||||||
|
GList *gswe_moment_get_house_cusps(GsweMoment *moment);
|
||||||
|
|
||||||
#endif /* __GSWE_MOMENT_H__ */
|
#endif /* __GSWE_MOMENT_H__ */
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef __SWE_GLIB_GSWE_PLANETS_H__
|
#ifndef __SWE_GLIB_GSWE_PLANETS_H__
|
||||||
#define __SWE_GLIB_GSWE_PLANETS_H__
|
#define __SWE_GLIB_GSWE_PLANETS_H__
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GSWE_PLANET_NONE,
|
GSWE_PLANET_NONE,
|
||||||
GSWE_PLANET_SUN,
|
GSWE_PLANET_SUN,
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "gswe-types.h"
|
#include "gswe-types.h"
|
||||||
#include "gswe-timestamp.h"
|
#include "gswe-timestamp.h"
|
||||||
|
#include "gswe-moment.h"
|
||||||
|
|
||||||
extern GHashTable *gswe_planet_info_table;
|
extern GHashTable *gswe_planet_info_table;
|
||||||
|
extern GHashTable *gswe_house_system_info_table;
|
||||||
|
|
||||||
void gswe_init(gchar *sweph_path);
|
void gswe_init(gchar *sweph_path);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user