指出用中点算法和Bresenham算法扫描转换像素点(8,6)到(1,1)的线段时的像素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指出用中点算法和Bresenham算法扫描转换像素点(8,6)到(1,1)的线段时的像素相关的知识,希望对你有一定的参考价值。

赶紧滴。马上就需要,!!!

参考技术A

是直接画一条由点(8,6)到(1,1)的线段吗?

我这个是画任意直线的

中点算法:

#include "stdafx.h"

#include "graphics.h"

#include <conio.h>

// 使用中点算法画任意斜率的直线

void Line_Midpoint(int x1, int y1, int x2, int y2, int color)

int x = x1, y = y1;

int a = y1 - y2, b = x2 - x1;

int cx = (b >= 0 ? 1 : (b = -b, -1));

int cy = (a <= 0 ? 1 : (a = -a, -1));

putpixel(x, y, color);

int d, d1, d2;

if (-a <= b) // 斜率绝对值 <= 1

d = 2 * a + b;

d1 = 2 * a;

d2 = 2 * (a + b);

while(x != x2)

if (d < 0)

y += cy, d += d2;

else

d += d1;

x += cx;

putpixel(x, y, color);

else // 斜率绝对值 > 1

d = 2 * b + a; 

d1 = 2 * b;

d2 = 2 * (a + b);

while(y != y2) 

 

if(d < 0)

d += d1; 

else 

x += cx, d += d2; 

y += cy; 

putpixel(x, y, color);

 

int main()

int x1,y1,x2,y2;

printf("请输入两点坐标x1, y1, x2, y2:");

scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

initgraph(640, 480);

Line_Midpoint( x1, y1, x2, y2, WHITE);

getch();

closegraph();

return 0;

Bresenham算法:

#include "stdafx.h"

#include "graphics.h" 

#include <conio.h>

#include <math.h>

void line(int x1, int y1, int x2, int y2, int color)

int x= x1;

int y= y1;

int dx= abs(x2 - x1);

int dy= abs(y2 - y1);

int s1= x2>x1? 1:-1;

int s2= y2>y1? 1:-1;

int i;

bool interchange= false;

if (dy>dx)            

int temp= dx;

dx= dy;

dy= temp;

interchange= true;

int p= 2*dy-dx;        

for(i=1;i<dx;i++)

putpixel(x, y, color);      

if (p>=0)

if (!interchange)

y+= s2;

else

x+= s1;

p-= 2 * dx;

if (!interchange)

x+= s1;

else

y+= s2;

p+= 2*dy;

int main(int argc, char* argv[])

int x1,y1,x2,y2;

printf("请输入两点坐标x1, y1, x2, y2:");

scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

initgraph(640, 480);

    line(x1, y1, x2, y2, WHITE);

    getch();

    closegraph();   

return 0;

要记得把这些文件放到同一个目录下:

本回答被提问者和网友采纳

直线的中点Bresenham算法的实现

---恢复内容开始---

一、实验目的

1.掌握在MFC中搭建图形绘制的基本框架的方法;

2.将直线的中点Bresenham算法转化成可执行代码。

二、实验内容

1. 通过分析具体数据在中点Bresenham算法上的执行过程,绘制算法执行流程图或N-S图,在MFC中实现该算法,要求编写函数实现任意给定两点绘制线段。

三、实验步骤

   任意给定的两点所绘制的线段斜率k可能有四种情况,分别是:0<k<1,k>=1,-1<k<0,

k<=-1。下面对这四种情况分别进行分析。

(一)  当0<k<1时

   1.算法原理的推导

 (1)构造中点误差项为:

 

(2)中点误差的初始值是:

 

2

(3)推导di+1

  3

 

 

 

 

 

 

 

4

   

 

 

 

 

2.算法执行的N-S图

5

3.算法执行的主要代码

 

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2 
 3 {
 4 
 5        // TODO: Add your message handler code here and/or call default
 6 
 7        p1=point;
 8 
 9        CDC *pDC=this->GetDC();
10 
11        COLORREF c;
12 
13        DrawLine(pDC,p0,p1,c);
14 
15        CView::OnLButtonUp(nFlags, point);
16 
17 }
18 
19  
20 
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22 
23 {
24 
25        // TODO: Add your message handler code here and/or call default
26 
27        p0=point;
28 
29        CView::OnLButtonDown(nFlags, point);
30 
31 }
32 
33  
34 
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36 
37 {     ///*
38 
39        //1.fabs(k)>0&&fabs(k)<1
40 
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;
42 
43        if(fabs(k)>1) return;
44 
45        int x,y;
46 
47        for(x=p0.x,y=p0.y;x<=p1.x;x++){
48 
49               if(d>=0){
50 
51                      pDC->SetPixel(x,y,0xff0000);
52 
53                      d+=-k;
54 
55               }
56 
57               else{
58 
59                      y++;
60 
61                      pDC->SetPixel(x,y,0xff0000);
62 
63                      d+=1-k;
64 
65               }
66 
67        }
68 
69 //*/
70 
71 }

 

 

 

4.执行结果

 6

 

 

(二)  当k>=1时

    1.算法原理的推导

(1)构造中点误差项为:

 7

(2)中点误差的初始值是:

 8

 

(3)推导di+1

 

   

 9

 

 

 10

   

 

 

 

 

2.算法执行的N-S图

