使用代码回答问题的一部分
如何通过椭圆曲线上一对点的坐标找到椭圆的中心。
这是一个TypeScript函数,它基于Sergey Illinsky的优秀答案(在我的看法中有些不完整)。它计算具有给定半径的椭圆的中心,条件是提供的两个点a
和b
必须位于椭圆的周长上。由于此问题通常有两个解决方案,因此代码选择将椭圆放置在这两个点“上方”的解决方案:
(请注意,椭圆的长轴和短轴必须平行于水平/垂直)
export type Point = [number, number];
function deltaXY (from: Point, to: Point): Point {
return [to[0]-from[0], to[1]-from[1]];
}
function vecAdd (...vectors: Point[]): Point {
return vectors.reduce((acc, curr) => [acc[0]+curr[0], acc[1]+curr[1]], [0, 0]);
}
function topLeftOfPointsCenter (a: Point, b: Point, rX: number, rY: number): Point {
const delta = deltaXY(a, b);
const A = Math.asin(Math.sqrt((delta[0]/(2*rX))**2+(delta[1]/(2*rY))**2));
const B = Math.atan(-delta[0]/delta[1] * rY/rX);
const alpha = A + B;
let newCenter = vecAdd(a, [
rX * Math.cos(alpha),
rY * Math.sin(alpha)
]);
const mean = vecAdd(a, [delta[0] * 0.5, delta[1] * 0.5]);
const factor = mean[1] > newCenter[1] ? 1 : -1;
const offMean = deltaXY(mean, newCenter);
newCenter = vecAdd(mean, [offMean[0] * factor, offMean[1] * factor]);
return newCenter;
}
此函数不会检查解决方案是否可行,也就是说,提供的半径是否足够连接这两个点!
r2
放入sqrt
中会使其符号消失,从而导致某些情况下得到错误的结果! - Taco de Wolffr2
应该是(y1 - y2) / (2 * b)
(而不是(y2 - y1) / (2 * b)
),并且a1
的结果为arctan(-r1/r2)
(而不是arctan(r1/r2)
)。在我的实现中,原始方程导致椭圆位于 x1、y1 的相反侧,而通过我的更改,椭圆现在处于正确的位置。 - Timwi