如何用它的长度出现相同长度的行绘制椭圆?
很容易用一个圆圈,我可以写
之类的东西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
,您会注意到,这与双重转换相同。