如何将法向量绘制为椭圆

时间:2014-02-07 02:37:20

标签: graphics vector calculus

如何绘制一个椭圆形,其长度相同的线条?

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

这样的东西
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) ;
}

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

1 个答案:

答案 0 :(得分: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
你会注意到,

与双重转换相同。