如何绘制一个椭圆形,其长度相同的线条?
用圆圈很容易,我可以写一些像
这样的东西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) ;
}
我如何弄清楚如何使它们长度相同?
答案 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
你会注意到,与双重转换相同。