javascript - 在 Canvas 上绘制有 5 个点的椭圆

标签 javascript geometry html5-canvas coordinates

我的数学不太好。我需要使用 5 个坐标绘制一个椭圆,其中用户将单击 Canvas 中的 5 个不同位置,并获取将绘制的单击坐标 1 个椭圆。要在 Canvas 上绘制椭圆,我有方法

ctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle [, anticlockwise]);

我需要椭圆的中心位置和2半径。我只有椭圆周长的 5 个坐标。我得到了一个计算椭圆的矩阵公式。

ax2+bxy+cy2+dx+ey+f=0

我无法将该方程转换为 js。如果您能帮我从任意 5 个点计算椭圆的长短半径和圆心,我将非常感谢

最佳答案

有5个点,您可以找到该矩阵的圆锥曲线(此处为椭圆)扩展行列式的一般公式(用您的点坐标替换xi,yi):

enter image description here

(图片taken here)

Simple example to begin with

使用my answer for inverse problem

//calc implicit ellipse equation
//semiaxes rx, ry; rotated at fi radians; centered at (cx,cy)
//note: implicit form Ax^2+Bxy+Cy^2+Dx+Ey+F=0 (not 2B,2D,2E)

// in Pascal notation Sqr is squared
B := Sin(2 * Fi) * (ry * ry - rx * rx);
A := Sqr(ry * Cos(fi)) + Sqr(rx * Sin(fi));
C := Sqr(rx * Cos(fi)) + Sqr(ry * Sin(fi));
D := -B * cy - 2 * A * cx;
E := -2 * C * cy - B * cx;
F := C * cy * cy + A * cx * cx + B * cx * cy - rx * rx * ry * ry;

我们可以看到

Fi = 0.5 * atan2(B, A-C)

然后

ry^2+rx^2 = A + C
ry^2-rx^2 = B / Sin(2*Fi)

所以

ry = Sqrt((A + C + B / Sin(2*Fi))/2)
rx = Sqrt((A + C - B / Sin(2*Fi))/2)

(除了 Fi=0 的情况,我们可以直接从 A 和 C 中提取半轴)

然后从D/E方程组中求出cx、cy

另请参阅Wiki formulas对于同样的问题

关于javascript - 在 Canvas 上绘制有 5 个点的椭圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58832206/

相关文章:

CSS:将鼠标悬停在隐藏文本上时带有背景图像的圆圈会变形

javascript - 如何将 ColorMatrix 与 Canvas Context 一起应用

javascript - 使用 CSS 在 div 上切换位置?

java - 无法在三角形的相邻边之间绘制圆弧

javascript - 哪些文本可以复制但不能搜索?

javascript - 编写类并实现功能

javascript - 调用Canvas Rendering Context2D.fill Text时Y坐标定义了什么?

javascript - 无法使用 Javascript 访问 Polymer 自定义元素内的 Canvas 元素

javascript - 重复 div 元素 n 次

javascript - 禁用鼠标右键单击并且不要在 Javascript 中更改光标位置