diff --git a/packages/math/angle.ts b/packages/math/angle.ts
index 0d477a9e1a..6adbc99115 100644
--- a/packages/math/angle.ts
+++ b/packages/math/angle.ts
@@ -60,8 +60,14 @@ export const normalizeRadians = (angle: Radians): Radians => {
export const cartesian2Polar =
([
x,
y,
-]: P): PolarCoords =>
- polar(Math.hypot(x, y), normalizeRadians(radians(Math.atan2(y, x))));
+]: P): PolarCoords => {
+ const [radius, angle] = polar(
+ Math.hypot(x, y),
+ normalizeRadians(radians(Math.atan2(y, x))),
+ );
+
+ return [radius, normalizeRadians(angle)] as PolarCoords;
+};
/**
* Convert an angle in degrees into randians
diff --git a/packages/math/arc.ts b/packages/math/arc.ts
index 47d2434f4f..37f84e7554 100644
--- a/packages/math/arc.ts
+++ b/packages/math/arc.ts
@@ -25,7 +25,10 @@ export function arc(
startAngle: Radians,
endAngle: Radians,
) {
- return { center, radius, startAngle, endAngle } as Arc;
+ const start = normalizeRadians(startAngle);
+ const end = normalizeRadians(endAngle);
+
+ return { center, radius, startAngle: start, endAngle: end } as Arc;
}
/**
@@ -100,11 +103,10 @@ export function arcSegmentInterceptPoints(
pointFrom(candidate[0] - a.center[0], candidate[1] - a.center[1]),
);
- return a.startAngle < a.endAngle
- ? Math.abs(a.radius - candidateRadius) < PRECISION &&
- a.startAngle <= candidateAngle &&
- a.endAngle >= candidateAngle
- : a.startAngle <= candidateAngle || a.endAngle >= candidateAngle;
+ return Math.abs(a.radius - candidateRadius) < PRECISION &&
+ a.startAngle > a.endAngle
+ ? a.startAngle <= candidateAngle || a.endAngle >= candidateAngle
+ : a.startAngle <= candidateAngle && a.endAngle >= candidateAngle;
});
}
@@ -128,11 +130,10 @@ export function arcLineInterceptPoints(
pointFrom(candidate[0] - a.center[0], candidate[1] - a.center[1]),
);
- return a.startAngle < a.endAngle
- ? Math.abs(a.radius - candidateRadius) < PRECISION &&
- a.startAngle <= candidateAngle &&
- a.endAngle >= candidateAngle
- : a.startAngle <= candidateAngle || a.endAngle >= candidateAngle;
+ return Math.abs(a.radius - candidateRadius) < PRECISION &&
+ a.startAngle > a.endAngle
+ ? a.startAngle <= candidateAngle || a.endAngle >= candidateAngle
+ : a.startAngle <= candidateAngle && a.endAngle >= candidateAngle;
});
}