[英]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.