source: node_modules/d3-geo/src/circle.js@ e4c61dd

Last change on this file since e4c61dd was e4c61dd, checked in by istevanoska <ilinastevanoska@…>, 6 months ago

Prototype 1.1

  • Property mode set to 100644
File size: 2.3 KB
Line 
1import {cartesian, cartesianNormalizeInPlace, spherical} from "./cartesian.js";
2import constant from "./constant.js";
3import {acos, cos, degrees, epsilon, radians, sin, tau} from "./math.js";
4import {rotateRadians} from "./rotation.js";
5
6// Generates a circle centered at [0°, 0°], with a given radius and precision.
7export function circleStream(stream, radius, delta, direction, t0, t1) {
8 if (!delta) return;
9 var cosRadius = cos(radius),
10 sinRadius = sin(radius),
11 step = direction * delta;
12 if (t0 == null) {
13 t0 = radius + direction * tau;
14 t1 = radius - step / 2;
15 } else {
16 t0 = circleRadius(cosRadius, t0);
17 t1 = circleRadius(cosRadius, t1);
18 if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;
19 }
20 for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
21 point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
22 stream.point(point[0], point[1]);
23 }
24}
25
26// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
27function circleRadius(cosRadius, point) {
28 point = cartesian(point), point[0] -= cosRadius;
29 cartesianNormalizeInPlace(point);
30 var radius = acos(-point[1]);
31 return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;
32}
33
34export default function() {
35 var center = constant([0, 0]),
36 radius = constant(90),
37 precision = constant(2),
38 ring,
39 rotate,
40 stream = {point: point};
41
42 function point(x, y) {
43 ring.push(x = rotate(x, y));
44 x[0] *= degrees, x[1] *= degrees;
45 }
46
47 function circle() {
48 var c = center.apply(this, arguments),
49 r = radius.apply(this, arguments) * radians,
50 p = precision.apply(this, arguments) * radians;
51 ring = [];
52 rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
53 circleStream(stream, r, p, 1);
54 c = {type: "Polygon", coordinates: [ring]};
55 ring = rotate = null;
56 return c;
57 }
58
59 circle.center = function(_) {
60 return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center;
61 };
62
63 circle.radius = function(_) {
64 return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius;
65 };
66
67 circle.precision = function(_) {
68 return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision;
69 };
70
71 return circle;
72}
Note: See TracBrowser for help on using the repository browser.