数值微分画线算法

 

线的生成——DDA算法|数值微分画线算法  

2010-06-11 21:25:35|  分类: 默认分类 |  标签: |字号 订阅

DDA称为数值微分画线算法,是直线生成算法中最简单的一种。原理相当简单,就是最直观的根据斜率的偏移程度,决定是以x为步进方向还是以y为步进方向。然后在相应的步进方向上,步进变量每次增加一个像素,而另一个相关坐标变量则为Y=kx+m(以x为步进变量为例,m为斜率).当斜率在-1到1之间是让X增长值为1,Y的增长值为K。当斜率大于1时。让Y增长值为1,X的增量为1/K。这样做的目的是让每次变化的值不能大于1。这样可以让像素点更加整齐。
这个程序对于我的意义在于:可以在VC中利用GDI的画点函数--- SetPixel来实现它

先根据两个坐标点~求出直线的斜率

 CPoint p1,p2; 
 p1.x=0;
 p1.y=0;
 p2.x=300;
 p2.y=400;//坐标点初始化
 double dx,dy,k,y,x;
 COLORREF rgg=RGB(0,0,0);  //黑色
 dx=p2.x -p1.x;
 dy=p2.y-p1.y;
 k=dy/dx;//求斜率
 if(fabs(k)<1)//当斜率在-1到1之间的时候
 {
  y=p1.y;
  for(x=p1.x;x<=p2.x;x++)//以x为增量
  {
   pDC->SetPixel(x,int(y+0.5),rgg);
   y=y+k;
  }
 }
 else//斜率大于1的时候
 {
  x=p1.x;
  for(y=p1.y;y<=p2.y;y++)//以Y为增量  //X的增量为1/K
  { 
      pDC->SetPixel(int(x+0.5),y,rgg); 

     x=x+1.0/k;
  }
 }  

  评论这张
转发至微博
转发至微博
1   分享到:         
阅读(906) | 评论(0) | 转载 (0) | 举报
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数值微分算法可以用来近似计算曲线上的点,而中点画线算法则可以用来连接这些点,从而实现曲线绘制。 具体实现步骤如下: 1. 计算曲线上的点。采用数值微分算法,可以通过一定的步长来逐一计算曲线上的点。其中,常用的数值微分算法有前向差分、后向差分和中心差分。以中心差分为例,计算曲线在点 P 的一阶导数可以使用以下公式: ``` f'(x) = [f(x+h) - f(x-h)] / (2h) ``` 其中,h 为步长,可以根据需要设定。 2. 连接曲线上的点。采用中点画线算法,可以连接曲线上的点,从而实现曲线的绘制。中点画线算法的基本思路是从起点到终点逐一画线。对于每一条线段,都可以使用 Bresenham 算法来计算需要经过的像素点,从而实现线段的绘制。 下面是使用数值微分算法和中点画线算法绘制圆的示例代码: ```c++ #include <iostream> #include <graphics.h> #include <math.h> using namespace std; void drawCircle(int x0, int y0, int r) { int x = 0, y = r; int d = 3 - 2 * r; while (x <= y) { putpixel(x0 + x, y0 + y, WHITE); putpixel(x0 + x, y0 - y, WHITE); putpixel(x0 - x, y0 + y, WHITE); putpixel(x0 - x, y0 - y, WHITE); putpixel(x0 + y, y0 + x, WHITE); putpixel(x0 + y, y0 - x, WHITE); putpixel(x0 - y, y0 + x, WHITE); putpixel(x0 - y, y0 - x, WHITE); if (d < 0) { d = d + 4 * x + 6; } else { d = d + 4 * (x - y) + 10; y--; } x++; } } int main() { int gd = DETECT, gm; initgraph(&gd, &gm, ""); int x0 = 200, y0 = 200, r = 100; drawCircle(x0, y0, r); getch(); closegraph(); return 0; } ``` 上述代码中,我们使用了 Bresenham 算法来计算圆上需要经过的像素点,从而实现了圆的绘制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值