/**
* SwissHelper.java
* Created On 2006, Feb 22, 2006 3:43:29 PM
* @author E. Rajasekar
*/
package app.astrosoft.util;
import java.util.EnumMap;
import java.util.Map;
import java.util.Set;
import app.astrosoft.beans.HousePosition;
import app.astrosoft.consts.AstroConsts;
import app.astrosoft.consts.AstrosoftTableColumn;
import app.astrosoft.consts.Ayanamsa;
import app.astrosoft.consts.Planet;
import app.astrosoft.consts.Rasi;
import app.astrosoft.core.Ephemeris.EphData;
import app.astrosoft.ui.AstroSoft;
import swisseph.DblObj;
import swisseph.SweConst;
import swisseph.SweDate;
import swisseph.SwissEph;
public class SwissHelper {
public static final int HOUSE_SYSTEM = (int)'P';
public static final int HOUSE_FLAG = SweConst.SEFLG_SIDEREAL;
private SwissEph sw;
private SweDate sweDate;
private EnumMap<Planet, Double> planetPos;
private EnumMap<Planet, Boolean> isReverse;
public SwissHelper(SweDate sweDate) {
this();
this.sweDate = sweDate;
}
/**
*
* @param year
* @param month
* @param date
* @param birthTime - Should be in GMT
*/
public SwissHelper(int year, int month, int date, double birthTime) {
this(new SweDate(year, month, date, birthTime));
}
public SwissHelper() {
sw = new SwissEph();
sw.swe_set_sid_mode(AstroSoft.getPreferences().getAyanamsa().ayaValue(), 0.0, 0.0);
}
public void setSweDate(SweDate sweDate) {
this.sweDate = sweDate;
calcPlanetaryPosition();
}
public void setAyanamsa(Ayanamsa ayanamsa) {
sw.swe_set_sid_mode(ayanamsa.ayaValue(), 0.0, 0.0);
calcPlanetaryPosition();
}
public void calcPlanetaryPosition() {
calcPlanetaryPosition(Planet.allPlanets());
}
public void calcPlanetaryPosition(Set<Planet> planets){
planetPos = new EnumMap<Planet, Double>(Planet.class);
isReverse = new EnumMap<Planet, Boolean>(Planet.class);
double[] res = new double[6];
StringBuffer sbErr = new StringBuffer();
for (Planet planet : planets) {
int rc = sw.swe_calc_ut(sweDate.getJulDay(), planet.planetNo(),
AstroConsts.iflag, res, sbErr);
planetPos.put(planet, res[0]);
if ((res[3] < 0) && (!Planet.isNode(planet))) {
isReverse.put(planet, true);
}
}
// No-way to compute ketu pos from swisseph
Double rahuPos = planetPos.get(Planet.Rahu);
if (rahuPos != null) {
double ketuPos = ( rahuPos + 180.00) % 360;
planetPos.put(Planet.Ketu, ketuPos);
}
//System.out.println(sbErr);
}
public HousePosition calcHousePosition(double birthLong, double birthLat) {
double[] ac = new double[10];
double[] positions = new double[13];
sw.swe_houses(sweDate.getJulDay(), HOUSE_FLAG, birthLat, birthLong, HOUSE_SYSTEM,
positions, ac);
//System.out.println()
HousePosition housePosition = new HousePosition(positions);
housePosition.setSiderealTime((double) (ac[2] / 15));
return housePosition;
}
public Rasi getAscendant(double birthLong, double birthLat){
double[] ac = new double[10];
double[] positions = new double[13];
sw.swe_houses(sweDate.getJulDay(), HOUSE_FLAG, birthLat, birthLong, HOUSE_SYSTEM,
positions, ac);
return Rasi.ofDeg(positions[1]);
}
public double getPlanetSpeed(Planet planet){
double[] res = new double[6];
StringBuffer sbErr = new StringBuffer();
sw.swe_calc_ut(sweDate.getJulDay(), planet.planetNo(), AstroConsts.iflag, res, sbErr);
return res[3];
}
public double getAyanamsa(){
return sw.swe_get_ayanamsa_ut(sweDate.getJulDay());
}
public EnumMap<Planet, Double> getPlanetaryPosition() {
if(planetPos == null){
calcPlanetaryPosition();
}
return planetPos;
}
public EnumMap<Planet, Boolean> getPlanetDirection() {
if(isReverse == null){
calcPlanetaryPosition();
}
return isReverse;
}
public EnumMap<Planet, Double> getPlanetaryPosition(Set<Planet> planets) {
if(planetPos == null){
calcPlanetaryPosition(planets);
}
return planetPos;
}
public EnumMap<Planet, EphData> getEphData(){
calcPlanetaryPosition();
EnumMap<Planet, EphData> planetEphData = new EnumMap<Planet, EphData>(Planet.class);
for(Planet planet : planetPos.keySet()){
EphData ephData = new EphData(planetPos.get(planet), isReverse.get(planet));
planetEphData.put(planet, ephData);
}
return planetEphData;
}
public SweDate getSweDate() {
return sweDate;
}
public static double calcNatonnataBalaDeg(SweDate birthSD, double birthTime) {
SwissEph sw = new SwissEph( );
//sw.swe_set_ephe_path("d\\:\\\\AstroSoft");
double et = birthSD.getJulDay( ) + birthSD.getDeltaT( );
DblObj E = new DblObj( );
StringBuffer sbErr = new StringBuffer( );
int diff = sw.swe_time_equ( et, E, sbErr );
double EqnOfTime = E.val * 24 * -1;
double bTimeDeg = ( birthTime + EqnOfTime ) * 15;
if ( bTimeDeg > 180 ) {
bTimeDeg = 360 - bTimeDeg;
}
return bTimeDeg;
}
public TransitHelper getTransitHelper(Planet planet){
return new TransitHelper(planet, sw);
}
public static void main(String[] args) {
SwissHelper sh = new SwissHelper(1980, 12, 11, (1 + (44.00 / 60.00) - 5.5));
//SwissHelper sh = new SwissHelper(1960, 8, 10, (5 + (30.00 / 60.00) - 5.5));
System.out.println(sh.getPlanetaryPosition());
HousePosition housePos = sh.calcHousePosition(77 + (44.00 / 60.00), 11 + (22.00 / 60.00));
System.out.println(housePos);
for(Map.Entry<Planet, Double> e : sh.planetPos.entrySet()){
System.out.println(e.getKey() + " -> " + housePos.locateHouse(e.getValue()));
}
System.out.println(Utils.sortMap(sh.getPlanetaryPosition().entrySet(), true));
}
}