您的位置:首页 > 其它

绘制恒线速度的参数曲线

2007-12-17 10:24 253 查看
假设一条参数曲线和某个参数t相关。
L:
x=f(t)
y=g(t)

如果我们绘制这条参数曲线的时候的,t是按比例增加的话。可能点的分布会不均匀。
那么按照什么公式来决定t的步长能让曲线的点分布均匀呢?

首先我们对参数曲线公式进行微分。

dx=df(t)
dy=dg(t)

那么ds=sqrt(dx*dx+dy*dy)

于是ds跟dt的关系便建立起来了。

ds=sqrt(f'(t)*f'(t)+g'(t)*g'(t))*dt.
代入t=0跟t=0时候的步长dt(0)可以得到t=0时候ds(0)。
根据需求。我们要保证以后每个dt(t)的值。ds(t)=ds(0)
因此。得到

dt(t)=ds(0)/sqrt(f'(t)*f'(t)+g'(t)*g'(t))
=dt(0)*sqrt(f'(0)*f'(0)+g'(0)*g'(0))/sqrt(f'(t)*f'(t)+g'(t)*g'(t))
这样既可以绘制出等步长的恒线速度的参数曲线
例子椭圆



代码:

boolDrawEclips(floata,floatb,HWNDhWnd,HDChdc)
{
RECTrect;
GetClientRect(hWnd,&rect);
intcx=rect.right/2;
intcy=rect.bottom/2;
#defineMYPI2(3.1415926f*2.0f)
floatdtheta0=9.0f/360.0*MYPI2;
floattheta=0.0;
floatrt=MYPI2/1.5;
for(;;)
{
floatdtheta=b*dtheta0/sqrt(a*a*sin(theta)*sin(theta)+b*b*cos(theta)*cos(theta));
floatx=a*cos(theta);
floaty=b*sin(theta);
intix=cos(rt)*x-sin(rt)*y;
intiy=sin(rt)*x+cos(rt)*y;
ix+=cx;
iy+=cy;
if(theta>=MYPI2)break;
SetPixel(hdc,(int)ix,(int)iy,RGB(255,0,255));

theta+=dtheta;
if(theta>MYPI2)theta=MYPI2;
}
return1;
}


Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1603144
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: