绘制恒线速度的参数曲线

假设一条参数曲线和某个参数 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) )

这样既可以绘制出等步长的恒线速度的参数曲线
 
例子椭圆


代码:

bool DrawEclips(float a , float b , HWND hWnd , HDC hdc)
{
     RECT rect ;
  GetClientRect(hWnd , &rect);
  int cx = rect.right/2;
  int cy = rect.bottom/2;
#define MYPI2 (3.1415926f*2.0f)
  float dtheta0 = 9.0f/360.0 * MYPI2;
  float theta = 0.0;
  float rt = MYPI2 / 1.5;
  for(;;)
  {
   float dtheta = b * dtheta0 / sqrt( a *a * sin(theta) * sin(theta) + b * b * cos(theta) * cos(theta) );
   float x = a * cos(theta);
   float y = b * sin(theta);
   int ix = cos(rt) *x - sin(rt)*y;
   int iy = 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;
  }
  return 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值