指出用中点算法和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算法的优缺点以及比较.