11

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2 
 3 {
 4 
 5        // TODO: Add your message handler code here and/or call default
 6 
 7        p1=point;
 8 
 9        CDC *pDC=this->GetDC();
10 
11        COLORREF c;
12 
13        DrawLine(pDC,p0,p1,c);
14 
15        CView::OnLButtonUp(nFlags, point);
16 
17 }
18 
19  
20 
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22 
23 {
24 
25        // TODO: Add your message handler code here and/or call default
26 
27        p0=point;
28 
29        CView::OnLButtonDown(nFlags, point);
30 
31 }
32 
33  
34 
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36 
37 {     ///*
38 
39     //2.fabs(k)>=1
40 
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=1-0.5*k;
42 
43        if(fabs(k)>0&&fabs(k)<1) return;
44 
45        int x,y;
46 
47        for(x=p0.x,y=p0.y;x<=p1.x;y++){
48 
49               if(d>=0){
50 
51                      x++;
52 
53                      pDC->SetPixel(x,y,0x00ff00);
54 
55                      d+=1-k;
56 
57               }
58 
59               else{
60 
61                     
62 
63                      pDC->SetPixel(x,y,0x00ff00);
64 
65                      d+=1;
66 
67               }
68 
69        }
70 
71 }

 

 

 

4.执行结果

 12

 

 

(三)  当-1<k<0时

   1.算法原理的推导

(1)构造中点误差项为:

 13

(2)中点误差的初始值是:

 14

 

(3)推导di+1

  15

16

   

 

 

 

 

2.算法执行的N-S图

17

 

3.算法执行的主要代码

 

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2 
 3 {
 4 
 5        // TODO: Add your message handler code here and/or call default
 6 
 7        p1=point;
 8 
 9        CDC *pDC=this->GetDC();
10 
11        COLORREF c;
12 
13        DrawLine(pDC,p0,p1,c);
14 
15        CView::OnLButtonUp(nFlags, point);
16 
17 }
18 
19  
20 
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22 
23 {
24 
25        // TODO: Add your message handler code here and/or call default
26 
27        p0=point;
28 
29        CView::OnLButtonDown(nFlags, point);
30 
31 }
32 
33  
34 
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36 
37 {     ///*
38 
39               /*
40 
41        //3.fabs(k)>-1&&fabs(k)<0
42 
43        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=-0.5-k;
44 
45        //if(fabs(k)>1||fabs(k)<-1||(fabs(k)>0&&fabs(k)<1)) return;
46 
47        int x,y;
48 
49        for(x=p0.x,y=p0.y;x<=p1.x;x++){
50 
51               if(d>=0){
52 
53                   y=y-1;
54 
55                      pDC->SetPixel(x,y,0x0000ff);
56 
57                      d+=-1-k;
58 
59               }
60 
61               else{
62 
63                      pDC->SetPixel(x,y,0x0000ff);
64 
65                      d+=-k;
66 
67               }
68 
69        }
70 
71  */}

 

 

 

4.执行结果

 18

 

(四)  当k<=-1时

  1.算法原理的推导

(1)构造中点误差项为:

 19

(2)中点误差的初始值是:

 20

 

(3)推导di+1

   21

22

   

 

 

 

 

2.算法执行的N-S图

23

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2 
 3 {
 4 
 5        // TODO: Add your message handler code here and/or call default
 6 
 7        p1=point;
 8 
 9        CDC *pDC=this->GetDC();
10 
11        COLORREF c;
12 
13        DrawLine(pDC,p0,p1,c);
14 
15        CView::OnLButtonUp(nFlags, point);
16 
17 }
18 
19  
20 
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22 
23 {
24 
25        // TODO: Add your message handler code here and/or call default
26 
27        p0=point;
28 
29        CView::OnLButtonDown(nFlags, point);
30 
31 }
32 
33  
34 
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36 
37 {     ///*
38 
39        //1.fabs(k)>0&&fabs(k)<1
40 
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;
42 
43        if(fabs(k)>1) return;
44 
45        int x,y;
46 
47        for(x=p0.x,y=p0.y;x<=p1.x;x++){
48 
49               if(d>=0){
50 
51                      pDC->SetPixel(x,y,0xff0000);
52 
53                      d+=-k;
54 
55               }
56 
57               else{
58 
59                      y++;
60 
61                      pDC->SetPixel(x,y,0xff0000);
62 
63                      d+=1-k;
64 
65               }
66 
67        }
68 
69 //*/
70 
71 }

 

 

 

4.执行结果

 24

 

 

四、实验结果与讨论

根据任意给定的两点所绘制的线段斜率k可能有的四种情况,实验结果如下:

(一)  当0<k<1时:

 6

 

(二)  当k>=1时:

 12

 

 

(三)  当-1<k<0时:

 18

 

 

(四)  当k<=-1时:

 

 24

 

 

五、总结

(一)本次实验按时按量完成。

(二)通过本次实验,我掌握了在MFC中搭建图形绘制的基本框架的方法;掌握了如何将直线的中点Bresenham算法转化成可执行代码。

(三)在本次实验中,我通过分析具体数据在中点Bresenham算法上的执行过程,分四种情况绘制算法执行N-S图,并且在MFC中实现了该算法。

 

 

 

 

 

 

---恢复内容结束---

以上是关于指出用中点算法和Bresenham算法扫描转换像素点(8,6)到(1,1)的线段时的像素的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学:直线段扫描转换算法

求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.

四道图像图像算法题目

bresenham算法的介绍

Python使用DDA算法和中点Bresenham算法画直线

光栅图形学:直线段的扫描转换算法