@turf/ellipse
Version:
Takes a Point and calculates the ellipse polygon given two semi-axes expressed in variable units and steps for precision.
1 lines • 9.15 kB
Source Map (JSON)
{"version":3,"sources":["/home/runner/work/turf/turf/packages/turf-ellipse/dist/cjs/index.cjs","../../index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/turf/turf/packages/turf-ellipse/dist/cjs/index.cjs","sourcesContent":[null,"import {\n polygon,\n isObject,\n isNumber,\n Coord,\n Units,\n point,\n radiansToDegrees,\n} from \"@turf/helpers\";\nimport { destination } from \"@turf/destination\";\nimport { transformRotate } from \"@turf/transform-rotate\";\nimport { getCoord } from \"@turf/invariant\";\nimport { GeoJsonProperties, Feature, Polygon, Position } from \"geojson\";\n\n/**\n * Takes a {@link Point} and calculates the ellipse polygon given two semi-axes expressed in variable units and steps for precision.\n *\n * @param {Coord} center center point\n * @param {number} xSemiAxis semi (major) axis of the ellipse along the x-axis\n * @param {number} ySemiAxis semi (minor) axis of the ellipse along the y-axis\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.angle=0] angle of rotation in decimal degrees, positive clockwise\n * @param {Coord} [options.pivot=center] point around which any rotation will be performed\n * @param {number} [options.steps=64] number of steps\n * @param {Units} [options.units='kilometers'] unit of measurement for axes. Supports all valid Turf {@link https://turfjs.org/docs/api/types/Units Units}\n * @param {Object} [options.properties={}] properties\n * @returns {Feature<Polygon>} ellipse polygon\n * @example\n * var center = [-75, 40];\n * var xSemiAxis = 5;\n * var ySemiAxis = 2;\n * var ellipse = turf.ellipse(center, xSemiAxis, ySemiAxis);\n *\n * //addToMap\n * var addToMap = [turf.point(center), ellipse]\n */\nfunction ellipse(\n center: Coord,\n xSemiAxis: number,\n ySemiAxis: number,\n options: {\n steps?: number;\n units?: Units;\n angle?: number;\n pivot?: Coord;\n properties?: GeoJsonProperties;\n }\n): Feature<Polygon> {\n // Optional params\n options = options || {};\n let steps = options.steps || 64;\n const units = options.units || \"kilometers\";\n let angle = options.angle || 0;\n const pivot = options.pivot || center;\n const properties = options.properties || {};\n // validation\n if (!center) throw new Error(\"center is required\");\n if (!xSemiAxis) throw new Error(\"xSemiAxis is required\");\n if (!ySemiAxis) throw new Error(\"ySemiAxis is required\");\n if (!isObject(options)) throw new Error(\"options must be an object\");\n if (!isNumber(steps)) throw new Error(\"steps must be a number\");\n if (!isNumber(angle)) throw new Error(\"angle must be a number\");\n\n const centerCoords = getCoord(\n transformRotate(point(getCoord(center)), angle, { pivot })\n );\n\n angle = -90 + angle;\n\n // Divide steps by 4 for one quadrant\n steps = Math.ceil(steps / 4);\n\n let quadrantParameters = [];\n let parameters = [];\n\n const a = xSemiAxis;\n const b = ySemiAxis;\n\n // Gradient x intersect\n const c = b;\n\n // Gradient of line\n const m = (a - b) / (Math.PI / 2);\n\n // Area under line\n const A = ((a + b) * Math.PI) / 4;\n\n // Weighting function\n const v = 0.5;\n\n const k = steps;\n\n let w = 0;\n let x = 0;\n\n for (let i = 0; i < steps; i++) {\n x += w;\n\n if (m === 0) {\n // It's a circle, so use simplified c*w - A/k == 0\n w = A / k / c;\n } else {\n // Otherwise, use full (v*m)*w^2 + (m*x+c)*w - A/k == 0\n // Solve as quadratic ax^2 + bx + c = 0\n w =\n (-(m * x + c) +\n Math.sqrt(Math.pow(m * x + c, 2) - 4 * (v * m) * -(A / k))) /\n (2 * (v * m));\n }\n if (x != 0) {\n // easier to add it later to avoid having twice the same point\n quadrantParameters.push(x);\n }\n }\n\n //NE\n parameters.push(0);\n for (let i = 0; i < quadrantParameters.length; i++) {\n parameters.push(quadrantParameters[i]);\n }\n //NW\n parameters.push(Math.PI / 2);\n for (let i = 0; i < quadrantParameters.length; i++) {\n parameters.push(\n Math.PI - quadrantParameters[quadrantParameters.length - i - 1]\n );\n }\n //SW\n parameters.push(Math.PI);\n for (let i = 0; i < quadrantParameters.length; i++) {\n parameters.push(Math.PI + quadrantParameters[i]);\n }\n //SE\n parameters.push((3 * Math.PI) / 2);\n for (let i = 0; i < quadrantParameters.length; i++) {\n parameters.push(\n 2 * Math.PI - quadrantParameters[quadrantParameters.length - i - 1]\n );\n }\n parameters.push(0);\n\n // We can now construct the ellipse\n const coords: Position[] = [];\n for (const param of parameters) {\n const theta = Math.atan2(b * Math.sin(param), a * Math.cos(param));\n const r = Math.sqrt(\n (Math.pow(a, 2) * Math.pow(b, 2)) /\n (Math.pow(a * Math.sin(theta), 2) + Math.pow(b * Math.cos(theta), 2))\n );\n coords.push(\n destination(centerCoords, r, angle + radiansToDegrees(theta), {\n units: units,\n }).geometry.coordinates\n );\n }\n return polygon([coords], properties);\n}\n\nexport { ellipse };\nexport default ellipse;\n"]}