【问题标题】:Draw ellipse with 5points in canvas在画布中绘制 5 个点的椭圆
【发布时间】:2019-11-15 01:21:21
【问题描述】:

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

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

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

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

我无法将该等式转换为 js。如果你能帮我从 5 个任意点计算椭圆的大半径和小半径以及中心点,我将不胜感激

【问题讨论】:

    标签: javascript geometry html5-canvas coordinates


    【解决方案1】:

    有5个点,你可以找到这个矩阵的圆锥曲线(这里是椭圆)扩展行列式的一般公式(用你的点坐标替换xi,yi):

    (图片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

    【讨论】:

    • 需要根据公式 rx 和 ry 计算 A、B、C、D、E、F。但在我的场景中,我只有 5 个任意坐标。 (x1,y1),(x2,y2),(x3,y3),(x4,y4) 和 (x5,y5) 将由用户通过单击画布给出。使用这 5 个坐标,我想获得椭圆的大半径和小半径以及中心点。使用 ctx.ellipse(centerx, centery, radiusX, radiusY, rotation, startAngle, endAngle [, 逆时针]);将绘制椭圆。
    • A,B,C,D,E,F 应该从矩阵计算。该矩阵是一般圆锥方程的替代形式。用一些符号数学包计算行列式(我添加了一个链接)(或用铅笔和很多纸)
    猜你喜欢
    • 2011-01-11
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多