繁体   English   中英

如何将法线向量绘制为椭圆

[英]How to draw normal vectors to an ellipse

如何绘制出具有相同长度的线的椭圆?

用圆圈很容易,我可以写一些像

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) ;
}

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

有几种思考方法。

您可以将椭圆视为已沿某个方向拉伸的圆。 在这种情况下,您已取圆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

您将注意到,它与双重转换相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM