@aigne/astrochart 1.11.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +33 -0
- package/assets/icons/ascendant.svg +3 -0
- package/assets/icons/jupiter.svg +3 -0
- package/assets/icons/mars.svg +10 -0
- package/assets/icons/mercury.svg +10 -0
- package/assets/icons/moon.svg +3 -0
- package/assets/icons/neptune.svg +10 -0
- package/assets/icons/saturn.svg +3 -0
- package/assets/icons/sun.svg +10 -0
- package/assets/icons/uranus.svg +3 -0
- package/assets/icons/venus.svg +10 -0
- package/dist/index.d.mts +574 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2643 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["default_settings","Timer","Zodiac","AspectCalculator","Animator","Zodiac","AspectCalculator","Transit","default_settings","SVG","Radix"],"sources":["../src/settings.ts","../src/utils.ts","../src/zodiac.ts","../src/aspect.ts","../src/animation/timer.ts","../src/animation/animator.ts","../src/transit.ts","../src/radix.ts","../src/svg.ts","../src/chart.ts"],"sourcesContent":["import type SVG from './svg.js'\n\nexport interface AspectData { degree: number; orbit: number; color: string }\nexport type Aspect = Record<string, AspectData>\nexport interface Dignity {\n name: string\n position: number\n orbit: number\n}\n\nexport interface Settings {\n SYMBOL_SCALE: number\n COLOR_BACKGROUND: string\n POINTS_COLOR: string\n POINTS_TEXT_SIZE: number\n POINTS_STROKE: number\n SIGNS_COLOR: string\n SIGNS_STROKE: number\n MARGIN: number\n PADDING: number\n ID_CHART: string\n ID_RADIX: string\n ID_TRANSIT: string\n ID_ASPECTS: string\n ID_POINTS: string\n ID_SIGNS: string\n ID_CIRCLES: string\n ID_AXIS: string\n ID_CUSPS: string\n ID_RULER: string\n ID_BG: string\n CIRCLE_COLOR: string\n CIRCLE_STRONG: number\n LINE_COLOR: string\n INDOOR_CIRCLE_RADIUS_RATIO: number\n INNER_CIRCLE_RADIUS_RATIO: number\n RULER_RADIUS: number\n SYMBOL_SUN: string\n SYMBOL_MOON: string\n SYMBOL_MERCURY: string\n SYMBOL_VENUS: string\n SYMBOL_MARS: string\n SYMBOL_JUPITER: string\n SYMBOL_SATURN: string\n SYMBOL_URANUS: string\n SYMBOL_NEPTUNE: string\n SYMBOL_PLUTO: string\n SYMBOL_CHIRON: string\n SYMBOL_LILITH: string\n SYMBOL_NNODE: string\n SYMBOL_SNODE: string\n SYMBOL_FORTUNE: string\n SYMBOL_AS: string\n SYMBOL_DS: string\n SYMBOL_MC: string\n SYMBOL_IC: string\n SYMBOL_AXIS_FONT_COLOR: string\n SYMBOL_AXIS_STROKE: number\n SYMBOL_CUSP_1: string\n SYMBOL_CUSP_2: string\n SYMBOL_CUSP_3: string\n SYMBOL_CUSP_4: string\n SYMBOL_CUSP_5: string\n SYMBOL_CUSP_6: string\n SYMBOL_CUSP_7: string\n SYMBOL_CUSP_8: string\n SYMBOL_CUSP_9: string\n SYMBOL_CUSP_10: string\n SYMBOL_CUSP_11: string\n SYMBOL_CUSP_12: string\n CUSPS_STROKE: number\n CUSPS_FONT_COLOR: string\n SYMBOL_ARIES: string\n SYMBOL_TAURUS: string\n SYMBOL_GEMINI: string\n SYMBOL_CANCER: string\n SYMBOL_LEO: string\n SYMBOL_VIRGO: string\n SYMBOL_LIBRA: string\n SYMBOL_SCORPIO: string\n SYMBOL_SAGITTARIUS: string\n SYMBOL_CAPRICORN: string\n SYMBOL_AQUARIUS: string\n SYMBOL_PISCES: string\n SYMBOL_SIGNS: string[]\n COLOR_ARIES: string\n COLOR_TAURUS: string\n COLOR_GEMINI: string\n COLOR_CANCER: string\n COLOR_LEO: string\n COLOR_VIRGO: string\n COLOR_LIBRA: string\n COLOR_SCORPIO: string\n COLOR_SAGITTARIUS: string\n COLOR_CAPRICORN: string\n COLOR_AQUARIUS: string\n COLOR_PISCES: string\n COLORS_SIGNS: string[]\n CUSTOM_SYMBOL_FN: null | ((name: string, x: number, y: number, context: SVG) => Element)\n SHIFT_IN_DEGREES: number\n STROKE_ONLY: boolean\n ADD_CLICK_AREA: boolean\n COLLISION_RADIUS: number\n ASPECTS: Aspect\n SHOW_DIGNITIES_TEXT: boolean\n DIGNITIES_RULERSHIP: string\n DIGNITIES_DETRIMENT: string\n DIGNITIES_EXALTATION: string\n DIGNITIES_EXACT_EXALTATION: string\n DIGNITIES_FALL: string\n DIGNITIES_EXACT_EXALTATION_DEFAULT: Dignity[]\n ANIMATION_CUSPS_ROTATION_SPEED: number\n DEBUG: boolean\n}\n\nconst settings: Settings = {\n\n // Scale of symbols\n SYMBOL_SCALE: 1,\n\n // BG color\n COLOR_BACKGROUND: '#fff',\n\n // Color of planet's symbols\n POINTS_COLOR: '#000',\n\n // Size of description text next to the planet: angle, retrograde, dignities, ...\n POINTS_TEXT_SIZE: 8,\n\n // Points strength of lines\n POINTS_STROKE: 1.8,\n\n // Font color of signs symbols\n SIGNS_COLOR: '#000',\n\n // Signs strength of lines\n SIGNS_STROKE: 1.5,\n\n // Chart margin\n MARGIN: 50, // px\n\n // Chart Padding\n PADDING: 18, // px\n\n // Module wrapper element ID\n ID_CHART: 'astrology',\n\n // Radix chart element ID\n ID_RADIX: 'radix',\n\n // Transit chart element ID\n ID_TRANSIT: 'transit',\n\n // Aspects wrapper element ID\n ID_ASPECTS: 'aspects',\n\n // Aspects wrapper element ID\n ID_POINTS: 'planets',\n\n // Signs wrapper element ID\n ID_SIGNS: 'signs',\n\n // Circles wrapper element ID\n ID_CIRCLES: 'circles',\n\n // Axis wrapper element ID\n ID_AXIS: 'axis',\n\n // Cusps wrapper element ID\n ID_CUSPS: 'cusps',\n\n // Cusps wrapper element ID\n ID_RULER: 'ruler',\n\n // Background wrapper element ID\n ID_BG: 'bg',\n\n // Color of circles in charts\n CIRCLE_COLOR: '#333',\n\n // Circles strength of lines\n CIRCLE_STRONG: 2,\n\n // Color of lines in charts\n LINE_COLOR: '#333',\n\n // radius / INDOOR_CIRCLE_RADIUS_RATIO\n INDOOR_CIRCLE_RADIUS_RATIO: 2,\n\n // radius - radius/INNER_CIRCLE_RADIUS_RATIO\n INNER_CIRCLE_RADIUS_RATIO: 8,\n\n // ( radius / INNER_CIRCLE_RADIUS_RATIO ) / RULER_RADIUS\n RULER_RADIUS: 4,\n\n // Points\n SYMBOL_SUN: 'Sun',\n SYMBOL_MOON: 'Moon',\n SYMBOL_MERCURY: 'Mercury',\n SYMBOL_VENUS: 'Venus',\n SYMBOL_MARS: 'Mars',\n SYMBOL_JUPITER: 'Jupiter',\n SYMBOL_SATURN: 'Saturn',\n SYMBOL_URANUS: 'Uranus',\n SYMBOL_NEPTUNE: 'Neptune',\n SYMBOL_PLUTO: 'Pluto',\n SYMBOL_CHIRON: 'Chiron',\n SYMBOL_LILITH: 'Lilith',\n SYMBOL_NNODE: 'NNode',\n SYMBOL_SNODE: 'SNode',\n SYMBOL_FORTUNE: 'Fortune',\n\n // Axis\n SYMBOL_AS: 'As',\n SYMBOL_DS: 'Ds',\n SYMBOL_MC: 'Mc',\n SYMBOL_IC: 'Ic',\n\n SYMBOL_AXIS_FONT_COLOR: '#333',\n SYMBOL_AXIS_STROKE: 1.6,\n\n // Cusps\n SYMBOL_CUSP_1: '1',\n SYMBOL_CUSP_2: '2',\n SYMBOL_CUSP_3: '3',\n SYMBOL_CUSP_4: '4',\n SYMBOL_CUSP_5: '5',\n SYMBOL_CUSP_6: '6',\n SYMBOL_CUSP_7: '7',\n SYMBOL_CUSP_8: '8',\n SYMBOL_CUSP_9: '9',\n SYMBOL_CUSP_10: '10',\n SYMBOL_CUSP_11: '11',\n SYMBOL_CUSP_12: '12',\n\n // Cusps strength of lines\n CUSPS_STROKE: 1,\n CUSPS_FONT_COLOR: '#000',\n\n // Signs\n SYMBOL_ARIES: 'Aries',\n SYMBOL_TAURUS: 'Taurus',\n SYMBOL_GEMINI: 'Gemini',\n SYMBOL_CANCER: 'Cancer',\n SYMBOL_LEO: 'Leo',\n SYMBOL_VIRGO: 'Virgo',\n SYMBOL_LIBRA: 'Libra',\n SYMBOL_SCORPIO: 'Scorpio',\n SYMBOL_SAGITTARIUS: 'Sagittarius',\n SYMBOL_CAPRICORN: 'Capricorn',\n SYMBOL_AQUARIUS: 'Aquarius',\n SYMBOL_PISCES: 'Pisces',\n SYMBOL_SIGNS: ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'],\n\n // http://www.rapidtables.com/web/color/html-color-codes.htm\n COLOR_ARIES: '#FF4500',\n COLOR_TAURUS: '#8B4513',\n COLOR_GEMINI: '#87CEEB',\n COLOR_CANCER: '#27AE60',\n COLOR_LEO: '#FF4500',\n COLOR_VIRGO: '#8B4513',\n COLOR_LIBRA: '#87CEEB',\n COLOR_SCORPIO: '#27AE60',\n COLOR_SAGITTARIUS: '#FF4500',\n COLOR_CAPRICORN: '#8B4513',\n COLOR_AQUARIUS: '#87CEEB',\n COLOR_PISCES: '#27AE60',\n COLORS_SIGNS: ['#FF4500', '#8B4513', '#87CEEB', '#27AE60', '#FF4500', '#8B4513', '#87CEEB', '#27AE60', '#FF4500', '#8B4513', '#87CEEB', '#27AE60'],\n\n CUSTOM_SYMBOL_FN: null,\n\n // 0 degree is on the West\n SHIFT_IN_DEGREES: 180,\n\n // No fill, only stroke\n STROKE_ONLY: false,\n\n ADD_CLICK_AREA: false,\n\n // Planets collision circle radius for SYMBOL_SCALE : 1\n // Scaling changes the collision radius\n COLLISION_RADIUS: 10, // px\n\n // Aspects\n ASPECTS: {\n conjunction: { degree: 0, orbit: 10, color: 'transparent' },\n square: { degree: 90, orbit: 8, color: '#FF4500' },\n trine: { degree: 120, orbit: 8, color: '#27AE60' },\n opposition: { degree: 180, orbit: 10, color: '#27AE60' }\n },\n\n // Dignities\n SHOW_DIGNITIES_TEXT: true,\n DIGNITIES_RULERSHIP: 'r',\n DIGNITIES_DETRIMENT: 'd',\n DIGNITIES_EXALTATION: 'e',\n DIGNITIES_EXACT_EXALTATION: 'E',\n DIGNITIES_FALL: 'f',\n\n // Source: Aleister Crowley\n DIGNITIES_EXACT_EXALTATION_DEFAULT: [\n { name: 'Sun', position: 19, orbit: 2 }, // 19 Arise\n { name: 'Moon', position: 33, orbit: 2 }, // 3 Taurus\n { name: 'Mercury', position: 155, orbit: 2 }, // 15 Virgo\n { name: 'Venus', position: 357, orbit: 2 }, // 27 Pisces\n { name: 'Mars', position: 298, orbit: 2 }, // 28 Capricorn\n { name: 'Jupiter', position: 105, orbit: 2 }, // 15 Cancer\n { name: 'Saturn', position: 201, orbit: 2 }, // 21 Libra\n { name: 'NNode', position: 63, orbit: 2 } // 3 Geminy\n ],\n\n // 0 - 4\n ANIMATION_CUSPS_ROTATION_SPEED: 2,\n\n DEBUG: false\n}\n\nconst default_settings = settings\nexport default default_settings\n","import type { AstroData, LocatedPoint } from './radix.js'\nimport type { Settings } from './settings.js'\n\n/**\n * Calculate position of the point on the circle.\n *\n * @param {int} cx - center x\n * @param {int} cy - center y\n * @param {int} radius\n * @param {double} angle - degree\n *\n * @return {{x: number, y: number}} Obj - {x:10, y:20}\n */\nexport const getPointPosition = (cx: number, cy: number, radius: number, angle: number, astrology: { SHIFT_IN_DEGREES: number }): { x: number; y: number } => {\n const angleInRadius = (astrology.SHIFT_IN_DEGREES - angle) * Math.PI / 180\n const xPos = cx + radius * Math.cos(angleInRadius)\n const yPos = cy + radius * Math.sin(angleInRadius)\n return { x: xPos, y: yPos }\n}\n\nexport const degreeToRadians = (degrees: number): number => degrees * Math.PI / 180\n\nexport const radiansToDegree = (radians: number): number => radians * 180 / Math.PI\n\ninterface TextLocation { text: string; x: number; y: number }\n\n/**\n * Calculates positions of the point description\n *\n * @param {Object} point\n * @param {Array<String>} texts\n *\n * @return {Array<Object>} [{text:\"abc\", x:123, y:456}, {text:\"cvb\", x:456, y:852}, ...]\n */\nexport const getDescriptionPosition = function (point: { x: number; y: number }, texts: string[], astrology: { COLLISION_RADIUS: number; SYMBOL_SCALE: number }): TextLocation[] {\n const RATION = 1.4\n const result: TextLocation[] = []\n const posX = point.x + (astrology.COLLISION_RADIUS / RATION * astrology.SYMBOL_SCALE)\n const posY = point.y - (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE)\n\n texts.forEach((text, idx) => {\n result.push({ text, x: posX, y: posY + (astrology.COLLISION_RADIUS / RATION * astrology.SYMBOL_SCALE * idx) })\n }, this)\n\n return result\n}\n\n/**\n * Checks a source data\n * @private\n *\n * @param {Object} data\n * @return {{hasError: boolean, messages: string[]}} status\n */\nexport const validate = (data: AstroData): { hasError: boolean; messages: string[] } => {\n const status = { hasError: false, messages: [] as string[] }\n\n if (data == null) {\n status.messages.push('Data is not set.')\n status.hasError = true\n return status\n }\n\n if (data.planets == null) {\n status.messages.push('There is not property \\'planets\\'.')\n status.hasError = true\n }\n\n for (const property in data.planets) {\n if (data.planets.hasOwnProperty(property)) {\n if (!Array.isArray(data.planets[property])) {\n status.messages.push('The planets property \\'' + property + '\\' has to be Array.')\n status.hasError = true\n }\n }\n }\n\n if (data.cusps != null && !Array.isArray(data.cusps)) {\n status.messages.push('Property \\'cusps\\' has to be Array.')\n status.hasError = true\n }\n\n if (data.cusps != null && data.cusps.length !== 12) {\n status.messages.push('Count of \\'cusps\\' values has to be 12.')\n status.hasError = true\n }\n\n return status\n}\n\n/**\n * Get empty DOMElement with ID\n *\n * @param{String} elementID\n * @param{DOMElement} parent\n * @return {DOMElement}\n */\nexport const getEmptyWrapper = (parent: Element, elementID: string, _paperElementId: string): Element => {\n const element = document.getElementById(elementID)\n if (element != null) {\n removeChilds(element)\n return element\n }\n const paper = document.getElementById(_paperElementId)\n if (paper == null) throw new Error('Paper element should exist')\n\n const wrapper = document.createElementNS(paper.namespaceURI, 'g')\n wrapper.setAttribute('id', elementID)\n parent.appendChild(wrapper)\n\n return wrapper\n}\n\n/**\n * Remove childs\n *\n * @param{DOMElement} parent\n */\nexport const removeChilds = (parent: HTMLElement): void => {\n if (parent == null) {\n return\n }\n\n let last\n while ((last = parent.lastChild) != null) {\n parent.removeChild(last)\n }\n}\n\n/**\n * Check circle collision between two objects\n *\n * @param {Object} circle1, {x:123, y:123, r:50}\n * @param {Object} circle2, {x:456, y:456, r:60}\n * @return {boolean}\n */\nexport const isCollision = (circle1: { x: number; y: number; r: number }, circle2: { x: number; y: number; r: number }): boolean => {\n // Calculate the vector between the circles’ center points\n const vx = circle1.x - circle2.x\n const vy = circle1.y - circle2.y\n\n const magnitude = Math.sqrt(vx * vx + vy * vy)\n\n // circle.radius has been set to astrology.COLLISION_RADIUS;\n const totalRadii = circle1.r + circle2.r\n\n return magnitude <= totalRadii\n}\n\n/**\n * Places a new point in the located list\n *\n * @param {Array<Object>} locatedPoints, [{name:\"Mars\", x:123, y:123, r:50, ephemeris:45.96}, {name:\"Sun\", x:1234, y:1234, r:50, ephemeris:100.96}]\n * @param {Object} point, {name:\"Venus\", x:78, y:56, r:50, angle:15.96}\n * @param {Object} universe - current universe\n * @return {Array<Object>} locatedPoints\n */\nexport const assemble = (locatedPoints: LocatedPoint[], point: LocatedPoint, universe: { cx: number; cy: number; r: number }, astrology: Settings): LocatedPoint[] => {\n // first item\n if (locatedPoints.length === 0) {\n locatedPoints.push(point)\n return locatedPoints\n }\n\n if ((2 * Math.PI * universe.r) - (2 * (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE) * (locatedPoints.length + 2)) <= 0) {\n if (astrology.DEBUG) console.log('Universe circumference: ' + (2 * Math.PI * universe.r) + ', Planets circumference: ' + (2 * (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE) * (locatedPoints.length + 2)))\n throw new Error('Unresolved planet collision. Try change SYMBOL_SCALE or paper size.')\n }\n\n let hasCollision = false\n let locatedButInCollisionPoint\n locatedPoints.sort(comparePoints)\n for (let i = 0, ln = locatedPoints.length; i < ln; i++) {\n if (isCollision(locatedPoints[i], point)) {\n hasCollision = true\n locatedButInCollisionPoint = locatedPoints[i]\n locatedButInCollisionPoint.index = i\n\n if (astrology.DEBUG) console.log('Resolve collision: ' + locatedButInCollisionPoint.name + ' X ' + point.name)\n\n break\n }\n }\n\n if (hasCollision && locatedButInCollisionPoint != null && locatedButInCollisionPoint.index != null) {\n placePointsInCollision(locatedButInCollisionPoint, point)\n\n let newPointPosition = getPointPosition(universe.cx, universe.cy, universe.r, locatedButInCollisionPoint.angle, astrology)\n locatedButInCollisionPoint.x = newPointPosition.x\n locatedButInCollisionPoint.y = newPointPosition.y\n\n newPointPosition = getPointPosition(universe.cx, universe.cy, universe.r, point.angle, astrology)\n point.x = newPointPosition.x\n point.y = newPointPosition.y\n\n // remove locatedButInCollisionPoint from locatedPoints\n locatedPoints.splice(locatedButInCollisionPoint.index, 1)\n\n // call recursive\n locatedPoints = assemble(locatedPoints, locatedButInCollisionPoint, universe, astrology)\n locatedPoints = assemble(locatedPoints, point, universe, astrology)\n } else {\n locatedPoints.push(point)\n }\n locatedPoints.sort(comparePoints)\n return locatedPoints\n}\n\n/**\n * Sets the positions of two points that are in collision.\n *\n * @param {Object} p1, {..., pointer:123, angle:456}\n * @param {Object} p2, {..., pointer:23, angle:56}\n */\nexport const placePointsInCollision = (p1: LocatedPoint, p2: LocatedPoint): void => {\n const step = 1\n let adjustedP1Pointer = p1.pointer === undefined ? p1.angle : p1.pointer\n let adjustedP2Pointer = p2.pointer === undefined ? p2.angle : p2.pointer\n\n // solving problems with zero crossing\n if (Math.abs(adjustedP1Pointer - adjustedP2Pointer) > 180) {\n adjustedP1Pointer = (adjustedP1Pointer + 180) % 360\n adjustedP2Pointer = (adjustedP2Pointer + 180) % 360\n }\n\n if (adjustedP1Pointer <= adjustedP2Pointer) {\n p1.angle = p1.angle - step\n p2.angle = p2.angle + step\n } else if (adjustedP1Pointer >= adjustedP2Pointer) {\n p1.angle = p1.angle + step\n p2.angle = p2.angle - step\n }\n\n p1.angle = (p1.angle + 360) % 360\n p2.angle = (p2.angle + 360) % 360\n}\n\n/**\n * Check collision between angle and object\n *\n * @param {double} angle\n * @param {Array<Object>} points, [{x:456, y:456, r:60, angle:123}, ...]\n * @return {boolean}\n */\nexport const isInCollision = (angle: number, points: string | any[], astrology: Settings): boolean => {\n const deg360 = radiansToDegree(2 * Math.PI)\n const collisionRadius = (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE) / 2\n\n let result = false\n for (let i = 0, ln = points.length; i < ln; i++) {\n if (Math.abs(points[i].angle - angle) <= collisionRadius ||\n (deg360 - Math.abs(points[i].angle - angle)) <= collisionRadius) {\n result = true\n break\n }\n }\n\n return result\n}\n\ninterface InitialEndPosition {\n startX: number\n startY: number\n endX: number\n endY: number\n}\n\n/**\n * Calculates positions of the dashed line passing through the obstacle.\n * *\n * @param {double} centerX\n * @param {double} centerY\n * @param {double} angle - line angle\n * @param {double} lineStartRadius\n * @param {double} lineEndRadius\n * @param {double} obstacleRadius\n * @param {Array<Object>} obstacles, [{x:456, y:456, r:60, angle:123}, ...]\n *\n * @return {Array<any>} [{startX:1, startY:1, endX:4, endY:4}, {startX:6, startY:6, endX:8, endY:8}]\n */\nexport const getDashedLinesPositions = (centerX: number, centerY: number, angle: number, lineStartRadius: number, lineEndRadius: number, obstacleRadius: number, obstacles: LocatedPoint[], astrology: Settings): InitialEndPosition[] => {\n let startPos\n let endPos\n const result = []\n\n if (isInCollision(angle, obstacles, astrology)) {\n startPos = getPointPosition(centerX, centerY, lineStartRadius, angle, astrology)\n endPos = getPointPosition(centerX, centerY, obstacleRadius - (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE), angle, astrology)\n result.push({ startX: startPos.x, startY: startPos.y, endX: endPos.x, endY: endPos.y })\n\n // the second part of the line when is space\n if ((obstacleRadius + 2 * (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE)) < lineEndRadius) {\n startPos = getPointPosition(centerX, centerY, obstacleRadius + 2 * (astrology.COLLISION_RADIUS * astrology.SYMBOL_SCALE), angle, astrology)\n endPos = getPointPosition(centerX, centerY, lineEndRadius, angle, astrology)\n result.push({ startX: startPos.x, startY: startPos.y, endX: endPos.x, endY: endPos.y })\n }\n } else {\n startPos = getPointPosition(centerX, centerY, lineStartRadius, angle, astrology)\n endPos = getPointPosition(centerX, centerY, lineEndRadius, angle, astrology)\n result.push({ startX: startPos.x, startY: startPos.y, endX: endPos.x, endY: endPos.y })\n }\n\n return result\n}\n\n/**\n * Calculate ruler positions.\n *\n * @param {Double} centerX\n * @param {Double} centerY\n * @param {Double} startRadius\n * @param {Double} endRadius\n * @param {Boolean} startAngle\n *\n * @return {Array<Object>} [ {startX:1,startY:2, endX:3, endX:4 }, ...]\n */\nexport const getRulerPositions = (centerX: number, centerY: number, startRadius: number, endRadius: number, startAngle: number, astrology: { SHIFT_IN_DEGREES: number }): InitialEndPosition[] => {\n const result = []\n\n const rayRadius = endRadius\n const halfRayRadius = (startRadius <= endRadius) ? rayRadius - (Math.abs(endRadius - startRadius) / 2) : rayRadius + (Math.abs(endRadius - startRadius) / 2)\n\n for (let i = 0, start = 0, step = 5; i < 72; i++) {\n const angle = start + startAngle\n const startPos = getPointPosition(centerX, centerY, startRadius, angle, astrology)\n const endPos = getPointPosition(centerX, centerY, (i % 2 === 0 ? rayRadius : halfRayRadius), angle, astrology)\n result.push({ startX: startPos.x, startY: startPos.y, endX: endPos.x, endY: endPos.y })\n\n start += step\n }\n\n return result\n}\n\n/**\n * Compare two points\n *\n * @param {Object} pointA, {name:\"Venus\", x:78, y:56, r:50, angle:15.96}\n * @param {Object} pointB, {name:\"Mercury\", x:78, y:56, r:50, angle:20.26}\n * @return\n */\nexport const comparePoints = (pointA: { angle: number }, pointB: { angle: number }): number => {\n return pointA.angle - pointB.angle\n}\n","import default_settings from './settings.js'\nimport type { Dignity, Settings } from './settings.js'\nimport { radiansToDegree } from './utils.js'\n// Zodiac\nconst SIGNS_ARIES = 1\nconst SIGNS_TAURUS = 2\nconst SIGNS_GEMINI = 3\nconst SIGNS_CANCER = 4\nconst SIGNS_LEO = 5\nconst SIGNS_VIRGO = 6\nconst SIGNS_LIBRA = 7\nconst SIGNS_SCORPIO = 8\nconst SIGNS_SAGITTARIUS = 9\nconst SIGNS_CAPRICORN = 10\nconst SIGNS_AQUARIUS = 11\nconst SIGNS_PISCES = 12\n\n/**\n * Zodiac\n *\n * Gives the position of points in the zodiac.\n * Position of point in the zodiac.\n * Position of point in houses.\n * Dignities of planets.\n *\n * @class\n * @public\n * @constructor\n * @param {Array} cusps - cusprs in zodiac; [296, 350, 30, 56, 75, 94, 116, 170, 210, 236, 255, 274]\n * @param {Object | null } settings\n */\nclass Zodiac {\n cusps: number[]\n settings: Settings\n constructor (cusps: number[], settings?: Settings) {\n if (cusps === null) {\n throw new Error('Param \\'cusps\\' must not be empty.')\n }\n\n if (!(Array.isArray(cusps) && cusps.length === 12)) {\n throw new Error('Param \\'cusps\\' is not 12 length Array.')\n }\n\n this.cusps = cusps\n this.settings = settings ?? default_settings\n }\n\n /**\n * Get astrological sign\n * 1 - Arise, ... , 12 - Pisces\n *\n * @param {double} point - angle of point in circle\n * @return { \\[1-9] | 1[0-2]\\ }\n */\n getSign (point: number): number {\n const angle = point % radiansToDegree(2 * Math.PI)\n return Math.floor((angle / 30) + 1)\n }\n\n /**\n * Is retrograde\n *\n * @param {double} speed\n * @return {boolean}\n */\n isRetrograde (speed: number): boolean {\n return speed < 0\n }\n\n /**\n * Get house number\n * 1 - 12\n *\n * @param {double} point - angle of point in circle\n * @return { \\[1-9] | 1[0-2]\\ }\n */\n getHouseNumber (point: number): number {\n const angle = point % radiansToDegree(2 * Math.PI)\n\n for (let i = 0, ln = this.cusps.length; i < ln; i++) {\n if (angle >= this.cusps[i] && angle < this.cusps[(i % (ln - 1)) + 1]) {\n return i + 1\n }\n }\n\n // cusp passes over zero\n for (let i = 0, ln = this.cusps.length; i < ln; i++) {\n if (this.cusps[i] > this.cusps[(i % (ln - 1)) + 1]) {\n return i + 1\n }\n }\n\n throw new Error('Oops, serious error in the method: \\'astrology.Zodiac.getHouseNumber\\'.')\n }\n\n /**\n * Calculate dignities of planet\n *\n * r - Rulership\n * d - Detriment\n * e - Exaltation\n * E - Exalatation - Exact exaltation\n * f - Fall\n *\n * @param {Object} planet, { name:\"Sun\", position:60.2 }\n * @param {Array<Object> | null } exactExaltation - list of named angles, [{ name:\"Sun\", position:278, orbit:2 }, { name:\"Moon\", position:3, , orbit:2 }]\n * @return {Array<String>}\n */\n getDignities (planet: { name: string; position: number }, exactExaltation?: Dignity[]): string[] {\n if (!(planet && planet.name && planet.position != null)) {\n return []\n }\n\n const result = []\n const sign = this.getSign(planet.position)\n\n const position = planet.position % radiansToDegree(2 * Math.PI)\n\n switch (planet.name) {\n case this.settings.SYMBOL_SUN:\n\n if (sign === SIGNS_LEO) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_AQUARIUS) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_ARIES) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_VIRGO) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_MOON:\n\n if (sign === SIGNS_CANCER) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_CAPRICORN) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_TAURUS) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_SCORPIO) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_MERCURY:\n\n if (sign === SIGNS_GEMINI) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_SAGITTARIUS) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_VIRGO) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_PISCES) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_VENUS:\n\n if (sign === SIGNS_TAURUS || sign === SIGNS_LIBRA) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_ARIES || sign === SIGNS_SCORPIO) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_PISCES) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_VIRGO) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_MARS:\n\n if (sign === SIGNS_ARIES || sign === SIGNS_SCORPIO) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_TAURUS || sign === SIGNS_LIBRA) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_CAPRICORN) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_CANCER) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_JUPITER:\n\n if (sign === SIGNS_SAGITTARIUS || sign === SIGNS_PISCES) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_GEMINI || sign === SIGNS_VIRGO) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_CANCER) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_CAPRICORN) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_SATURN:\n\n if (sign === SIGNS_CAPRICORN || sign === SIGNS_AQUARIUS) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_CANCER || sign === SIGNS_LEO) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_LIBRA) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_ARIES) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_URANUS:\n\n if (sign === SIGNS_AQUARIUS) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_LEO) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_SCORPIO) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_TAURUS) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_NEPTUNE:\n\n if (sign === SIGNS_PISCES) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_VIRGO) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_LEO || sign === SIGNS_SAGITTARIUS) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_AQUARIUS || sign === SIGNS_GEMINI) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n\n break\n\n case this.settings.SYMBOL_PLUTO:\n\n if (sign === SIGNS_SCORPIO) {\n result.push(this.settings.DIGNITIES_RULERSHIP)\n } else if (sign === SIGNS_TAURUS) {\n result.push(this.settings.DIGNITIES_DETRIMENT)\n }\n\n if (sign === SIGNS_ARIES) {\n result.push(this.settings.DIGNITIES_EXALTATION)\n } else if (sign === SIGNS_LIBRA) {\n result.push(this.settings.DIGNITIES_FALL)\n }\n break\n default:\n break\n }\n\n if (exactExaltation != null && Array.isArray(exactExaltation)) {\n for (let i = 0, ln = exactExaltation.length; i < ln; i++) {\n if (planet.name === exactExaltation[i].name) {\n if (this.hasConjunction(planet.position, exactExaltation[i].position, exactExaltation[i].orbit)) {\n result.push(this.settings.DIGNITIES_EXACT_EXALTATION)\n }\n }\n }\n }\n\n return result\n }\n\n /*\n * To hours:minutes:seconds\n * @param {Double} d\n * @return {String}\n */\n toDMS (d: number): string {\n d += 0.5 / 3600.0 / 10000.0 // round to 1/1000 of a second\n const deg = parseInt(d.toString(), 10)\n d = (d - deg) * 60\n const min = parseInt(d.toString(), 10)\n const sec = parseInt(((d - min) * 60).toString(), 10)\n return deg + '° ' + min + '\\' ' + sec\n }\n\n /*\n * Has conjunction with point\n *\n * @private\n *\n * @param {Double} planetPosition\n * @param {Double} poitPosition\n * @param {Integer} orbit\n * @return {boolean}\n */\n hasConjunction (planetPosition: number, pointPosition: number, orbit: number): boolean {\n let result = false\n\n const minOrbit = (pointPosition - orbit / 2) < 0\n ? radiansToDegree(2 * Math.PI) - (pointPosition - orbit / 2)\n : pointPosition - orbit / 2\n\n const maxOrbit = (pointPosition + orbit / 2) >= radiansToDegree(2 * Math.PI)\n ? (pointPosition + orbit / 2) - radiansToDegree(2 * Math.PI)\n : (pointPosition + orbit / 2)\n\n if (minOrbit > maxOrbit) { // crossing over zero\n if (minOrbit >= planetPosition && planetPosition <= minOrbit) {\n result = true\n }\n } else {\n if (minOrbit <= planetPosition && planetPosition <= maxOrbit) {\n result = true\n }\n }\n\n return result\n }\n}\n\nexport default Zodiac\n","import type { Points } from './radix.js'\nimport type { AspectData, Settings } from './settings.js'\nimport { radiansToDegree } from './utils.js'\n\nexport interface FormedAspect {\n point: {\n name: string\n position: number\n }\n toPoint: {\n name: string\n position: number\n }\n aspect: {\n name: string\n degree: number\n color: string\n orbit: number\n }\n precision: string\n}\n\nconst DEFAULT_ASPECTS = {\n conjunction: { degree: 0, orbit: 10, color: 'transparent' },\n square: { degree: 90, orbit: 8, color: '#FF4500' },\n trine: { degree: 120, orbit: 8, color: '#27AE60' },\n opposition: { degree: 180, orbit: 10, color: '#27AE60' }\n}\n/**\n * Aspects calculator\n *\n * @class\n * @public\n * @constructor\n * @param {AspectPoints} points; {\"Sun\":[0], \"Moon\":[90], \"Neptune\":[120], \"As\":[30]}\n * @param {Object | null } settings\n */\nclass AspectCalculator {\n settings: Partial<Settings>\n toPoints: Points\n context: this\n constructor (toPoints: Points, settings?: Partial<Settings>) {\n if (toPoints == null) {\n throw new Error('Param \\'toPoint\\' must not be empty.')\n }\n\n this.settings = settings ?? {}\n this.settings.ASPECTS = settings?.ASPECTS ?? DEFAULT_ASPECTS\n\n this.toPoints = toPoints\n\n this.context = this\n }\n\n /**\n * Getter for this.toPoints\n * @see constructor\n *\n * @return {Object}\n */\n getToPoints (): Points {\n return this.toPoints\n }\n\n /**\n * Radix aspects\n *\n * In radix calculation is the param \"points\" the same as param \"toPoints\" in constructor\n * , but without special points such as: As,Ds, Mc, Ic, ...\n *\n * @param {Object} points; {\"Sun\":[0], \"Moon\":[90]}\n *\n * @return {Array<Object>} [{\"aspect\":{\"name\":\"conjunction\", \"degree\":120}\"\", \"point\":{\"name\":\"Sun\", \"position\":123}, \"toPoint\":{\"name\":\"Moon\", \"position\":345}, \"precision\":0.5}]]\n */\n radix (points: Points): FormedAspect[] {\n if (points == null) {\n return []\n }\n\n const aspects: FormedAspect[] = []\n\n for (const point in points) {\n if (points.hasOwnProperty(point)) {\n for (const toPoint in this.toPoints) {\n if (this.toPoints.hasOwnProperty(toPoint)) {\n if (point !== toPoint) {\n for (const aspect in this.settings.ASPECTS) {\n if (this.hasAspect(points[point][0], this.toPoints[toPoint][0], this.settings.ASPECTS[aspect])) {\n aspects.push(\n {\n aspect: { name: aspect, degree: this.settings.ASPECTS[aspect].degree, orbit: this.settings.ASPECTS[aspect].orbit, color: this.settings.ASPECTS[aspect].color },\n point: { name: point, position: points[point][0] },\n toPoint: { name: toPoint, position: this.toPoints[toPoint][0] },\n precision: this.calcPrecision(points[point][0], this.toPoints[toPoint][0], this.settings.ASPECTS[aspect].degree).toFixed(4)\n }\n )\n }\n }\n }\n }\n }\n }\n }\n\n return aspects.sort(this.compareAspectsByPrecision)\n }\n\n /**\n * Transit aspects\n *\n * @param {Object} points - transiting points; {\"Sun\":[0, 1], \"Uranus\":[90, -1], \"NAME\":[ANGLE, SPEED]};\n * @return {Array<Object>} [{\"aspect\":{\"name\":\"conjunction\", \"degree\":120}\"\", \"point\":{\"name\":\"Sun\", \"position\":123}, \"toPoint\":{\"name\":\"Moon\", \"position\":345}, \"precision\":0.5}]]\n */\n transit (points: Points): FormedAspect[] {\n if (points == null) {\n return []\n }\n\n const aspects = []\n\n for (const point in points) {\n if (points.hasOwnProperty(point)) {\n for (const toPoint in this.toPoints) {\n if (this.toPoints.hasOwnProperty(toPoint)) {\n for (const aspect in this.settings.ASPECTS) {\n if (this.hasAspect(points[point][0], this.toPoints[toPoint][0], this.settings.ASPECTS[aspect])) {\n let precision = this.calcPrecision(points[point][0], this.toPoints[toPoint][0], this.settings.ASPECTS[aspect].degree)\n\n // -1 : is approaching to aspect\n // +1 : is moving away\n if (this.isTransitPointApproachingToAspect(this.settings.ASPECTS[aspect].degree, this.toPoints[toPoint][0], points[point][0])) {\n precision *= -1\n }\n\n // if transit has speed value && transit is retrograde\n if (points[point][1] && points[point][1] < 0) {\n precision *= -1\n }\n\n aspects.push(\n {\n aspect: { name: aspect, degree: this.settings.ASPECTS[aspect].degree, orbit: this.settings.ASPECTS[aspect].orbit, color: this.settings.ASPECTS[aspect].color },\n point: { name: point, position: points[point][0] },\n toPoint: { name: toPoint, position: this.toPoints[toPoint][0] },\n precision: precision.toFixed(4)\n }\n )\n }\n }\n }\n }\n }\n }\n\n return aspects.sort(this.compareAspectsByPrecision)\n }\n\n /*\n * @private\n * @param {double} point\n * @param {double} toPoint\n * @param {Array} aspects; [DEGREE, ORBIT]\n */\n hasAspect (point: number, toPoint: number, aspect: AspectData): boolean {\n let result = false\n\n let gap = Math.abs(point - toPoint)\n\n if (gap > radiansToDegree(Math.PI)) {\n gap = radiansToDegree(2 * Math.PI) - gap\n }\n\n const orbitMin = aspect.degree - (aspect.orbit / 2)\n const orbitMax = aspect.degree + (aspect.orbit / 2)\n\n if (orbitMin <= gap && gap <= orbitMax) {\n result = true\n }\n\n return result\n }\n\n /*\n * @private\n * @param {Object} pointAngle\n * @param {Object} toPointAngle\n * @param {double} aspectDegree;\n */\n calcPrecision (point: number, toPoint: number, aspect: number): number {\n let gap = Math.abs(point - toPoint)\n\n if (gap > radiansToDegree(Math.PI)) {\n gap = radiansToDegree(2 * Math.PI) - gap\n }\n return Math.abs(gap - aspect)\n }\n\n /*\n * Calculate direction of aspect\n * whether the transiting planet is approaching or is falling\n * @private\n *\n * //TODO\n * This method is tested, and for tests gives the right results.\n * But the code is totally unclear. It needs to be rewritten.\n * @param {double} aspect - aspect degree; for example 90.\n * @param {double} toPoint - angle of standing point\n * @param {double} point - angle of transiting planet\n * @return {boolean}\n */\n isTransitPointApproachingToAspect (aspect: number, toPoint: number, point: number): boolean {\n if ((point - toPoint) > 0) {\n if ((point - toPoint) > radiansToDegree(Math.PI)) {\n point = (point + aspect) % radiansToDegree(2 * Math.PI)\n } else {\n toPoint = (toPoint + aspect) % radiansToDegree(2 * Math.PI)\n }\n } else {\n if ((toPoint - point) > radiansToDegree(Math.PI)) {\n toPoint = (toPoint + aspect) % radiansToDegree(2 * Math.PI)\n } else {\n point = (point + aspect) % radiansToDegree(2 * Math.PI)\n }\n }\n\n let _point = point\n let _toPoint = toPoint\n\n const difference = _point - _toPoint\n\n if (Math.abs(difference) > radiansToDegree(Math.PI)) {\n _point = toPoint\n _toPoint = point\n }\n\n return (_point - _toPoint < 0)\n }\n\n /*\n * Aspects comparator\n * by precision\n * @private\n * @param {Object} a\n * @param {Object} b\n */\n compareAspectsByPrecision (a: FormedAspect, b: FormedAspect): number {\n return parseFloat(a.precision) - parseFloat(b.precision)\n }\n}\n\nexport default AspectCalculator\n","class Timer {\n debug: boolean\n callback: (delta: number) => void\n boundTick_: FrameRequestCallback\n lastGameLoopFrame: number\n requestID_: number | undefined\n constructor(callback: (delta: number) => void, debug: boolean) {\n if (typeof callback !== 'function') {\n throw new Error('param \\'callback\\' has to be a function.')\n }\n this.debug = debug\n\n this.callback = callback\n this.boundTick_ = this.tick.bind(this)\n }\n\n start(): void {\n if (!this.requestID_) {\n this.lastGameLoopFrame = new Date().getTime()\n this.tick()\n if (this.debug) console.log('[astrology.Timer] start')\n }\n }\n\n stop(): void {\n if (this.requestID_) {\n window.cancelAnimationFrame(this.requestID_)\n this.requestID_ = undefined\n if (this.debug) console.log('[astrology.Timer] stop')\n }\n }\n\n isRunning(): boolean {\n return !!this.requestID_\n }\n\n tick(): void {\n const now = new Date().getTime()\n this.requestID_ = window.requestAnimationFrame(this.boundTick_)\n this.callback(now - this.lastGameLoopFrame)\n this.lastGameLoopFrame = now\n }\n}\n\nexport default Timer\n","import type { AstroData } from '../radix.js'\nimport type { Settings } from '../settings.js'\nimport type Transit from '../transit.js'\nimport { radiansToDegree } from '../utils.js'\nimport Timer from './timer.js'\n/**\n * Transit chart animator\n *\n * Animates the object on a circle.\n *\n * @class\n * @public\n * @constructor\n * @param {Object} from, {\"Sun\":[12], \"Moon\":[60]}\n * @param {Object} to, {\"Sun\":[30], \"Moon\":[180]}\n * @param {Object} settings, {cx:100, cy:100, radius:200, prefix:\"astro-chart-\"}\n */\nclass Animator {\n transit: Transit\n isReverse: boolean\n rotation: number\n settings: Settings\n actualPlanetPos: any\n timer: Timer\n timeSinceLoopStart: number\n context: this\n cuspsElement: any\n data: AstroData\n duration: number\n callback: () => void\n constructor (transit: Transit, settings: Settings) {\n this.transit = transit\n this.isReverse = false\n this.rotation = 0\n this.settings = settings\n // Copy data\n this.actualPlanetPos = {}\n for (const planet in this.transit.data.planets) {\n if (this.transit.data.planets.hasOwnProperty(planet)) {\n this.actualPlanetPos[planet] = this.transit.data.planets[planet]\n }\n }\n\n this.timer = new Timer(this.update.bind(this), this.settings.DEBUG)\n\n // time, passed since the start of the loop\n this.timeSinceLoopStart = 0\n\n this.context = this\n this.cuspsElement = null\n }\n\n /**\n * Animate objects\n\n * @param {Object} data, targetPositions\n * @param {Integer} duration - seconds\n * @param {boolean} isReverse\n * @param {Function} callbck - start et the end of animation\n */\n animate (data: any, duration: number, isReverse: boolean, callback: () => void): void {\n this.data = data\n this.duration = duration * 1000\n this.isReverse = isReverse || false\n this.callback = callback\n\n this.rotation = 0\n this.cuspsElement = document.getElementById(this.transit.paper._paperElementId + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_CUSPS)\n\n this.timer.start()\n }\n\n update (deltaTime?: number): void {\n deltaTime = deltaTime ?? 1\n this.timeSinceLoopStart += deltaTime\n if (this.timeSinceLoopStart >= this.duration) {\n this.timer.stop()\n\n if (typeof this.callback === 'function') {\n this.callback()\n }\n\n return\n }\n\n const expectedNumberOfLoops = (this.duration - this.timeSinceLoopStart) < deltaTime\n ? 1\n : Math.round((this.duration - this.timeSinceLoopStart) / deltaTime)\n\n this.updatePlanets(expectedNumberOfLoops)\n this.updateCusps(expectedNumberOfLoops)\n }\n\n /*\n * @private\n */\n updateCusps (expectedNumberOfLoops: number): void {\n const deg360 = radiansToDegree(2 * Math.PI)\n let targetCuspAngle = this.transit.data.cusps[0] - this.data.cusps[0]\n\n if (targetCuspAngle < 0) {\n targetCuspAngle += deg360\n }\n\n // speed\n if (this.settings.ANIMATION_CUSPS_ROTATION_SPEED > 0) {\n targetCuspAngle += (this.isReverse)\n ? -1 * ((this.settings.ANIMATION_CUSPS_ROTATION_SPEED * deg360) + deg360)\n : this.settings.ANIMATION_CUSPS_ROTATION_SPEED * deg360\n }\n\n let difference = (this.isReverse)\n ? this.rotation - targetCuspAngle\n : targetCuspAngle - this.rotation\n\n // zero crossing\n if (difference < 0) {\n difference += deg360\n }\n\n let increment = difference / expectedNumberOfLoops\n\n if (this.isReverse) {\n increment *= -1\n }\n this.rotation += increment\n\n this.cuspsElement.setAttribute('transform', 'rotate(' + this.rotation + ' ' + this.transit.cx + ' ' + this.transit.cy + ')')\n\n if (expectedNumberOfLoops === 1) {\n this.cuspsElement.removeAttribute('transform')\n }\n }\n\n /*\n * @private\n */\n updatePlanets (expectedNumberOfLoops: number): void {\n for (const planet in this.data.planets) {\n if (this.data.planets.hasOwnProperty(planet)) {\n const actualPlanetAngle: number = this.actualPlanetPos[planet][0]\n const targetPlanetAngle: number = this.data.planets[planet][0]\n const isRetrograde = this.actualPlanetPos[planet][1] != null && this.actualPlanetPos[planet][1] < 0\n\n let difference\n if (this.isReverse && isRetrograde) {\n difference = targetPlanetAngle - actualPlanetAngle\n } else if (this.isReverse || isRetrograde) {\n difference = actualPlanetAngle - targetPlanetAngle\n } else {\n difference = targetPlanetAngle - actualPlanetAngle\n }\n\n // zero crossing\n if (difference < 0) {\n difference += radiansToDegree(2 * Math.PI)\n }\n\n let increment = difference / expectedNumberOfLoops\n\n if (this.isReverse) {\n increment *= -1\n }\n\n if (isRetrograde) {\n increment *= -1\n }\n\n let newPos = actualPlanetAngle + increment\n if (newPos < 0) {\n newPos += radiansToDegree(2 * Math.PI)\n }\n\n this.actualPlanetPos[planet][0] = newPos\n }\n }\n\n this.transit.drawPoints(this.actualPlanetPos)\n }\n}\n\nexport default Animator\n","import Zodiac from './zodiac.js'\nimport AspectCalculator from './aspect.js'\nimport type { FormedAspect } from './aspect.js'\nimport Animator from './animation/animator.js'\nimport { validate, getEmptyWrapper, getPointPosition, getRulerPositions, getDescriptionPosition, assemble, radiansToDegree } from './utils.js'\nimport type { AstroData, LocatedPoint, Points } from './radix.js'\nimport type Radix from './radix.js'\nimport type SVG from './svg.js'\nimport type { Settings } from './settings.js'\n\n/**\n * Transit charts.\n *\n * @class\n * @public\n * @constructor\n * @param {this.settings.Radix} radix\n * @param {Object} data\n */\nclass Transit {\n data: AstroData\n paper: SVG\n cx: number\n cy: number\n toPoints: Points\n radius: number\n settings: Settings\n rulerRadius: number\n pointRadius: number\n shift: number\n universe: Element\n context: this\n locatedPoints: LocatedPoint[]\n constructor(radix: Radix, data: AstroData, settings: Settings) {\n // Validate data\n const status = validate(data)\n if (status.hasError) {\n throw new Error(status.messages.join(' | '))\n }\n\n this.data = data\n this.paper = radix.paper\n this.cx = radix.cx\n this.cy = radix.cy\n this.toPoints = radix.toPoints\n this.radius = radix.radius\n this.settings = settings\n\n this.rulerRadius = ((this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO) / this.settings.RULER_RADIUS)\n this.pointRadius = this.radius + (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + (this.settings.PADDING * this.settings.SYMBOL_SCALE))\n\n this.shift = radix.shift\n\n this.universe = document.createElementNS(this.paper.root.namespaceURI, 'g')\n this.universe.setAttribute('id', this.paper._paperElementId + '-' + this.settings.ID_TRANSIT)\n this.paper.root.appendChild(this.universe)\n\n this.context = this\n }\n\n /**\n * Draw background\n */\n drawBg(): void {\n const universe = this.universe\n\n const wrapper = getEmptyWrapper(universe, this.paper._paperElementId + '-' + this.settings.ID_BG, this.paper._paperElementId)\n\n const LARGE_ARC_FLAG = 1\n const start = 0 // degree\n const end = 359.99 // degree\n const hemisphere = this.paper.segment(this.cx, this.cy, this.radius + this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO, start, end, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, LARGE_ARC_FLAG)\n hemisphere.setAttribute('fill', this.settings.STROKE_ONLY ? 'none' : this.settings.COLOR_BACKGROUND)\n wrapper.appendChild(hemisphere)\n }\n\n /**\n * Draw planets\n *\n * @param{undefined | Object} planetsData, posible data planets to draw\n */\n drawPoints(planetsData?: Points): void {\n const planets = (planetsData == null) ? this.data.planets : planetsData\n if (planets == null) {\n return\n }\n\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper._paperElementId + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_POINTS, this.paper._paperElementId)\n\n const gap = this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO)\n const step = (gap - 2 * (this.settings.PADDING * this.settings.SYMBOL_SCALE)) / Object.keys(planets).length\n\n const pointerRadius = this.radius + (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO)\n let startPosition\n let endPosition\n\n this.locatedPoints = []\n for (const planet in planets) {\n if (planets.hasOwnProperty(planet)) {\n const position = getPointPosition(this.cx, this.cy, this.pointRadius, planets[planet][0] + this.shift, this.settings)\n const point = { name: planet, x: position.x, y: position.y, r: (this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE), angle: planets[planet][0] + this.shift, pointer: planets[planet][0] + this.shift }\n this.locatedPoints = assemble(this.locatedPoints, point, { cx: this.cx, cy: this.cy, r: this.pointRadius }, this.settings)\n }\n }\n\n if (this.settings.DEBUG) console.log('Transit count of points: ' + this.locatedPoints.length)\n if (this.settings.DEBUG) console.log('Transit located points:\\n' + JSON.stringify(this.locatedPoints))\n\n this.locatedPoints.forEach(function (point) {\n // draw pointer\n startPosition = getPointPosition(this.cx, this.cy, pointerRadius, planets[point.name][0] + this.shift, this.settings)\n endPosition = getPointPosition(this.cx, this.cy, pointerRadius + this.rulerRadius / 2, planets[point.name][0] + this.shift, this.settings)\n const pointer = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n pointer.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n pointer.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(pointer)\n\n // draw pointer line\n if (!this.settings.STROKE_ONLY && (planets[point.name][0] + this.shift) !== point.angle) {\n startPosition = endPosition\n endPosition = getPointPosition(this.cx, this.cy, this.pointRadius - (this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE), point.angle, this.settings)\n const line = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n line.setAttribute('stroke', this.settings.LINE_COLOR)\n line.setAttribute('stroke-width', 0.5 * (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(line)\n }\n\n // draw symbol\n const symbol = this.paper.getSymbol(point.name, point.x, point.y)\n symbol.setAttribute('id', this.paper.root.id + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_POINTS + '-' + point.name)\n wrapper.appendChild(symbol)\n\n // draw point descriptions\n let textsToShow = [(Math.floor(planets[point.name][0]) % 30).toString()]\n\n const zodiac = new Zodiac(this.data.cusps, this.settings)\n if (planets[point.name][1] && zodiac.isRetrograde(planets[point.name][1])) {\n textsToShow.push('R')\n } else {\n textsToShow.push('')\n }\n textsToShow = textsToShow.concat(zodiac.getDignities({ name: point.name, position: planets[point.name][0] }, this.settings.DIGNITIES_EXACT_EXALTATION_DEFAULT).join(','))\n\n const pointDescriptions = getDescriptionPosition(point, textsToShow, this.settings)\n pointDescriptions.forEach(function (dsc) {\n wrapper.appendChild(this.paper.text(dsc.text, dsc.x, dsc.y, this.settings.POINTS_TEXT_SIZE, this.settings.SIGNS_COLOR))\n }, this)\n }, this)\n }\n\n /**\n * Draw circles\n */\n drawCircles(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper._paperElementId + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_CIRCLES, this.paper._paperElementId)\n const radius = this.radius + this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO\n\n const circle = this.paper.circle(this.cx, this.cy, radius)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CIRCLE_STRONG * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n }\n\n /**\n * Draw cusps\n * @param{undefined | Object} cuspsData, posible data cusps to draw\n */\n drawCusps(cuspsData?: number[]): void {\n const cusps = (cuspsData == null) ? this.data.cusps : cuspsData\n if (cusps == null) {\n return\n }\n\n let bottomPosition\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper._paperElementId + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_CUSPS, this.paper._paperElementId)\n const numbersRadius = this.radius + ((this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO - this.rulerRadius) / 2)\n\n const AS = 0\n const IC = 3\n const DC = 6\n const MC = 9\n const mainAxis = [AS, IC, DC, MC]\n\n // Cusps\n for (let i = 0, ln = cusps.length; i < ln; i++) {\n // Lines\n const startPosition = bottomPosition = getPointPosition(this.cx, this.cy, this.radius, cusps[i] + this.shift, this.settings)\n const endPosition = getPointPosition(this.cx, this.cy, this.radius + this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO - this.rulerRadius, cusps[i] + this.shift, this.settings)\n const line = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n line.setAttribute('stroke', this.settings.LINE_COLOR)\n line.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n\n wrapper.appendChild(line)\n\n // Cup number\n const deg360 = radiansToDegree(2 * Math.PI)\n const startOfCusp = cusps[i]\n const endOfCusp = cusps[(i + 1) % 12]\n const gap = endOfCusp - startOfCusp > 0 ? endOfCusp - startOfCusp : endOfCusp - startOfCusp + deg360\n const textPosition = getPointPosition(this.cx, this.cy, numbersRadius, ((startOfCusp + gap / 2) % deg360) + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol((i + 1).toString(), textPosition.x, textPosition.y))\n }\n }\n\n drawRuler(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_TRANSIT + '-' + this.settings.ID_RULER, this.paper._paperElementId)\n\n const startRadius = (this.radius + (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO))\n const rays = getRulerPositions(this.cx, this.cy, startRadius, startRadius - this.rulerRadius, this.shift, this.settings)\n\n rays.forEach(function (ray) {\n const line = this.paper.line(ray.startX, ray.startY, ray.endX, ray.endY)\n line.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n line.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(line)\n }, this)\n\n const circle = this.paper.circle(this.cx, this.cy, startRadius - this.rulerRadius)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n }\n\n /**\n * Draw aspects\n * @param{Array<Object> | null} customAspects - posible custom aspects to draw;\n */\n aspects(customAspects: FormedAspect[]): Transit {\n const aspectsList = customAspects != null && Array.isArray(customAspects)\n ? customAspects\n : new AspectCalculator(this.toPoints, this.settings).transit(this.data.planets)\n\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_ASPECTS, this.paper._paperElementId)\n\n for (let i = 0, ln = aspectsList.length; i < ln; i++) {\n const startPoint = getPointPosition(this.cx, this.cy, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, aspectsList[i].toPoint.position + this.shift, this.settings)\n const endPoint = getPointPosition(this.cx, this.cy, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, aspectsList[i].point.position + this.shift, this.settings)\n\n const line = this.paper.line(startPoint.x, startPoint.y, endPoint.x, endPoint.y)\n line.setAttribute('stroke', this.settings.STROKE_ONLY ? this.settings.LINE_COLOR : aspectsList[i].aspect.color)\n line.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n\n line.setAttribute('data-name', aspectsList[i].aspect.name)\n line.setAttribute('data-degree', aspectsList[i].aspect.degree.toString())\n line.setAttribute('data-point', aspectsList[i].point.name)\n line.setAttribute('data-toPoint', aspectsList[i].toPoint.name)\n line.setAttribute('data-precision', aspectsList[i].precision.toString())\n\n wrapper.appendChild(line)\n }\n\n // this\n return this.context\n }\n\n /**\n * Moves points to another position.\n *\n * @param {Object} data - planets target positions.\n * @param {Integer} duration - in seconds\n * @param {boolean} isReverse\n * @param {Function | undefined} callbck - the function executed at the end of animation\n */\n animate(data: AstroData, duration: number, isReverse: boolean, callback: () => void): Transit {\n // Validate data\n const status = validate(data)\n if (status.hasError) {\n throw new Error(status.messages.join(' | '))\n }\n\n // remove aspects\n getEmptyWrapper(this.universe, this.paper._paperElementId + '-' + this.settings.ID_ASPECTS, this.paper._paperElementId)\n\n const animator = new Animator(this.context, this.settings)\n animator.animate(data, duration, isReverse, function () {\n // animation is finished\n this.data = data\n this.drawPoints()\n this.drawCusps()\n this.aspects()\n\n if (typeof callback === 'function') {\n callback()\n }\n }.bind(this))\n\n // this\n return this.context\n }\n}\n\nexport default Transit\n","import Zodiac from './zodiac.js'\nimport AspectCalculator from './aspect.js'\nimport type { FormedAspect } from './aspect.js'\nimport Transit from './transit.js'\nimport {\n validate\n , radiansToDegree\n , getEmptyWrapper\n , getPointPosition\n , getRulerPositions\n , getDescriptionPosition\n , getDashedLinesPositions\n , assemble\n} from './utils.js'\nimport type SVG from './svg.js'\nimport type { Settings } from './settings.js'\n\nexport type Points = Record<string, number[]>\nexport interface LocatedPoint { name: string; x: number; y: number; r: number; angle: number; pointer?: number; index?: number }\nexport interface AstroData {\n planets: Points\n cusps: number[]\n}\n\n/**\n * Radix charts.\n *\n * @class\n * @public\n * @constructor\n * @param {this.settings.SVG} paper\n * @param {int} cx\n * @param {int} cy\n * @param {int} radius\n * @param {Object} data\n */\nclass Radix {\n settings: Settings\n data: AstroData\n paper: SVG\n cx: number\n cy: number\n radius: number\n locatedPoints: LocatedPoint[]\n rulerRadius: number\n pointRadius: number\n toPoints: Points\n shift: number\n universe: Element\n context: this\n constructor(paper: SVG, cx: number, cy: number, radius: number, data: AstroData, settings: Settings) {\n this.settings = settings\n // Validate data\n const status = validate(data)\n if (status.hasError) {\n throw new Error(status.messages.join(' | '))\n }\n\n this.data = data\n this.paper = paper\n this.cx = cx\n this.cy = cy\n this.radius = radius\n\n // after calling this.drawPoints() it contains current position of point\n this.locatedPoints = []\n this.rulerRadius = ((this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO) / this.settings.RULER_RADIUS)\n this.pointRadius = this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + 2 * this.rulerRadius + (this.settings.PADDING * this.settings.SYMBOL_SCALE))\n\n // @see aspects()\n // @see setPointsOfInterest()\n this.toPoints = JSON.parse(JSON.stringify(this.data.planets)) // Clone object\n\n this.shift = 0\n if (this.data.cusps && this.data.cusps[0]) {\n const deg360 = radiansToDegree(2 * Math.PI)\n this.shift = deg360 - this.data.cusps[0]\n }\n\n // preparing wrapper for aspects. It is the lowest layer\n const divisionForAspects = document.createElementNS(this.paper.root.namespaceURI, 'g')\n divisionForAspects.setAttribute('id', this.paper.root.id + '-' + this.settings.ID_ASPECTS)\n this.paper.root.appendChild(divisionForAspects)\n\n this.universe = document.createElementNS(this.paper.root.namespaceURI, 'g')\n this.universe.setAttribute('id', this.paper.root.id + '-' + this.settings.ID_RADIX)\n this.paper.root.appendChild(this.universe)\n\n this.context = this\n }\n\n /**\n * Draw background\n */\n drawBg(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_BG, this.paper.root.id)\n\n const LARGE_ARC_FLAG = 1\n const start = 0 // degree\n const end = 359.99 // degree\n const hemisphere = this.paper.segment(this.cx, this.cy, this.radius - this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO, start, end, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, LARGE_ARC_FLAG)\n hemisphere.setAttribute('fill', this.settings.STROKE_ONLY ? 'none' : this.settings.COLOR_BACKGROUND)\n wrapper.appendChild(hemisphere)\n }\n\n /**\n * Draw universe.\n */\n drawUniverse(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_SIGNS, this.paper.root.id)\n\n // colors\n for (let i = 0, step = 30, start = this.shift, len = this.settings.COLORS_SIGNS.length; i < len; i++) {\n const segment = this.paper.segment(this.cx, this.cy, this.radius, start, start + step, this.radius - this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO)\n segment.setAttribute('fill', this.settings.STROKE_ONLY ? 'none' : this.settings.COLORS_SIGNS[i])\n segment.setAttribute('id', this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_SIGNS + '-' + i)\n segment.setAttribute('stroke', this.settings.STROKE_ONLY ? this.settings.CIRCLE_COLOR : 'none')\n segment.setAttribute('stroke-width', this.settings.STROKE_ONLY ? '1' : '0')\n wrapper.appendChild(segment)\n\n start += step\n }\n\n // signs\n for (let i = 0, step = 30, start = 15 + this.shift, len = this.settings.SYMBOL_SIGNS.length; i < len; i++) {\n const position = getPointPosition(this.cx, this.cy, this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO) / 2, start, this.settings)\n wrapper.appendChild(this.paper.getSymbol(this.settings.SYMBOL_SIGNS[i], position.x, position.y))\n start += step\n }\n }\n\n /**\n * Draw points\n */\n drawPoints(): void {\n if (this.data.planets == null) {\n return\n }\n\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_POINTS, this.paper.root.id)\n\n const gap = this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO)\n const step = (gap - 2 * (this.settings.PADDING * this.settings.SYMBOL_SCALE)) / Object.keys(this.data.planets).length\n\n const pointerRadius = this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + this.rulerRadius)\n let startPosition\n let endPosition\n\n for (const planet in this.data.planets) {\n if (this.data.planets.hasOwnProperty(planet)) {\n const position = getPointPosition(this.cx, this.cy, this.pointRadius, this.data.planets[planet][0] + this.shift, this.settings)\n const point = { name: planet, x: position.x, y: position.y, r: (this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE), angle: this.data.planets[planet][0] + this.shift, pointer: this.data.planets[planet][0] + this.shift }\n this.locatedPoints = assemble(this.locatedPoints, point, { cx: this.cx, cy: this.cy, r: this.pointRadius }, this.settings)\n }\n }\n\n if (this.settings.DEBUG) console.log('Radix count of points: ' + this.locatedPoints.length)\n if (this.settings.DEBUG) console.log('Radix located points:\\n' + JSON.stringify(this.locatedPoints))\n\n this.locatedPoints.forEach(function (point: LocatedPoint) {\n // draw pointer\n startPosition = getPointPosition(this.cx, this.cy, pointerRadius, this.data.planets[point.name][0] + this.shift, this.settings)\n endPosition = getPointPosition(this.cx, this.cy, pointerRadius - this.rulerRadius / 2, this.data.planets[point.name][0] + this.shift, this.settings)\n const pointer = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n pointer.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n pointer.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(pointer)\n\n // draw pointer line\n if (!this.settings.STROKE_ONLY && (this.data.planets[point.name][0] + this.shift) !== point.angle) {\n startPosition = endPosition\n endPosition = getPointPosition(this.cx, this.cy, this.pointRadius + (this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE), point.angle, this.settings)\n const line = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n line.setAttribute('stroke', this.settings.LINE_COLOR)\n line.setAttribute('stroke-width', 0.5 * (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(line)\n }\n\n // draw symbol\n const symbol = this.paper.getSymbol(point.name, point.x, point.y)\n symbol.setAttribute('id', this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_POINTS + '-' + point.name)\n wrapper.appendChild(symbol)\n\n // draw point descriptions\n let textsToShow = [(Math.floor(this.data.planets[point.name][0]) % 30).toString()]\n\n const zodiac = new Zodiac(this.data.cusps, this.settings)\n\n if (this.data.planets[point.name][1] && zodiac.isRetrograde(this.data.planets[point.name][1])) {\n textsToShow.push('R')\n } else {\n textsToShow.push('')\n }\n\n if (this.settings.SHOW_DIGNITIES_TEXT)\n textsToShow = textsToShow.concat(zodiac.getDignities({ name: point.name, position: this.data.planets[point.name][0] }, this.settings.DIGNITIES_EXACT_EXALTATION_DEFAULT).join(','))\n\n const pointDescriptions = getDescriptionPosition(point, textsToShow, this.settings)\n pointDescriptions.forEach(function (dsc) {\n wrapper.appendChild(this.paper.text(dsc.text, dsc.x, dsc.y, this.settings.POINTS_TEXT_SIZE, this.settings.SIGNS_COLOR))\n }, this)\n }, this)\n }\n\n drawAxis(): void {\n if (this.data.cusps == null) {\n return\n }\n\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_AXIS, this.paper.root.id)\n\n const axisRadius = this.radius + ((this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO) / 4)\n\n const AS = 0\n const IC = 3\n const DC = 6\n const MC = 9\n let overlapLine\n let startPosition\n let endPosition\n\n [AS, IC, DC, MC].forEach(function (i) {\n let textPosition\n // overlap\n startPosition = getPointPosition(this.cx, this.cy, this.radius, this.data.cusps[i] + this.shift, this.settings)\n endPosition = getPointPosition(this.cx, this.cy, axisRadius, this.data.cusps[i] + this.shift, this.settings)\n overlapLine = this.paper.line(startPosition.x, startPosition.y, endPosition.x, endPosition.y)\n overlapLine.setAttribute('stroke', this.settings.LINE_COLOR)\n overlapLine.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(overlapLine)\n\n // As\n if (i === AS) {\n // Text\n textPosition = getPointPosition(this.cx, this.cy, axisRadius + (20 * this.settings.SYMBOL_SCALE), this.data.cusps[i] + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol(this.settings.SYMBOL_AS, textPosition.x, textPosition.y))\n }\n\n // Ds\n if (i === DC) {\n // Text\n textPosition = getPointPosition(this.cx, this.cy, axisRadius + (2 * this.settings.SYMBOL_SCALE), this.data.cusps[i] + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol(this.settings.SYMBOL_DS, textPosition.x, textPosition.y))\n }\n\n // Ic\n if (i === IC) {\n // Text\n textPosition = getPointPosition(this.cx, this.cy, axisRadius + (10 * this.settings.SYMBOL_SCALE), this.data.cusps[i] - 2 + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol(this.settings.SYMBOL_IC, textPosition.x, textPosition.y))\n }\n\n // Mc\n if (i === MC) {\n // Text\n textPosition = getPointPosition(this.cx, this.cy, axisRadius + (10 * this.settings.SYMBOL_SCALE), this.data.cusps[i] + 2 + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol(this.settings.SYMBOL_MC, textPosition.x, textPosition.y))\n }\n }, this)\n }\n\n /**\n * Draw cusps\n */\n drawCusps(): void {\n if (this.data.cusps == null) {\n return\n }\n\n let lines\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_CUSPS, this.paper.root.id)\n\n const numbersRadius = this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO + (this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE)\n\n const AS = 0\n const IC = 3\n const DC = 6\n const MC = 9\n const mainAxis = [AS, IC, DC, MC]\n\n // Cusps\n for (let i = 0, ln = this.data.cusps.length; i < ln; i++) {\n // Draws a dashed line when an point is in the way\n lines = getDashedLinesPositions(\n this.cx,\n this.cy,\n this.data.cusps[i] + this.shift,\n this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO,\n this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + this.rulerRadius),\n this.pointRadius,\n this.locatedPoints,\n this.settings\n )\n\n lines.forEach(function (line) {\n const newLine = this.paper.line(line.startX, line.startY, line.endX, line.endY)\n newLine.setAttribute('stroke', this.settings.LINE_COLOR)\n\n if (mainAxis.includes(i)) {\n newLine.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE))\n } else {\n newLine.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n }\n\n wrapper.appendChild(newLine)\n }, this)\n\n // Cup number\n const deg360 = radiansToDegree(2 * Math.PI)\n const startOfCusp = this.data.cusps[i]\n const endOfCusp = this.data.cusps[(i + 1) % 12]\n const gap = endOfCusp - startOfCusp > 0 ? endOfCusp - startOfCusp : endOfCusp - startOfCusp + deg360\n const textPosition = getPointPosition(this.cx, this.cy, numbersRadius, ((startOfCusp + gap / 2) % deg360) + this.shift, this.settings)\n wrapper.appendChild(this.paper.getSymbol((i + 1).toString(), textPosition.x, textPosition.y))\n }\n }\n\n /**\n * Draw aspects\n * @param{Array<Object> | null} customAspects - posible custom aspects to draw;\n */\n aspects(customAspects?: FormedAspect[] | null): Radix {\n const aspectsList = customAspects != null && Array.isArray(customAspects)\n ? customAspects\n : new AspectCalculator(this.toPoints, this.settings).radix(this.data.planets)\n\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_ASPECTS, this.paper.root.id)\n\n const duplicateCheck: string[] = []\n\n for (let i = 0, ln = aspectsList.length; i < ln; i++) {\n const key = aspectsList[i].aspect.name + '-' + aspectsList[i].point.name + '-' + aspectsList[i].toPoint.name\n const opositeKey = aspectsList[i].aspect.name + '-' + aspectsList[i].toPoint.name + '-' + aspectsList[i].point.name\n if (!duplicateCheck.includes(opositeKey)) {\n duplicateCheck.push(key)\n\n const startPoint = getPointPosition(this.cx, this.cy, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, aspectsList[i].toPoint.position + this.shift, this.settings)\n const endPoint = getPointPosition(this.cx, this.cy, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO, aspectsList[i].point.position + this.shift, this.settings)\n\n const line = this.paper.line(startPoint.x, startPoint.y, endPoint.x, endPoint.y)\n line.setAttribute('stroke', this.settings.STROKE_ONLY ? this.settings.LINE_COLOR : aspectsList[i].aspect.color)\n line.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n\n line.setAttribute('data-name', aspectsList[i].aspect.name)\n line.setAttribute('data-degree', aspectsList[i].aspect.degree.toString())\n line.setAttribute('data-point', aspectsList[i].point.name)\n line.setAttribute('data-toPoint', aspectsList[i].toPoint.name)\n line.setAttribute('data-precision', aspectsList[i].precision.toString())\n\n wrapper.appendChild(line)\n }\n }\n\n return this.context\n }\n\n /**\n * Add points of interest for aspects calculation\n * @param {Obect} points, {\"As\":[0],\"Ic\":[90],\"Ds\":[180],\"Mc\":[270]}\n * @see (this.settings.AspectCalculator( toPoints) )\n */\n addPointsOfInterest(points: Points): Radix {\n for (const point in points) {\n if (points.hasOwnProperty(point)) {\n this.toPoints[point] = points[point]\n }\n }\n\n return this.context\n }\n\n drawRuler(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_RULER, this.paper.root.id)\n\n const startRadius = (this.radius - (this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO + this.rulerRadius))\n const rays = getRulerPositions(this.cx, this.cy, startRadius, startRadius + this.rulerRadius, this.shift, this.settings)\n\n rays.forEach(function (ray) {\n const line = this.paper.line(ray.startX, ray.startY, ray.endX, ray.endY)\n line.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n line.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE))\n wrapper.appendChild(line)\n }, this)\n\n const circle = this.paper.circle(this.cx, this.cy, startRadius)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n }\n\n /**\n * Draw circles\n */\n drawCircles(): void {\n const universe = this.universe\n const wrapper = getEmptyWrapper(universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_CIRCLES, this.paper.root.id)\n\n // indoor circle\n let circle = this.paper.circle(this.cx, this.cy, this.radius / this.settings.INDOOR_CIRCLE_RADIUS_RATIO)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CIRCLE_STRONG * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n\n // outdoor circle\n circle = this.paper.circle(this.cx, this.cy, this.radius)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CIRCLE_STRONG * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n\n // inner circle\n circle = this.paper.circle(this.cx, this.cy, this.radius - this.radius / this.settings.INNER_CIRCLE_RADIUS_RATIO)\n circle.setAttribute('stroke', this.settings.CIRCLE_COLOR)\n circle.setAttribute('stroke-width', (this.settings.CIRCLE_STRONG * this.settings.SYMBOL_SCALE).toString())\n wrapper.appendChild(circle)\n }\n\n /**\n * Display transit horoscope\n *\n * @param {Object} data\n * @example\n * {\n * \"planets\":{\"Moon\":[0], \"Sun\":[30], ... },\n * \"cusps\":[300, 340, 30, 60, 75, 90, 116, 172, 210, 236, 250, 274], *\n * }\n *\n * @return {Transit} transit\n */\n transit(data: AstroData): Transit {\n // remove axis (As, Ds, Mc, Ic) from radix\n getEmptyWrapper(this.universe, this.paper.root.id + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_AXIS, this.paper.root.id)\n const transit = new Transit(this.context, data, this.settings)\n transit.drawBg()\n transit.drawPoints()\n transit.drawCusps()\n transit.drawRuler()\n transit.drawCircles()\n return transit\n }\n}\n\nexport default Radix\n","import type { Settings } from './settings.js'\n\n/**\n * SVG tools.\n *\n * @class\n * @public\n * @constructor\n * @param {String} elementId - root DOM Element\n * @param {int} width\n * @param {int} height\n */\nclass SVG {\n settings: Settings\n _paperElementId: string\n DOMElement: SVGSVGElement\n root: Element\n width: number\n height: number\n context: this\n constructor(elementId: string, width: number, height: number, settings: Settings) {\n this.settings = settings\n const rootElement = document.getElementById(elementId)\n if (rootElement == null) throw new Error('Root element not found')\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink')\n svg.setAttribute('style', 'position: relative; overflow: hidden;')\n svg.setAttribute('version', '1.1')\n svg.setAttribute('width', width.toString())\n svg.setAttribute('height', height.toString())\n svg.setAttribute('viewBox', '0 0 ' + width + ' ' + height)\n rootElement.appendChild(svg)\n\n this._paperElementId = elementId + '-' + this.settings.ID_CHART\n\n const wrapper = document.createElementNS(svg.namespaceURI, 'g')\n wrapper.setAttribute('id', this._paperElementId)\n svg.appendChild(wrapper)\n\n this.DOMElement = svg\n this.root = wrapper\n this.width = width\n this.height = height\n\n this.context = this\n }\n\n _getSymbol(name: string, x: number, y: number): Element {\n switch (name) {\n case this.settings.SYMBOL_SUN:\n return this.sun(x, y)\n case this.settings.SYMBOL_MOON:\n return this.moon(x, y)\n case this.settings.SYMBOL_MERCURY:\n return this.mercury(x, y)\n case this.settings.SYMBOL_VENUS:\n return this.venus(x, y)\n case this.settings.SYMBOL_MARS:\n return this.mars(x, y)\n case this.settings.SYMBOL_JUPITER:\n return this.jupiter(x, y)\n case this.settings.SYMBOL_SATURN:\n return this.saturn(x, y)\n case this.settings.SYMBOL_URANUS:\n return this.uranus(x, y)\n case this.settings.SYMBOL_NEPTUNE:\n return this.neptune(x, y)\n case this.settings.SYMBOL_PLUTO:\n return this.pluto(x, y)\n case this.settings.SYMBOL_CHIRON:\n return this.chiron(x, y)\n case this.settings.SYMBOL_LILITH:\n return this.lilith(x, y)\n case this.settings.SYMBOL_NNODE:\n return this.nnode(x, y)\n case this.settings.SYMBOL_SNODE:\n return this.snode(x, y)\n case this.settings.SYMBOL_FORTUNE:\n return this.fortune(x, y)\n case this.settings.SYMBOL_ARIES:\n return this.aries(x, y)\n case this.settings.SYMBOL_TAURUS:\n return this.taurus(x, y)\n case this.settings.SYMBOL_GEMINI:\n return this.gemini(x, y)\n case this.settings.SYMBOL_CANCER:\n return this.cancer(x, y)\n case this.settings.SYMBOL_LEO:\n return this.leo(x, y)\n case this.settings.SYMBOL_VIRGO:\n return this.virgo(x, y)\n case this.settings.SYMBOL_LIBRA:\n return this.libra(x, y)\n case this.settings.SYMBOL_SCORPIO:\n return this.scorpio(x, y)\n case this.settings.SYMBOL_SAGITTARIUS:\n return this.sagittarius(x, y)\n case this.settings.SYMBOL_CAPRICORN:\n return this.capricorn(x, y)\n case this.settings.SYMBOL_AQUARIUS:\n return this.aquarius(x, y)\n case this.settings.SYMBOL_PISCES:\n return this.pisces(x, y)\n case this.settings.SYMBOL_AS:\n return this.ascendant(x, y)\n case this.settings.SYMBOL_DS:\n return this.descendant(x, y)\n case this.settings.SYMBOL_MC:\n return this.mediumCoeli(x, y)\n case this.settings.SYMBOL_IC:\n return this.immumCoeli(x, y)\n case this.settings.SYMBOL_CUSP_1:\n return this.number1(x, y)\n case this.settings.SYMBOL_CUSP_2:\n return this.number2(x, y)\n case this.settings.SYMBOL_CUSP_3:\n return this.number3(x, y)\n case this.settings.SYMBOL_CUSP_4:\n return this.number4(x, y)\n case this.settings.SYMBOL_CUSP_5:\n return this.number5(x, y)\n case this.settings.SYMBOL_CUSP_6:\n return this.number6(x, y)\n case this.settings.SYMBOL_CUSP_7:\n return this.number7(x, y)\n case this.settings.SYMBOL_CUSP_8:\n return this.number8(x, y)\n case this.settings.SYMBOL_CUSP_9:\n return this.number9(x, y)\n case this.settings.SYMBOL_CUSP_10:\n return this.number10(x, y)\n case this.settings.SYMBOL_CUSP_11:\n return this.number11(x, y)\n case this.settings.SYMBOL_CUSP_12:\n return this.number12(x, y)\n default: {\n const unknownPoint = this.circle(x, y, 8)\n unknownPoint.setAttribute('stroke', '#ffff00')\n unknownPoint.setAttribute('stroke-width', '1')\n unknownPoint.setAttribute('fill', '#ff0000')\n return unknownPoint\n }\n }\n }\n\n /**\n * Get a required symbol.\n *\n * @param {String} name\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGElement g}\n */\n getSymbol(name: string, x: number, y: number): Element {\n if (this.settings.CUSTOM_SYMBOL_FN == null) return this._getSymbol(name, x, y)\n\n const symbol = this.settings.CUSTOM_SYMBOL_FN(name, x, y, this.context)\n if (symbol == null || symbol === undefined) return this._getSymbol(name, x, y)\n\n return symbol\n }\n\n /**\n * Create transparent rectangle.\n *\n * Used to improve area click, @see this.settings.ADD_CLICK_AREA\n *\n * @param {Number} x\n * @param {Number} y\n *\n * @return {Element} rect\n */\n createRectForClick(x: number, y: number): Element {\n const rect = document.createElementNS(this.context.root.namespaceURI, 'rect')\n rect.setAttribute('x', (x - this.settings.SIGNS_STROKE).toString())\n rect.setAttribute('y', (y - this.settings.SIGNS_STROKE).toString())\n rect.setAttribute('width', '20px')\n rect.setAttribute('height', '20px')\n rect.setAttribute('fill', 'transparent')\n return rect\n }\n\n /**\n * Get ID for sign wrapper.\n *\n * @param {String} sign\n *\n * @return {String id}\n */\n getSignWrapperId(sign: string): string {\n return this._paperElementId + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_SIGNS + '-' + sign\n }\n\n /**\n * Get ID for house wrapper.\n *\n * @param {String} house\n *\n * @return {String id}\n */\n getHouseIdWrapper(house: string): string {\n return this._paperElementId + '-' + this.settings.ID_RADIX + '-' + this.settings.ID_CUSPS + '-' + house\n }\n\n /*\n * Sun path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVG g}\n */\n sun(x: number, y: number): Element {\n // center symbol\n const xShift = -1 // px\n const yShift = -8 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -2.18182,0.727268 -2.181819,1.454543 -1.454552,2.18182 -0.727268,2.181819 0,2.181819 0.727268,2.181819 1.454552,2.18182 2.181819,1.454544 2.18182,0.727276 2.18181,0 2.18182,-0.727276 2.181819,-1.454544 1.454552,-2.18182 0.727268,-2.181819 0,-2.181819 -0.727268,-2.181819 -1.454552,-2.18182 -2.181819,-1.454543 -2.18182,-0.727268 -2.18181,0 m 0.727267,6.54545 -0.727267,0.727276 0,0.727275 0.727267,0.727268 0.727276,0 0.727267,-0.727268 0,-0.727275 -0.727267,-0.727276 -0.727276,0 m 0,0.727276 0,0.727275 0.727276,0 0,-0.727275 -0.727276,0')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Moon path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n moon(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = -7 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' a 7.4969283,7.4969283 0 0 1 0,14.327462 7.4969283,7.4969283 0 1 0 0,-14.327462 z')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Mercury path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n mercury(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = 7 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const body = document.createElementNS(this.context.root.namespaceURI, 'path')\n body.setAttribute('d', 'm' + x + ', ' + y + ' 4.26011,0 m -2.13005,-2.98207 0,5.11213 m 4.70312,-9.7983 a 4.70315,4.70315 0 0 1 -4.70315,4.70314 4.70315,4.70315 0 0 1 -4.70314,-4.70314 4.70315,4.70315 0 0 1 4.70314,-4.70315 4.70315,4.70315 0 0 1 4.70315,4.70315 z')\n body.setAttribute('stroke', this.settings.POINTS_COLOR)\n body.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n body.setAttribute('fill', 'none')\n wrapper.appendChild(body)\n\n const crownXShift = 6 // px\n const crownYShift = -16 // px\n const crown = document.createElementNS(this.context.root.namespaceURI, 'path')\n crown.setAttribute('d', 'm' + (x + crownXShift) + ', ' + (y + crownYShift) + ' a 3.9717855,3.9717855 0 0 1 -3.95541,3.59054 3.9717855,3.9717855 0 0 1 -3.95185,-3.59445')\n crown.setAttribute('stroke', this.settings.POINTS_COLOR)\n crown.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n crown.setAttribute('fill', 'none')\n wrapper.appendChild(crown)\n\n return wrapper\n }\n\n /*\n * Venus path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n venus(x: number, y: number): Element {\n // center symbol\n const xShift = 2 // px\n const yShift = 7 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -4.937669,0.03973 m 2.448972,2.364607 0,-5.79014 c -3.109546,-0.0085 -5.624617,-2.534212 -5.620187,-5.64208 0.0044,-3.107706 2.526514,-5.621689 5.635582,-5.621689 3.109068,0 5.631152,2.513983 5.635582,5.621689 0.0044,3.107868 -2.510641,5.633586 -5.620187,5.64208')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Mars path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n mars(x: number, y: number): Element {\n // center symbol\n const xShift = 2 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' c -5.247438,-4.150623 -11.6993,3.205518 -7.018807,7.886007 4.680494,4.680488 12.036628,-1.771382 7.885999,-7.018816 z m 0,0 0.433597,0.433595 3.996566,-4.217419 m -3.239802,-0.05521 3.295015,0 0.110427,3.681507')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Jupiter path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n jupiter(x: number, y: number): Element {\n // center symbol\n const xShift = -5 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' c -0.43473,0 -1.30422,-0.40572 -1.30422,-2.02857 0,-1.62285 1.73897,-3.2457 3.47792,-3.2457 1.73897,0 3.47792,1.21715 3.47792,4.05713 0,2.83999 -2.1737,7.30283 -6.52108,7.30283 m 12.17269,0 -12.60745,0 m 9.99902,-11.76567 0,15.82279')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y - 3))\n\n return wrapper\n }\n\n /*\n * Saturn path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n saturn(x: number, y: number): Element {\n // center symbol\n const xShift = 5 // px\n const yShift = 10 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' c -0.52222,0.52221 -1.04445,1.04444 -1.56666,1.04444 -0.52222,0 -1.56667,-0.52223 -1.56667,-1.56667 0,-1.04443 0.52223,-2.08887 1.56667,-3.13332 1.04444,-1.04443 2.08888,-3.13331 2.08888,-5.22219 0,-2.08888 -1.04444,-4.17776 -3.13332,-4.17776 -1.97566,0 -3.65555,1.04444 -4.69998,3.13333 m -2.55515,-5.87499 6.26664,0 m -3.71149,-2.48054 0,15.14438')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Uranus path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n uranus(x: number, y: number): Element {\n // center symbol\n const xShift = -5 // px\n const yShift = -7 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const horns = document.createElementNS(this.context.root.namespaceURI, 'path')\n horns.setAttribute('d', 'm' + x + ', ' + y + ' 0,10.23824 m 10.23633,-10.32764 0,10.23824 m -10.26606,-4.6394 10.23085,0 m -5.06415,-5.51532 0,11.94985')\n horns.setAttribute('stroke', this.settings.POINTS_COLOR)\n horns.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n horns.setAttribute('fill', 'none')\n wrapper.appendChild(horns)\n\n const bodyXShift = 7 // px\n const bodyYShift = 14.5 // px\n const body = document.createElementNS(this.context.root.namespaceURI, 'path')\n body.setAttribute('d', 'm' + (x + bodyXShift) + ', ' + (y + bodyYShift) + ' a 1.8384377,1.8384377 0 0 1 -1.83844,1.83843 1.8384377,1.8384377 0 0 1 -1.83842,-1.83843 1.8384377,1.8384377 0 0 1 1.83842,-1.83844 1.8384377,1.8384377 0 0 1 1.83844,1.83844 z')\n body.setAttribute('stroke', this.settings.POINTS_COLOR)\n body.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n body.setAttribute('fill', 'none')\n wrapper.appendChild(body)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n\n return wrapper\n }\n\n /*\n * Neptune path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n neptune(x: number, y: number): Element {\n // center symbol\n const xShift = 3 // px\n const yShift = -5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' 1.77059,-2.36312 2.31872,1.8045 m -14.44264,-0.20006 2.34113,-1.77418 1.74085,2.38595 m -1.80013,-1.77265 c -1.23776,8.40975 0.82518,9.67121 4.95106,9.67121 4.12589,0 6.18883,-1.26146 4.95107,-9.67121 m -7.05334,3.17005 2.03997,-2.12559 2.08565,2.07903 m -5.32406,9.91162 6.60142,0 m -3.30071,-12.19414 0,15.55803')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Pluto path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n pluto(x: number, y: number): Element {\n // center symbol\n const xShift = 5 // px\n const yShift = -5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const body = document.createElementNS(this.context.root.namespaceURI, 'path')\n body.setAttribute('d', 'm' + x + ', ' + y + ' a 5.7676856,5.7676856 0 0 1 -2.88385,4.99496 5.7676856,5.7676856 0 0 1 -5.76768,0 5.7676856,5.7676856 0 0 1 -2.88385,-4.99496 m 5.76771,13.93858 0,-8.17088 m -3.84512,4.32576 7.69024,0')\n body.setAttribute('stroke', this.settings.POINTS_COLOR)\n body.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n body.setAttribute('fill', 'none')\n wrapper.appendChild(body)\n\n const headXShift = -2.3 // px\n const headYShift = 0 // px\n const head = document.createElementNS(this.context.root.namespaceURI, 'path')\n head.setAttribute('d', 'm' + (x + headXShift) + ', ' + (y + headYShift) + ' a 3.3644834,3.3644834 0 0 1 -3.36448,3.36449 3.3644834,3.3644834 0 0 1 -3.36448,-3.36449 3.3644834,3.3644834 0 0 1 3.36448,-3.36448 3.3644834,3.3644834 0 0 1 3.36448,3.36448 z')\n head.setAttribute('stroke', this.settings.POINTS_COLOR)\n head.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n head.setAttribute('fill', 'none')\n wrapper.appendChild(head)\n\n return wrapper\n }\n\n /*\n * Chiron path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n chiron(x: number, y: number): Element {\n // center symbol\n const xShift = 3 // px\n const yShift = 5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const body = document.createElementNS(this.context.root.namespaceURI, 'path')\n body.setAttribute('d', 'm' + x + ', ' + y + ' a 3.8764725,3.0675249 0 0 1 -3.876473,3.067525 3.8764725,3.0675249 0 0 1 -3.876472,-3.067525 3.8764725,3.0675249 0 0 1 3.876472,-3.067525 3.8764725,3.0675249 0 0 1 3.876473,3.067525 z')\n body.setAttribute('stroke', this.settings.POINTS_COLOR)\n body.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n body.setAttribute('fill', 'none')\n wrapper.appendChild(body)\n\n const headXShift = 0 // px\n const headYShift = -13 // px\n const head = document.createElementNS(this.context.root.namespaceURI, 'path')\n head.setAttribute('d', 'm' + (x + headXShift) + ', ' + (y + headYShift) + ' -3.942997,4.243844 4.110849,3.656151 m -4.867569,-9.009468 0,11.727251')\n head.setAttribute('stroke', this.settings.POINTS_COLOR)\n head.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n head.setAttribute('fill', 'none')\n wrapper.appendChild(head)\n\n return wrapper\n }\n\n /*\n * Lilith path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n lilith(x: number, y: number): Element {\n // center symbol\n const xShift = 2 // px\n const yShift = 4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -2.525435,-1.12853 -1.464752,-1.79539 -0.808138,-2.20576 0.151526,-2.05188 0.909156,-1.5389 1.010173,-1.02593 0.909157,-0.56427 1.363735,-0.61556 m 2.315327,-0.39055 -1.716301,0.54716 -1.7163,1.09431 -1.1442,1.64146 -0.572102,1.64146 0,1.64146 0.572102,1.64147 1.1442,1.64145 1.7163,1.09432 1.716301,0.54715 m 0,-11.49024 -2.2884,0 -2.288401,0.54716 -1.716302,1.09431 -1.144201,1.64146 -0.5721,1.64146 0,1.64146 0.5721,1.64147 1.144201,1.64145 1.716302,1.09432 2.288401,0.54715 2.2884,0 m -4.36712,-0.4752 0,6.44307 m -2.709107,-3.41101 5.616025,0')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * NNode path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n nnode(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = 3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -1.3333334,-0.6666667 -0.6666666,0 -1.3333334,0.6666667 -0.6666667,1.3333333 0,0.6666667 0.6666667,1.3333333 1.3333334,0.6666667 0.6666666,0 1.3333334,-0.6666667 0.6666666,-1.3333333 0,-0.6666667 -0.6666666,-1.3333333 -2,-2.66666665 -0.6666667,-1.99999995 0,-1.3333334 0.6666667,-2 1.3333333,-1.3333333 2,-0.6666667 2.6666666,0 2,0.6666667 1.3333333,1.3333333 0.6666667,2 0,1.3333334 -0.6666667,1.99999995 -2,2.66666665 -0.6666666,1.3333333 0,0.6666667 0.6666666,1.3333333 1.3333334,0.6666667 0.6666666,0 1.3333334,-0.6666667 0.6666667,-1.3333333 0,-0.6666667 -0.6666667,-1.3333333 -1.3333334,-0.6666667 -0.6666666,0 -1.3333334,0.6666667 m -7.9999999,-6 0.6666667,-1.3333333 1.3333333,-1.3333333 2,-0.6666667 2.6666666,0 2,0.6666667 1.3333333,1.3333333 0.6666667,1.3333333')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * SNode path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n snode(x: number, y: number): Element {\n // center symbol\n const xShift = 0\n const yShift = -5\n\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' l1.3333282470703125,0.666656494140625l0.6666717529296875,0l1.3333282470703125,-0.666656494140625l0.6666717529296875,-1.333343505859375l0,-0.666656494140625l-0.6666717529296875,-1.333343505859375l-1.3333282470703125,-0.666656494140625l-0.6666717529296875,0l-1.3333282470703125,0.666656494140625l-0.6666717529296875,1.333343505859375l0,0.666656494140625l0.6666717529296875,1.333343505859375l2,2.666656494140625l0.6666717529296875,2l0,1.333343505859375l-0.6666717529296875,2l-1.3333282470703125,1.333343505859375l-2,0.666656494140625l-2.6666717529296875,0l-2,-0.666656494140625l-1.3333282470703125,-1.333343505859375l-0.6666717529296875,-2l0,-1.333343505859375l0.6666717529296875,-2l2,-2.666656494140625l0.666656494140625,-1.333343505859375l0,-0.666656494140625l-0.666656494140625,-1.333343505859375l-1.333343505859375,-0.666656494140625l-0.666656494140625,0l-1.333343505859375,0.666656494140625l-0.666656494140625,1.333343505859375l0,0.666656494140625l0.666656494140625,1.333343505859375l1.333343505859375,0.666656494140625l0.666656494140625,0l1.333343505859375,-0.666656494140625m8,6l-0.6666717529296875,1.333343505859375l-1.3333282470703125,1.33331298828125l-2,0.66668701171875l-2.6666717529296875,0l-2,-0.66668701171875l-1.3333282470703125,-1.33331298828125l-0.6666717529296875,-1.333343505859375')\n node.setAttribute('stroke', this.settings.POINTS_COLOR)\n node.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /*\n * Fortune path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n fortune(x: number, y: number): Element {\n // center symbol\n const xShift = -10\n const yShift = -8\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const path1 = document.createElementNS(this.context.root.namespaceURI, 'path')\n path1.setAttribute('d', 'M15.971322059631348,8.000000953674316A7.971322252863855,7.971322252863855,0,0,1,8,15.97132396697998A7.971322252863855,7.971322252863855,0,0,1,0.028678132221102715,8.000000953674316A7.971322252863855,7.971322252863855,0,0,1,8,0.028677448630332947A7.971322252863855,7.971322252863855,0,0,1,15.971322059631348,8.000000953674316Z')\n const path2 = document.createElementNS(this.context.root.namespaceURI, 'path')\n path2.setAttribute('d', 'M2.668839454650879,2.043858766555786C6.304587364196777,5.906839370727539,9.94033432006836,9.769822120666504,13.576082229614258,13.632804870605469')\n const path3 = document.createElementNS(this.context.root.namespaceURI, 'path')\n path3.setAttribute('d', 'm2.5541272163391113,13.747519493103027c3.635746955871582,-3.8629846572875977,7.271494388580322,-7.72596549987793,10.90724229812622,-11.588947772979736')\n const fortuneGroup = document.createElementNS(this.context.root.namespaceURI, 'g')\n fortuneGroup.setAttribute('transform', 'translate(' + x + ',' + y + ')')\n fortuneGroup.appendChild(path1)\n fortuneGroup.appendChild(path2)\n fortuneGroup.appendChild(path3)\n\n\n wrapper.setAttribute('stroke', this.settings.POINTS_COLOR)\n wrapper.setAttribute('stroke-width', this.settings.POINTS_STROKE.toString())\n wrapper.setAttribute('fill', 'none')\n wrapper.appendChild(fortuneGroup)\n\n\n return wrapper\n }\n\n /*\n * Aries symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n aries(x: number, y: number): Element {\n // center symbol\n const xShift = -9 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_ARIES))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -0.9,-0.9 0,-1.8 0.9,-1.8 1.8,-0.8999998 1.8,0 1.8,0.8999998 0.9,0.9 0.9,1.8 0.9,4.5 m -9,-5.4 1.8,-1.8 1.8,0 1.8,0.9 0.9,0.9 0.9,1.8 0.9,3.6 0,9.9 m 8.1,-12.6 0.9,-0.9 0,-1.8 -0.9,-1.8 -1.8,-0.8999998 -1.8,0 -1.8,0.8999998 -0.9,0.9 -0.9,1.8 -0.9,4.5 m 9,-5.4 -1.8,-1.8 -1.8,0 -1.8,0.9 -0.9,0.9 -0.9,1.8 -0.9,3.6 0,9.9')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y - 4))\n\n return wrapper\n }\n\n /*\n * Taurus symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n taurus(x: number, y: number): Element {\n // center symbol\n const xShift = -9 // px\n const yShift = -11 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_TAURUS))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 1,4 1,2 2,2 3,1 4,0 3,-1 2,-2 1,-2 1,-4 m -18,0 1,3 1,2 2,2 3,1 4,0 3,-1 2,-2 1,-2 1,-3 m -11,8 -2,1 -1,1 -1,2 0,3 1,2 2,2 2,1 2,0 2,-1 2,-2 1,-2 0,-3 -1,-2 -1,-1 -2,-1 m -4,1 -2,1 -1,2 0,3 1,3 m 8,0 1,-3 0,-3 -1,-2 -2,-1')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Gemini symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n gemini(x: number, y: number): Element {\n // center symbol\n const xShift = -6 // px\n const yShift = -6 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_GEMINI))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 0,11.546414 m 0.9622011,-10.5842129 0,9.6220117 m 7.6976097,-9.6220117 0,9.6220117 m 0.962201,-10.5842128 0,11.546414 m -13.4708165,-14.4330172 1.9244023,1.924402 1.9244024,0.9622012 2.8866038,0.9622011 3.848804,0 2.886604,-0.9622011 1.924402,-0.9622012 1.924403,-1.924402 m -17.3196215,17.3196207 1.9244023,-1.9244024 1.9244024,-0.9622011 2.8866038,-0.9622012 3.848804,0 2.886604,0.9622012 1.924402,0.9622011 1.924403,1.9244024')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Cancer symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n cancer(x: number, y: number): Element {\n // center symbol\n const xShift = 9 // px\n const yShift = -9 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_CANCER))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -15,0 -2,1 -1,2 0,2 1,2 2,1 2,0 2,-1 1,-2 0,-2 -1,-2 11,0 m -18,3 1,2 1,1 2,1 m 4,-4 -1,-2 -1,-1 -2,-1 m -4,15 15,0 2,-1 1,-2 0,-2 -1,-2 -2,-1 -2,0 -2,1 -1,2 0,2 1,2 -11,0 m 18,-3 -1,-2 -1,-1 -2,-1 m -4,4 1,2 1,1 2,1')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x - 18, y))\n return wrapper\n }\n\n /*\n * Leo symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n leo(x: number, y: number): Element {\n // center symbol\n const xShift = -3 // px\n const yShift = 4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_LEO))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -2,-1 -1,0 -2,1 -1,2 0,1 1,2 2,1 1,0 2,-1 1,-2 0,-1 -1,-2 -5,-5 -1,-2 0,-3 1,-2 2,-1 3,-1 4,0 4,1 2,2 1,2 0,3 -1,3 -3,3 -1,2 0,2 1,2 2,0 1,-1 1,-2 m -13,-5 -2,-3 -1,-2 0,-3 1,-2 1,-1 m 7,-1 3,1 2,2 1,2 0,3 -1,3 -2,3')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x - 6, y - 13))\n return wrapper\n }\n\n /*\n * Virgo symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n virgo(x: number, y: number): Element {\n // center symbol\n const xShift = -9 // px\n const yShift = -5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_VIRGO))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 2.5894868,-2.5894868 1.7263245,2.5894868 0,9.4947847 m -2.5894868,-11.2211092 1.7263245,2.5894867 0,8.6316225 m 0.8631623,-9.4947847 2.5894867,-2.5894868 1.72632451,2.5894868 0,8.6316224 m -2.58948671,-10.3579469 1.72632447,2.5894867 0,7.7684602 m 0.86316224,-8.6316224 2.58948679,-2.5894868 1.7263244,2.5894868 0,13.8105959 m -2.5894867,-15.5369204 1.7263245,2.5894867 0,12.9474337 m 0.8631622,-13.8105959 2.5894868,-2.5894868 0.8631622,1.7263245 0.8631623,2.5894868 0,2.5894867 -0.8631623,2.58948673 -0.8631622,1.72632447 -1.7263245,1.7263245 -2.5894867,1.7263245 -4.3158113,1.7263245 m 7.7684602,-15.5369204 0.8631623,0.8631622 0.8631622,2.5894868 0,2.5894867 -0.8631622,2.58948673 -0.8631623,1.72632447 -1.7263245,1.7263245 -2.5894867,1.7263245 -3.452649,1.7263245')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Libra symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n libra(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = -8 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_LIBRA))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' c 0.7519,1e-5 1.3924,0.12227 1.9316,0.35156 0.6619,0.28495 1.2134,0.63854 1.666,1.0625 0.4838,0.45481 0.853,0.97255 1.1172,1.56641 0.2467,0.56612 0.3711,1.17397 0.3711,1.83789 0,0.64113 -0.1244,1.23948 -0.373,1.80859 -0.1624,0.36305 -0.3631,0.69725 -0.6055,1.00586 l -0.6367,0.8086 4.3789,0 0,0.67187 -5.4024,0 0,-0.91797 c 0.2173,-0.1385 0.4379,-0.27244 0.6367,-0.44726 0.4215,-0.36876 0.7529,-0.82784 0.9883,-1.35547 0.2215,-0.50074 0.334,-1.0358 0.334,-1.58594 0,-0.55653 -0.1122,-1.09434 -0.334,-1.5957 l -0,-0.002 0,-0.004 c -0.2292,-0.49901 -0.5581,-0.94778 -0.9746,-1.33789 l -0,-0.002 -0,-0.002 c -0.3967,-0.36155 -0.8679,-0.65723 -1.4062,-0.88476 l -0,0 c -0.4984,-0.20903 -1.0622,-0.30663 -1.6817,-0.30664 -0.5926,1e-5 -1.1526,0.10008 -1.6699,0.30273 l -0,0 c -0.5261,0.20799 -1.0032,0.5067 -1.4199,0.88867 l -0,0.002 -0,0.002 c -0.4166,0.39011 -0.7454,0.83887 -0.9746,1.33789 l 0,0.004 -0,0.002 c -0.2218,0.50136 -0.334,1.03915 -0.334,1.5957 0,0.55015 0.1125,1.08519 0.334,1.58594 l 0,0.002 0,0.004 c 0.229,0.49855 0.5574,0.94911 0.9746,1.33984 0.1876,0.17482 0.4143,0.31484 0.6367,0.45703 l 0,0.91797 -5.3906,0 0,-0.67187 4.3789,0 -0.6367,-0.8086 c -0.2428,-0.30904 -0.443,-0.64418 -0.6055,-1.00781 -0.2487,-0.56911 -0.3731,-1.16552 -0.3731,-1.80664 0,-0.66391 0.1244,-1.27178 0.3711,-1.83789 l 0,-0.002 c 3e-4,-5.8e-4 -2e-4,-10e-4 0,-0.002 0.2641,-0.59218 0.6326,-1.10871 1.1153,-1.5625 0.4847,-0.45571 1.0332,-0.80585 1.6562,-1.05859 0.5861,-0.23488 1.2294,-0.35546 1.9414,-0.35547 z m -7.8496,13.45899 15.6992,0 0,0.67187 -15.6992,0 z')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x - 6, y))\n return wrapper\n }\n\n /*\n * Scorpio symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n scorpio(x: number, y: number): Element {\n // center symbol\n const xShift = -9 // px\n const yShift = -4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_SCORPIO))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 2.3781101,-2.3781101 2.3781101,2.3781101 0,9.5124404 m -3.1708135,-11.0978471 2.3781101,2.3781101 0,8.719737 m 0.7927034,-9.5124404 2.3781101,-2.3781101 2.37811007,2.3781101 0,9.5124404 m -3.17081347,-11.0978471 2.3781101,2.3781101 0,8.719737 m 0.79270337,-9.5124404 2.37811013,-2.3781101 2.3781101,2.3781101 0,8.719737 1.5854067,1.5854068 m -4.7562202,-11.8905505 2.3781101,2.3781101 0,8.719737 1.5854067,1.5854067 2.3781101,-2.3781101')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Sagittarius symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n sagittarius(x: number, y: number): Element {\n // center symbol\n const xShift = 7 // px\n const yShift = -9 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_SAGITTARIUS))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -17.11444,17.11444 m 17.11444,-17.11444 -3.2089575,1.0696525 -6.417915,0 m 7.4875675,1.0696525 -3.2089575,0 -4.27861,-1.0696525 m 9.6268725,-1.0696525 -1.0696525,3.2089575 0,6.41791504 m -1.0696525,-7.48756754 0,3.2089575 1.0696525,4.27861004 m -8.55722,0 -7.4875675,0 m 6.417915,1.06965246 -3.2089575,0 -3.2089575,-1.06965246 m 7.4875675,0 0,7.48756746 m -1.0696525,-6.417915 0,3.2089575 1.0696525,3.2089575')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x - 12, y))\n return wrapper\n }\n\n /*\n * Capricorn symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n capricorn(x: number, y: number): Element {\n // center symbol\n const xShift = -9 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_CAPRICORN))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 1.8047633,-3.6095267 4.5119084,9.0238168 m -4.5119084,-7.2190534 4.5119084,9.0238167 2.707145,-6.3166717 4.5119084,0 2.707145,-0.9023817 0.9023817,-1.8047633 0,-1.8047634 -0.9023817,-1.8047633 -1.8047634,-0.9023817 -0.9023816,0 -1.8047634,0.9023817 -0.9023817,1.8047633 0,1.8047634 0.9023817,2.707145 0.9023817,1.80476336 0.9023817,2.70714504 0,2.707145 -1.8047634,1.8047633 m 1.8047634,-16.2428701 -0.9023817,0.9023817 -0.9023817,1.8047633 0,1.8047634 1.8047634,3.6095267 0.9023816,2.707145 0,2.707145 -0.9023816,1.8047634 -1.8047634,0.9023816')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Aquarius symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n aquarius(x: number, y: number): Element {\n // center symbol\n const xShift = -8 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_AQUARIUS))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 2.8866035,-2.8866035 3.8488047,1.9244023 m -4.8110059,-0.9622011 3.8488047,1.9244023 2.8866035,-2.8866035 2.8866035,1.9244023 m -3.84880467,-0.9622011 2.88660347,1.9244023 2.8866035,-2.8866035 1.9244024,1.9244023 m -2.8866035,-0.9622011 1.9244023,1.9244023 2.8866035,-2.8866035 m -17.319621,8.6598105 2.8866035,-2.88660348 3.8488047,1.92440238 m -4.8110059,-0.96220121 3.8488047,1.92440231 2.8866035,-2.88660348 2.8866035,1.92440238 m -3.84880467,-0.96220121 2.88660347,1.92440231 2.8866035,-2.88660348 1.9244024,1.92440238 m -2.8866035,-0.96220121 1.9244023,1.92440231 2.8866035,-2.88660348')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /*\n * Pisces symbol path\n * @private\n *\n * @param {int} x\n * @param {int} y\n *\n * @return {SVGPathElement} path\n */\n pisces(x: number, y: number): Element {\n // center symbol\n const xShift = -8 // px\n const yShift = -8 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getSignWrapperId(this.settings.SYMBOL_PISCES))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' 4,2 2,2 1,3 0,3 -1,3 -2,2 -4,2 m 0,-17 3,1 2,1 2,2 1,3 m 0,3 -1,3 -2,2 -2,1 -3,1 m 16,-17 -3,1 -2,1 -2,2 -1,3 m 0,3 1,3 2,2 2,1 3,1 m 0,-17 -4,2 -2,2 -1,3 0,3 1,3 2,2 4,2 m -17,-9 18,0 m -18,1 18,0')\n node.setAttribute('stroke', this.settings.SIGNS_COLOR)\n node.setAttribute('stroke-width', this.settings.SIGNS_STROKE.toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /**\n * Draw As symbol\n */\n ascendant(x: number, y: number): Element {\n // center symbol\n const xShift = 12 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -0.563078,-1.1261527 -1.689228,-0.5630765 -1.689229,0 -1.68923,0.5630765 -0.563076,1.1261527 0.563076,1.12615272 1.126154,0.56307636 2.815381,0.56307635 1.126152,0.56307647 0.563078,1.1261526 0,0.5630763 -0.563078,1.1261528 -1.689228,0.5630764 -1.689229,0 -1.68923,-0.5630764 -0.563076,-1.1261528 m -6.756916,-10.135374 -4.504611,11.8246032 m 4.504611,-11.8246032 4.504611,11.8246032 m -7.3199925,-3.94153457 5.6307625,0')\n node.setAttribute('stroke', this.settings.SYMBOL_AXIS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /**\n * Draw Ds symbol\n */\n descendant(x: number, y: number): Element {\n // center symbol\n const xShift = 22 // px\n const yShift = -1 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -0.5625,-1.125 -1.6875,-0.5625 -1.6875,0 -1.6875,0.5625 -0.5625,1.125 0.5625,1.125 1.125,0.5625 2.8125,0.5625 1.125,0.5625 0.5625,1.125 0,0.5625 -0.5625,1.125 -1.6875,0.5625 -1.6875,0 -1.6875,-0.5625 -0.5625,-1.125 m -11.25,-10.125 0,11.8125 m 0,-11.8125 3.9375,0 1.6875,0.5625 1.125,1.125 0.5625,1.125 0.5625,1.6875 0,2.8125 -0.5625,1.6875 -0.5625,1.125 -1.125,1.125 -1.6875,0.5625 -3.9375,0')\n node.setAttribute('stroke', this.settings.SYMBOL_AXIS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /**\n * Draw MC symbol\n */\n mediumCoeli(x: number, y: number): Element {\n // center symbol\n const xShift = 19 // px\n const yShift = -4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -1.004085,-1.0040845 -1.004084,-0.5020423 -1.506127,0 -1.004085,0.5020423 -1.004084,1.0040845 -0.502043,1.50612689 0,1.00408458 0.502043,1.50612683 1.004084,1.0040846 1.004085,0.5020423 1.506127,0 1.004084,-0.5020423 1.004085,-1.0040846 m -17.57148,-9.0367612 0,10.5428881 m 0,-10.5428881 4.016338,10.5428881 m 4.016338,-10.5428881 -4.016338,10.5428881 m 4.016338,-10.5428881 0,10.5428881')\n node.setAttribute('stroke', this.settings.SYMBOL_AXIS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n /**\n * Draw IC symbol\n */\n immumCoeli(x: number, y: number): Element {\n // center symbol\n const xShift = 19 // px\n const yShift = 2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm ' + x + ', ' + y + ' -1.208852,-1.2088514 -1.208851,-0.6044258 -1.813278,0 -1.208852,0.6044258 -1.20885,1.2088514 -0.604426,1.81327715 0,1.20885135 0.604426,1.8132772 1.20885,1.2088513 1.208852,0.6044259 1.813278,0 1.208851,-0.6044259 1.208852,-1.2088513 m -11.4840902,-10.8796629 0,12.6929401')\n node.setAttribute('stroke', this.settings.SYMBOL_AXIS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.SYMBOL_AXIS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n return wrapper\n }\n\n number1(x: number, y: number): Element {\n // center symbol\n const xShift = 0 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_1))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -2.5128753,7.7578884 1.00515009,0 m 3.01545031,-9.5832737 -1.0051501,1.8253853 -2.51287527,7.7578884 m 3.51802537,-9.5832737 -3.01545031,9.5832737 m 3.01545031,-9.5832737 -1.5077251,1.3690388 -1.50772521,0.9126929 -1.00515009,0.4563463 m 2.5128753,-0.9126927 -1.00515016,0.4563464 -1.50772514,0.4563463')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number2(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_2))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' 0,-0.4545454 0.4545454,0 0,0.9090909 -0.9090909,0 0,-0.9090909 0.4545455,-0.9090909 0.4545454,-0.4545455 1.36363637,-0.4545454 1.36363633,0 1.3636364,0.4545454 0.4545455,0.9090909 0,0.9090909 -0.4545455,0.909091 -0.9090909,0.9090909 -4.5454546,2.72727269 -0.9090909,0.90909091 -0.9090909,1.8181818 m 6.8181818,-9.0909091 0.4545455,0.9090909 0,0.9090909 -0.4545455,0.909091 -0.9090909,0.9090909 -1.36363633,0.9090909 m 1.36363633,-5 0.4545455,0.4545454 0.4545454,0.9090909 0,0.9090909 -0.4545454,0.909091 -0.9090909,0.9090909 -3.6363637,2.72727269 m -1.3636363,1.81818181 0.4545454,-0.4545454 0.9090909,0 2.27272732,0.4545454 2.27272728,0 0.4545454,-0.4545454 m -5,0 2.27272732,0.9090909 2.27272728,0 m -4.5454546,-0.9090909 2.27272732,1.3636363 1.36363638,0 0.9090909,-0.4545454 0.4545454,-0.9090909 0,-0.4545455')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number3(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_3))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' 0,-0.4545454 0.45454549,0 0,0.9090909 -0.90909089,0 0,-0.9090909 0.4545454,-0.9090909 0.45454549,-0.4545455 1.36363636,-0.4545454 1.36363635,0 1.3636364,0.4545454 0.4545454,0.9090909 0,0.9090909 -0.4545454,0.909091 -0.4545455,0.4545454 -0.9090909,0.4545455 -1.36363635,0.4545454 m 2.27272725,-4.0909091 0.4545455,0.9090909 0,0.9090909 -0.4545455,0.909091 -0.4545454,0.4545454 m -0.4545455,-3.6363636 0.4545455,0.4545454 0.4545454,0.9090909 0,0.9090909 -0.4545454,0.909091 -0.9090909,0.9090909 -0.90909095,0.4545454 m -0.9090909,0 0.9090909,0 1.36363635,0.4545455 0.4545455,0.45454542 0.4545454,0.90909091 0,1.36363637 -0.4545454,0.9090909 -0.9090909,0.4545455 -1.3636364,0.4545454 -1.3636364,0 -1.3636363,-0.4545454 -0.4545455,-0.4545455 -0.4545454,-0.9090909 0,-0.90909091 0.9090909,0 0,0.90909091 -0.4545455,0 0,-0.45454546 m 5,-1.81818182 0.4545455,0.90909091 0,1.36363637 -0.4545455,0.9090909 m -1.36363635,-4.0909091 0.90909095,0.4545455 0.4545454,0.90909088 0,1.81818182 -0.4545454,0.9090909 -0.45454549,0.4545455 -0.90909091,0.4545454')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number4(x: number, y: number): Element {\n // center symbol\n const xShift = 1 // px\n const yShift = -4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_4))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -2.28678383,7.7750651 0.91471356,0 m 2.74414057,-9.6044922 -0.9147135,1.8294271 -2.28678386,7.7750651 m 3.20149736,-9.6044922 -2.74414057,9.6044922 m 2.74414057,-9.6044922 -7.3177083,6.8603516 7.3177083,0')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number5(x: number, y: number): Element {\n // center symbol\n const xShift = -2 // px\n const yShift = -5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_5))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -2.27272725,4.5454545 m 2.27272725,-4.5454545 4.54545455,0 m -4.54545455,0.4545454 3.63636365,0 m -4.0909091,0.4545455 2.2727273,0 1.8181818,-0.4545455 0.9090909,-0.4545454 m -6.8181818,4.5454545 0.4545454,-0.4545454 1.3636364,-0.4545455 1.36363636,0 1.36363634,0.4545455 0.4545455,0.4545454 0.4545454,0.90909092 0,1.36363638 -0.4545454,1.3636364 -0.9090909,0.9090909 -1.81818185,0.4545454 -1.36363635,0 -0.9090909,-0.4545454 -0.4545455,-0.4545455 -0.4545454,-0.9090909 0,-0.9090909 0.9090909,0 0,0.9090909 -0.4545455,0 0,-0.45454545 m 5,-2.72727275 0.4545455,0.90909092 0,1.36363638 -0.4545455,1.3636364 -0.9090909,0.9090909 m -0.45454544,-5.4545455 0.90909094,0.4545455 0.4545454,0.9090909 0,1.8181818 -0.4545454,1.3636364 -0.90909094,0.9090909 -0.90909091,0.4545454')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number6(x: number, y: number): Element {\n // center symbol\n const xShift = 3 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_6))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' 0,-0.4545455 -0.4545455,0 0,0.9090909 0.9090909,0 0,-0.9090909 -0.4545454,-0.9090909 -0.909091,-0.4545454 -1.3636363,0 -1.36363638,0.4545454 -0.90909092,0.9090909 -0.9090909,1.3636364 -0.4545455,1.3636364 -0.4545454,1.81818178 0,1.36363636 0.4545454,1.36363636 0.4545455,0.4545455 0.9090909,0.4545454 1.36363637,0 1.36363633,-0.4545454 0.9090909,-0.9090909 0.4545455,-0.90909096 0,-1.36363636 -0.4545455,-0.90909088 -0.4545454,-0.4545455 -0.9090909,-0.4545454 -1.36363638,0 -0.90909092,0.4545454 -0.4545454,0.4545455 -0.4545455,0.90909088 m 1.36363636,-4.54545458 -0.90909086,1.3636364 -0.4545455,1.3636364 -0.4545455,1.81818178 0,1.81818182 0.4545455,0.9090909 m 4.0909091,-0.4545454 0.4545454,-0.90909096 0,-1.36363636 -0.4545454,-0.90909088 m -0.9090909,-5 -0.90909093,0.4545454 -0.90909091,1.3636364 -0.45454546,0.9090909 -0.4545454,1.3636364 -0.4545455,1.81818178 0,2.27272732 0.4545455,0.9090909 0.4545454,0.4545454 m 1.36363637,0 0.90909093,-0.4545454 0.4545454,-0.4545455 0.4545455,-1.36363636 0,-1.81818182 -0.4545455,-0.90909092 -0.4545454,-0.4545454')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number7(x: number, y: number): Element {\n // center symbol\n const xShift = -4 // px\n const yShift = -4 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_7))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -0.9090909,2.7272727 m 6.8181818,-2.7272727 -0.4545454,1.3636363 -0.909091,1.3636364 -1.8181818,2.2727273 -0.90909088,1.36363633 -0.45454546,1.36363637 -0.45454545,1.8181818 m 0.90909091,-3.63636362 -0.90909091,1.81818182 -0.45454546,1.8181818 m 4.09090905,-6.8181818 -2.72727268,2.72727272 -0.90909091,1.36363637 -0.45454546,0.90909091 -0.45454545,1.8181818 0.90909091,0 m -1.36363641,-8.1818182 1.36363641,-1.3636363 0.90909091,0 2.27272728,1.3636363 m -3.63636365,-0.9090909 1.36363637,0 2.27272728,0.9090909 m -4.5454546,0 0.90909095,-0.4545454 1.36363637,0 2.27272728,0.4545454 0.9090909,0 0.4545455,-0.4545454 0.4545454,-0.9090909')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number8(x: number, y: number): Element {\n // center symbol\n const xShift = -1 // px\n const yShift = -5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_8))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -1.3631244,0.4543748 -0.4543748,0.4543748 -0.4543748,0.9087496 0,1.3631244 0.4543748,0.9087496 0.9087496,0.4543748 1.3631244,0 1.3631244,-0.4543748 0.9087496,-0.4543748 0.4543748,-0.9087496 0,-1.3631244 -0.4543748,-0.9087496 -0.9087496,-0.4543748 -1.8174992,0 m 0.9087496,0 -2.271874,0.4543748 m 0,0.4543748 -0.4543748,0.9087496 0,1.8174992 0.4543748,0.4543748 m -0.4543748,0 1.3631244,0.4543748 m 0.4543748,0 1.8174992,-0.4543748 m 0.4543748,-0.4543748 0.4543748,-0.9087496 0,-1.3631244 -0.4543748,-0.9087496 m 0.4543748,0 -1.8174992,-0.4543748 m -0.9087496,0 -0.9087496,0.9087496 -0.4543748,0.9087496 0,1.8174992 0.4543748,0.9087496 m 1.3631244,0 0.9087496,-0.4543748 0.4543748,-0.4543748 0.4543748,-0.9087496 0,-1.8174992 -0.4543748,-0.9087496 m -2.7262488,4.543748 -1.8174992,0.4543748 -0.9087496,0.90874964 -0.4543748,0.9087496 0,1.36312436 0.4543748,0.9087496 1.3631244,0.4543748 1.8174992,0 1.8174992,-0.4543748 0.4543748,-0.4543748 0.4543748,-0.9087496 0,-1.36312436 -0.4543748,-0.9087496 -0.4543748,-0.45437484 -0.9087496,-0.4543748 m -0.9087496,0 -2.271874,0.4543748 m 0.4543748,0 -0.9087496,0.90874964 -0.4543748,0.9087496 0,1.36312436 0.4543748,0.9087496 m -0.4543748,0 2.271874,0.4543748 2.7262488,-0.4543748 m 0,-0.4543748 0.4543748,-0.9087496 0,-1.36312436 -0.4543748,-0.9087496 m 0,-0.45437484 -1.3631244,-0.4543748 m -0.9087496,0 -0.9087496,0.4543748 -0.9087496,0.90874964 -0.4543748,0.9087496 0,1.36312436 0.4543748,0.9087496 0.4543748,0.4543748 m 1.8174992,0 0.9087496,-0.4543748 0.4543748,-0.4543748 0.4543748,-0.9087496 0,-1.81749916 -0.4543748,-0.90874964 -0.4543748,-0.4543748')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number9(x: number, y: number): Element {\n // center symbol\n const xShift = 1 // px\n const yShift = -2 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_9))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const node = document.createElementNS(this.context.root.namespaceURI, 'path')\n node.setAttribute('d', 'm' + x + ', ' + y + ' -0.4545455,0.9090909 -0.4545454,0.4545455 -0.9090909,0.45454542 -1.36363638,0 -0.90909092,-0.45454542 -0.4545454,-0.4545455 -0.4545455,-0.9090909 0,-1.3636364 0.4545455,-0.9090909 0.90909086,-0.9090909 1.36363637,-0.4545454 1.36363637,0 0.9090909,0.4545454 0.4545455,0.4545455 0.4545454,1.3636363 0,1.3636364 -0.4545454,1.81818182 -0.4545455,1.36363637 -0.9090909,1.36363641 -0.9090909,0.9090909 -1.36363638,0.4545454 -1.36363632,0 -0.909091,-0.4545454 -0.4545454,-0.9090909 0,-0.90909096 0.9090909,0 0,0.90909096 -0.4545455,0 0,-0.4545455 m 1.3636364,-3.1818182 -0.4545454,-0.9090909 0,-1.3636364 0.4545454,-0.9090909 m 4.0909091,-0.4545454 0.4545455,0.9090909 0,1.8181818 -0.4545455,1.81818182 -0.4545455,1.36363637 -0.9090909,1.36363641 m -1.81818178,-2.72727278 -0.45454546,-0.45454542 -0.45454546,-0.9090909 0,-1.8181819 0.45454546,-1.3636363 0.45454546,-0.4545455 0.90909091,-0.4545454 m 1.36363637,0 0.4545454,0.4545454 0.4545455,0.9090909 0,2.2727273 -0.4545455,1.81818182 -0.4545454,1.36363637 -0.4545455,0.90909091 -0.90909087,1.3636364 -0.90909091,0.4545454')\n node.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n node.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n node.setAttribute('fill', 'none')\n wrapper.appendChild(node)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number10(x: number, y: number): Element {\n // center symbol\n const xShift = -3 // px\n const yShift = -3.5 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_10))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const one = document.createElementNS(this.context.root.namespaceURI, 'path')\n one.setAttribute('d', 'm' + x + ', ' + y + ' -2.28795747,7.7790553 0.91518297,0 m 2.7455489,-9.6094213 -0.9151829,1.830366 -2.28795748,7.7790553 m 3.20314038,-9.6094213 -2.7455489,9.6094213 m 2.7455489,-9.6094213 -1.3727744,1.3727745 -1.3727745,0.915183 -0.91518297,0.4575915 m 2.28795747,-0.915183 -0.91518301,0.4575915 -1.37277446,0.4575915')\n one.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n one.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n one.setAttribute('fill', 'none')\n wrapper.appendChild(one)\n\n const numberXShift = 6.5 // px\n const numberYShift = -1.5 // px\n const zero = document.createElementNS(this.context.root.namespaceURI, 'path')\n zero.setAttribute('d', 'm' + (x + numberXShift) + ', ' + (y + numberYShift) + ' -1.36363638,0.4545454 -0.90909092,0.9090909 -0.9090909,1.3636364 -0.4545455,1.3636364 -0.4545454,1.81818178 0,1.36363636 0.4545454,1.36363636 0.4545455,0.4545455 0.9090909,0.4545454 0.90909092,0 1.36363638,-0.4545454 0.9090909,-0.9090909 0.9090909,-1.36363641 0.4545455,-1.36363637 0.4545454,-1.81818182 0,-1.3636364 -0.4545454,-1.3636363 -0.4545455,-0.4545455 -0.9090909,-0.4545454 -0.9090909,0 m -1.36363638,0.9090909 -0.90909092,0.9090909 -0.4545454,0.9090909 -0.4545455,1.3636364 -0.4545455,1.81818178 0,1.81818182 0.4545455,0.9090909 m 3.1818182,0 0.9090909,-0.9090909 0.4545454,-0.90909091 0.4545455,-1.36363637 0.4545455,-1.81818182 0,-1.8181818 -0.4545455,-0.9090909 m -1.8181818,-0.9090909 -0.90909093,0.4545454 -0.90909091,1.3636364 -0.45454546,0.9090909 -0.4545454,1.3636364 -0.4545455,1.81818178 0,2.27272732 0.4545455,0.9090909 0.4545454,0.4545454 m 0.90909092,0 0.90909091,-0.4545454 0.90909087,-1.3636364 0.4545455,-0.90909091 0.4545454,-1.36363637 0.4545455,-1.81818182 0,-2.2727273 -0.4545455,-0.9090909 -0.4545454,-0.4545454')\n zero.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n zero.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n zero.setAttribute('fill', 'none')\n wrapper.appendChild(zero)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number11(x: number, y: number): Element {\n // center symbol\n const xShift = -3 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_11))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const one = document.createElementNS(this.context.root.namespaceURI, 'path')\n one.setAttribute('d', 'm' + x + ', ' + y + ' -2.28795747,7.7790553 0.91518297,0 m 2.7455489,-9.6094213 -0.9151829,1.830366 -2.28795748,7.7790553 m 3.20314038,-9.6094213 -2.7455489,9.6094213 m 2.7455489,-9.6094213 -1.3727744,1.3727745 -1.3727745,0.915183 -0.91518297,0.4575915 m 2.28795747,-0.915183 -0.91518301,0.4575915 -1.37277446,0.4575915')\n one.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n one.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n one.setAttribute('fill', 'none')\n wrapper.appendChild(one)\n\n const numberXShift = 6 // px\n const numberYShift = 0 // px\n const one2 = document.createElementNS(this.context.root.namespaceURI, 'path')\n one2.setAttribute('d', 'm' + (x + numberXShift) + ', ' + (y + numberYShift) + ' -2.28795747,7.7790553 0.91518297,0 m 2.7455489,-9.6094213 -0.9151829,1.830366 -2.28795748,7.7790553 m 3.20314038,-9.6094213 -2.7455489,9.6094213 m 2.7455489,-9.6094213 -1.3727744,1.3727745 -1.3727745,0.915183 -0.91518297,0.4575915 m 2.28795747,-0.915183 -0.91518301,0.4575915 -1.37277446,0.4575915')\n one2.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n one2.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n one2.setAttribute('fill', 'none')\n wrapper.appendChild(one2)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n number12(x: number, y: number): Element {\n // center symbol\n const xShift = -3 // px\n const yShift = -3 // px\n x = Math.round(x + (xShift * this.settings.SYMBOL_SCALE))\n y = Math.round(y + (yShift * this.settings.SYMBOL_SCALE))\n\n const wrapper = document.createElementNS(this.context.root.namespaceURI, 'g')\n wrapper.setAttribute('id', this.getHouseIdWrapper(this.settings.SYMBOL_CUSP_12))\n wrapper.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n\n const one = document.createElementNS(this.context.root.namespaceURI, 'path')\n one.setAttribute('d', 'm' + x + ', ' + y + ' -2.28795747,7.7790553 0.91518297,0 m 2.7455489,-9.6094213 -0.9151829,1.830366 -2.28795748,7.7790553 m 3.20314038,-9.6094213 -2.7455489,9.6094213 m 2.7455489,-9.6094213 -1.3727744,1.3727745 -1.3727745,0.915183 -0.91518297,0.4575915 m 2.28795747,-0.915183 -0.91518301,0.4575915 -1.37277446,0.4575915')\n one.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n one.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n one.setAttribute('fill', 'none')\n wrapper.appendChild(one)\n\n const numberXShift = 4 // px\n const numberYShift = 1 // px\n const two = document.createElementNS(this.context.root.namespaceURI, 'path')\n two.setAttribute('d', 'm' + (x + numberXShift) + ', ' + (y + numberYShift) + ' 0,-0.4545454 0.4545454,0 0,0.9090909 -0.9090909,0 0,-0.9090909 0.4545455,-0.9090909 0.4545454,-0.4545455 1.36363637,-0.4545454 1.36363633,0 1.3636364,0.4545454 0.4545455,0.9090909 0,0.9090909 -0.4545455,0.909091 -0.9090909,0.9090909 -4.5454546,2.72727269 -0.9090909,0.90909091 -0.9090909,1.8181818 m 6.8181818,-9.0909091 0.4545455,0.9090909 0,0.9090909 -0.4545455,0.909091 -0.9090909,0.9090909 -1.36363633,0.9090909 m 1.36363633,-5 0.4545455,0.4545454 0.4545454,0.9090909 0,0.9090909 -0.4545454,0.909091 -0.9090909,0.9090909 -3.6363637,2.72727269 m -1.3636363,1.81818181 0.4545454,-0.4545454 0.9090909,0 2.27272732,0.4545454 2.27272728,0 0.4545454,-0.4545454 m -5,0 2.27272732,0.9090909 2.27272728,0 m -4.5454546,-0.9090909 2.27272732,1.3636363 1.36363638,0 0.9090909,-0.4545454 0.4545454,-0.9090909 0,-0.4545455')\n two.setAttribute('stroke', this.settings.CUSPS_FONT_COLOR)\n two.setAttribute('stroke-width', (this.settings.CUSPS_STROKE * this.settings.SYMBOL_SCALE).toString())\n two.setAttribute('fill', 'none')\n wrapper.appendChild(two)\n\n if (this.settings.ADD_CLICK_AREA) wrapper.appendChild(this.createRectForClick(x, y))\n return wrapper\n }\n\n /**\n * Draw circular sector\n *\n * @param {int} x - circle x center position\n * @param {int} y - circle y center position\n * @param {int} radius - circle radius in px\n * @param {int} a1 - angleFrom in degree\n * @param {int} a2 - angleTo in degree\n * @param {int} thickness - from outside to center in px\n *\n * @return {SVGElement} segment\n *\n * @see SVG Path arc: https://www.w3.org/TR/SVG/paths.html#PathData\n */\n segment(x: number, y: number, radius: number, a1: number, a2: number, thickness: number, lFlag?: number, sFlag?: number): Element {\n // @see SVG Path arc: https://www.w3.org/TR/SVG/paths.html#PathData\n const LARGE_ARC_FLAG = lFlag || 0\n const SWEET_FLAG = sFlag || 0\n\n a1 = ((this.settings.SHIFT_IN_DEGREES - a1) % 360) * Math.PI / 180\n a2 = ((this.settings.SHIFT_IN_DEGREES - a2) % 360) * Math.PI / 180\n\n const segment = document.createElementNS(this.context.root.namespaceURI, 'path')\n segment.setAttribute('d', 'M ' + (x + thickness * Math.cos(a1)) + ', ' + (y + thickness * Math.sin(a1)) + ' l ' + ((radius - thickness) * Math.cos(a1)) + ', ' + ((radius - thickness) * Math.sin(a1)) + ' A ' + radius + ', ' + radius + ',0 ,' + LARGE_ARC_FLAG + ', ' + SWEET_FLAG + ', ' + (x + radius * Math.cos(a2)) + ', ' + (y + radius * Math.sin(a2)) + ' l ' + ((radius - thickness) * -Math.cos(a2)) + ', ' + ((radius - thickness) * -Math.sin(a2)) + ' A ' + thickness + ', ' + thickness + ',0 ,' + LARGE_ARC_FLAG + ', ' + 1 + ', ' + (x + thickness * Math.cos(a1)) + ', ' + (y + thickness * Math.sin(a1)))\n segment.setAttribute('fill', 'none')\n return segment\n }\n\n /**\n * Draw line in circle\n *\n * @param {int} x1\n * @param {int} y2\n * @param {int} x2\n * @param {int} y2\n * @param {String} color - HTML rgb\n *\n * @return {SVGElement} line\n */\n line(x1: number, y1: number, x2: number, y2: number): Element {\n const line = document.createElementNS(this.context.root.namespaceURI, 'line')\n line.setAttribute('x1', x1.toString())\n line.setAttribute('y1', y1.toString())\n line.setAttribute('x2', x2.toString())\n line.setAttribute('y2', y2.toString())\n return line\n }\n\n /**\n * Draw a circle\n *\n * @param {int} cx\n * @param {int} cy\n * @param {int} radius\n *\n * @return {SVGElement} circle\n */\n circle(cx: number, cy: number, radius: number): Element {\n const circle = document.createElementNS(this.context.root.namespaceURI, 'circle')\n circle.setAttribute('cx', cx.toString())\n circle.setAttribute('cy', cy.toString())\n circle.setAttribute('r', radius.toString())\n circle.setAttribute('fill', 'none')\n return circle\n }\n\n /**\n * Draw a text\n *\n * @param {String} text\n * @param {int} x\n * @param {int} y\n * @param {String} size - etc. \"13px\"\n * @param {String} color - HTML rgb\n *\n * @return {SVGElement} text\n */\n text(txt: string, x: number, y: number, size: string, color: string): Element {\n const text = document.createElementNS(this.context.root.namespaceURI, 'text')\n text.setAttribute('x', x.toString())\n text.setAttribute('y', y.toString())\n text.setAttribute('font-size', size)\n text.setAttribute('fill', color)\n text.setAttribute('font-family', 'serif')\n text.setAttribute('dominant-baseline', 'central')\n text.appendChild(document.createTextNode(txt))\n text.setAttribute('transform', 'translate(' + (-x * (this.settings.SYMBOL_SCALE - 1)) + ',' + (-y * (this.settings.SYMBOL_SCALE - 1)) + ') scale(' + this.settings.SYMBOL_SCALE + ')')\n return text\n }\n}\n\nexport default SVG\n","import default_settings from './settings.js' \nimport type { Settings } from './settings.js'\nimport Radix from './radix.js'\nimport type { AstroData } from './radix.js'\nimport SVG from './svg.js'\nimport { getPointPosition } from './utils.js'\n/**\n * Displays astrology charts.\n *\n * @class\n * @public\n * @constructor\n * @param {String} elementId - root DOMElement\n * @param {int} width\n * @param {int} height\n * @param {Object} settings\n */\n\nclass Chart {\n paper: SVG\n cx: number\n cy: number\n radius: number\n settings: Settings\n constructor (elementId: string, width: number, height: number, settings?: Partial<Settings>) {\n const chartSettings = default_settings\n if (settings != null) {\n Object.assign(chartSettings, settings)\n if (!('COLORS_SIGNS' in settings)) chartSettings.COLORS_SIGNS = [default_settings.COLOR_ARIES, default_settings.COLOR_TAURUS, default_settings.COLOR_GEMINI, default_settings.COLOR_CANCER, default_settings.COLOR_LEO, default_settings.COLOR_VIRGO, default_settings.COLOR_LIBRA, default_settings.COLOR_SCORPIO, default_settings.COLOR_SAGITTARIUS, default_settings.COLOR_CAPRICORN, default_settings.COLOR_AQUARIUS, default_settings.COLOR_PISCES]\n }\n\n if ((elementId !== '') && (document.getElementById(elementId) == null)) {\n const paper = document.createElement('div')\n paper.setAttribute('id', elementId)\n document.body.appendChild(paper)\n }\n\n this.paper = new SVG(elementId, width, height, chartSettings)\n this.cx = this.paper.width / 2\n this.cy = this.paper.height / 2\n this.radius = this.paper.height / 2 - chartSettings.MARGIN\n this.settings = chartSettings\n }\n\n /**\n * Display radix horoscope\n *\n * @param {Object} data\n * @example\n * {\n * \"points\":{\"Moon\":[0], \"Sun\":[30], ... },\n * \"cusps\":[300, 340, 30, 60, 75, 90, 116, 172, 210, 236, 250, 274]\n * }\n *\n * @return {Radix} radix\n */\n radix (data: AstroData): Radix {\n const radix = new Radix(this.paper, this.cx, this.cy, this.radius, data, this.settings)\n\n radix.drawBg()\n radix.drawUniverse()\n radix.drawRuler()\n radix.drawPoints()\n radix.drawCusps()\n radix.drawAxis()\n radix.drawCircles()\n\n return radix\n }\n\n /**\n * Scale chart\n *\n * @param {int} factor\n */\n scale (factor: number): void {\n this.paper.root.setAttribute('transform', 'translate(' + (-this.cx * (factor - 1)) + ',' + (-this.cy * (factor - 1)) + ') scale(' + factor + ')')\n }\n\n /**\n * Draw the symbol on the axis.\n * For debug only.\n *\n */\n calibrate (): Chart {\n let positions\n let circle\n let line\n const startRadius = 60\n\n const planets = ['Sun', 'Moon', 'Mercury', 'Venus', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Pluto', 'Chiron', 'Lilith', 'NNode']\n\n for (let planet = 0; planet < planets.length; planet++) {\n positions = getPointPosition(this.cx, this.cy, this.radius * 2, planet * 30, this.settings)\n\n line = this.paper.line(this.cx, this.cy, positions.x, positions.y)\n line.setAttribute('stroke', this.settings.LINE_COLOR)\n this.paper.root.appendChild(line)\n\n circle = this.paper.circle(this.cx, this.cy, startRadius + startRadius * planet)\n circle.setAttribute('stroke', this.settings.LINE_COLOR)\n circle.setAttribute('stroke-width', '1')\n this.paper.root.appendChild(circle)\n }\n\n for (let n = 0, ln = planets.length; n < ln; n++) {\n const radius = startRadius + startRadius * n\n\n for (let i = 0; i < 12; i++) {\n positions = getPointPosition(this.cx, this.cy, radius, i * 30, this.settings)\n\n circle = this.paper.circle(positions.x, positions.y, this.settings.COLLISION_RADIUS * this.settings.SYMBOL_SCALE)\n circle.setAttribute('stroke', 'red')\n circle.setAttribute('stroke-width', '1')\n this.paper.root.appendChild(circle)\n\n this.paper.root.appendChild(this.paper.getSymbol(planets[n], positions.x, positions.y))\n }\n }\n\n return this\n }\n}\n\nexport default Chart\n"],"mappings":"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"}
|