【问题标题】:How to draw normal vectors to an ellipse如何将法线向量绘制到椭圆
【发布时间】:2014-02-07 02:37:19
【问题描述】:

我如何画一个椭圆,其中的直线长度相同?

用圆圈很容易,我可以写类似的东西

for (u = 0 ; u < 2*pi ; u += 0.001*pi) {
    drawdot (cos(u), sin(u)) ;
    drawline (cos(u), sin(u), 2*cos(u), 2*sin(u) ;
} 

但如果我对椭圆这样做,如下所示,线条的长度不同。

for (u = 0 ; u < 2*pi ; u += 0.001*pi) {
    drawdot (2*cos(u), sin(u)) ;
    drawline (2*cos(u), sin(u), 4*cos(u), 2*sin(u) ;
}

我如何弄清楚如何使它们的长度相同?

【问题讨论】:

    标签: graphics vector calculus


    【解决方案1】:

    对此有几种思考方式。

    你可以把椭圆想象成一个向某个方向拉伸的圆。在本例中,您采用圆 x^2 + y^2 = 1 并将变换应用于该曲线上的所有点:

    x' = 2x
    y' = y
    

    你可以把它想象成乘以矩阵:

    [ 2  0 ]
    [ 0  1 ]
    

    要转换法线,您需要应用此矩阵的逆转置(即转置的逆,或逆的转置;这是同一件事):

    [ 1/2  0 ]
    [  0   1 ]
    

    (顺便说一下,这被称为先前变换的对偶。这是现代几何中非常重要的操作。)

    圆在点 (x,y) 的法线朝向 (x,y) 方向。因此,椭圆在点 (2x,y) 的法线方向为 (0.5*x,y)。这表明:

    for (u = 0 ; u < 2*pi ; u += 0.001*pi) {
        x = cos(u); y = sin(u);
        drawdot (2*x, y) ;
        drawline (2*x, y, 2*x + 0.5*x, y+y);
    }
    

    或者如果你需要一个正常的单位:

    for (u = 0 ; u < 2*pi ; u += 0.001*pi) {
        x = cos(u); y = sin(u);
        drawdot (2*x, y) ;
        dx = 0.5*x;
        dy = y;
        invm = 1 / sqrt(dx*dx + dy*dy);
        drawline (2*x, y, 2*x + dx * invm, y + dy * invm);
    }
    

    另一种思考方式是隐式轮廓。如果通过函数定义曲线:

    f(x,y) = 0
    

    那么法向量指向的方向:

    (df/dx, df/dy)
    

    其中导数是偏导数。在你的情况下:

    f(x,y) = (x/2)^2 + y^2 = 0
    
    df/dx = x/2
    df/dy = y
    

    您会注意到,这与对偶转换相同。

    【讨论】:

    • 这正是我所需要的。我现在明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多