astrochart-modified
Version:
A free and open-source JavaScript library for generating SVG charts to display planets in astrology.
375 lines (282 loc) • 9.68 kB
JavaScript
// ## Zodiac ###################################
const zodiac = function (astrology) {
// Zodiac
var SIGNS_ARIES = 1;
var SIGNS_TAURUS = 2;
var SIGNS_GEMINI = 3;
var SIGNS_CANCER = 4;
var SIGNS_LEO = 5;
var SIGNS_VIRGO = 6;
var SIGNS_LIBRA = 7;
var SIGNS_SCORPIO = 8;
var SIGNS_SAGITTARIUS = 9;
var SIGNS_CAPRICORN = 10;
var SIGNS_AQUARIUS = 11;
var SIGNS_PISCES = 12;
/**
* Zodiac
*
* Gives the position of points in the zodiac.
* Position of point in the zodiac.
* Position of point in houses.
* Dignities of planets.
*
* @class
* @public
* @constructor
* @param {Array} cusps - cusprs in zodiac; [296, 350, 30, 56, 75, 94, 116, 170, 210, 236, 255, 274]
* @param {Object | null } settings
*/
astrology.Zodiac = function (cusps, settings) {
if (cusps == null) {
throw new Error('Param \'cusps\' must not be empty.');
}
if (!(Array.isArray(cusps) && cusps.length == 12)) {
throw new Error('Param \'cusps\' is not 12 length Array.');
}
this.cusps = cusps;
this.settings = settings || {};
return this;
};
/**
* Get astrological sign
* 1 - Arise, ... , 12 - Pisces
*
* @param {double} point - angle of point in circle
* @return { \[1-9] | 1[0-2]\ }
*/
astrology.Zodiac.prototype.getSign = function (point) {
var angle = point % astrology.utils.radiansToDegree(2 * Math.PI);
return Math.floor((angle / 30) + 1);
};
/**
* Is retrograde
*
* @param {double} speed
* @return {boolean}
*/
astrology.Zodiac.prototype.isRetrograde = function (speed) {
return speed < 0;
};
/**
* Get house number
* 1 - 12
*
* @param {double} point - angle of point in circle
* @return { \[1-9] | 1[0-2]\ }
*/
astrology.Zodiac.prototype.getHouseNumber = function (point) {
var angle = point % astrology.utils.radiansToDegree(2 * Math.PI);
for (var i = 0, ln = this.cusps.length; i < ln; i++) {
if (angle >= this.cusps[i] && angle < this.cusps[(i % (ln - 1)) + 1]) {
return i + 1;
}
}
// cusp passes over zero
for (var i = 0, ln = this.cusps.length; i < ln; i++) {
if (this.cusps[i] > this.cusps[(i % (ln - 1)) + 1]) {
return i + 1;
}
}
throw new Error('Oops, serious error in the method: \'astrology.Zodiac.getHouseNumber\'.');
};
/**
* Calculate dignities of planet
*
* r - Rulership
* d - Detriment
* e - Exaltation
* E - Exalatation - Exact exaltation
* f - Fall
*
* @param {Object} planet, { name:"Sun", position:60.2 }
* @param {Array<Object> | null } exactExaltation - list of named angles, [{ name:"Sun", position:278, orbit:2 }, { name:"Moon", position:3, , orbit:2 }]
* @return {Array<String>}
*/
astrology.Zodiac.prototype.getDignities = function (planet, exactExaltation) {
if (!(planet && planet.name && planet.position != null)) {
return [];
}
var result = [];
var sign = this.getSign(planet.position);
var position = planet.position % astrology.utils.radiansToDegree(2 * Math.PI);
switch (planet.name) {
case astrology.SYMBOL_SUN:
if (sign == SIGNS_LEO) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_AQUARIUS) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_ARIES) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_VIRGO) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_MOON:
if (sign == SIGNS_CANCER) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_CAPRICORN) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_TAURUS) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_SCORPIO) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_MERCURY:
if (sign == SIGNS_GEMINI) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_SAGITTARIUS) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_VIRGO) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_PISCES) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_VENUS:
if (sign == SIGNS_TAURUS || sign == SIGNS_LIBRA) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_ARIES || sign == SIGNS_SCORPIO) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_PISCES) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_VIRGO) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_MARS:
if (sign == SIGNS_ARIES || sign == SIGNS_SCORPIO) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_TAURUS || sign == SIGNS_LIBRA) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_CAPRICORN) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_CANCER) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_JUPITER:
if (sign == SIGNS_SAGITTARIUS || sign == SIGNS_PISCES) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_GEMINI || sign == SIGNS_VIRGO) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_CANCER) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_CAPRICORN) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_SATURN:
if (sign == SIGNS_CAPRICORN || sign == SIGNS_AQUARIUS) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_CANCER || sign == SIGNS_LEO) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_LIBRA) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_ARIES) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_URANUS:
if (sign == SIGNS_AQUARIUS) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_LEO) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_SCORPIO) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_TAURUS) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_NEPTUNE:
if (sign == SIGNS_PISCES) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_VIRGO) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_LEO || sign == SIGNS_SAGITTARIUS) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_AQUARIUS || sign == SIGNS_GEMINI) {
result.push(astrology.DIGNITIES_FALL);
}
break;
case astrology.SYMBOL_PLUTO:
if (sign == SIGNS_SCORPIO) {
result.push(astrology.DIGNITIES_RULERSHIP);
} else if (sign == SIGNS_TAURUS) {
result.push(astrology.DIGNITIES_DETRIMENT);
}
if (sign == SIGNS_ARIES) {
result.push(astrology.DIGNITIES_EXALTATION);
} else if (sign == SIGNS_LIBRA) {
result.push(astrology.DIGNITIES_FALL);
}
break;
default:
break;
}
if (exactExaltation != null && Array.isArray(exactExaltation)) {
for (var i = 0, ln = exactExaltation.length; i < ln; i++) {
if (planet.name == exactExaltation[i].name) {
if (hasConjunction(planet.position, exactExaltation[i].position, exactExaltation[i].orbit)) {
result.push(astrology.DIGNITIES_EXACT_EXALTATION);
}
}
}
}
return result;
};
/*
* To hours:minutes:seconds
* @param {Double} d
* @return {String}
*/
astrology.Zodiac.prototype.toDMS = function (d) {
d += 0.5 / 3600. / 10000.; // round to 1/1000 of a second
var deg = parseInt(d);
d = (d - deg) * 60;
var min = parseInt(d);
d = (d - min) * 60;
var sec = parseInt(d);
return deg + '° ' + min + '\' ' + sec;
};
/*
* Has conjunction with point
*
* @private
*
* @param {Double} planetPosition
* @param {Double} poitPosition
* @param {Integer} orbit
* @return {boolean}
*/
function hasConjunction(planetPosition, pointPosition, orbit) {
var result = false;
var minOrbit = (pointPosition - orbit / 2) < 0 ?
astrology.utils.radiansToDegree(2 * Math.PI) - (pointPosition - orbit / 2) :
pointPosition - orbit / 2;
var maxOrbit = (pointPosition + orbit / 2) >= astrology.utils.radiansToDegree(2 * Math.PI) ?
(pointPosition + orbit / 2) - astrology.utils.radiansToDegree(2 * Math.PI) :
(pointPosition + orbit / 2);
if (minOrbit > maxOrbit) { //crossing over zero
if (minOrbit >= planetPosition && planetPosition <= minOrbit) {
result = true;
}
} else {
if (minOrbit <= planetPosition && planetPosition <= maxOrbit) {
result = true;
}
}
return result;
};
};
module.exports = zodiac;