如何将正常向量绘制到椭圆形



如何用它的长度出现相同长度的行绘制椭圆?

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

之类的东西
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)处的圆的正常值(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

,您会注意到,这与双重转换相同。

最新更新