`
- 浏览:
155441 次
- 性别:
- 来自:
杭州
-
voidCDrawLinesView::MenuDdaline()
...{
CDC*pDC=GetDC();
intxa=m_pnt1.x,ya=m_pnt1.y,xb=m_pnt2.x,yb=m_pnt2.y,c=RGB(255,0,0);
floatx,y;
floatdx,dy,k;
dx=(float)(xb-xa);
dy=(float)(yb-ya);
k=dy/dx;
y=ya;
x=xa;
if(abs(k)<1)
...{
if(xa<=xb)...{
for(x=xa;x<=xb;++x)
...{
pDC->SetPixel((int)x,int(y+0.5),c);
y+=k;
}
}
elseif(xa>xb)
...{
for(x=xa;x>=xb;--x)
...{
pDC->SetPixel((int)x,int(y+0.5),c);
y-=k;
}
}
}
if(abs(k)>=1)
...{
if(ya<=yb)...{
for(y=ya;y<=yb;++y)
...{
pDC->SetPixel(int(x+0.5),(int)y,c);
x+=1/k;
}
}
elseif(ya>yb)
...{
for(y=ya;y>=yb;--y)
...{
pDC->SetPixel(int(x+0.5),(int)y,c);
x-=1/k;
}
}
}
ReleaseDC(pDC);
}
voidCDrawLinesView::MenuMindlepoint()
...{
CDC*dc=GetDC();
intx0=m_pnt1.x,y0=m_pnt1.y,x1=m_pnt2.x,y1=m_pnt2.y,color=RGB(0,255,0);
intdx,dy,nexte,nextne,d,x,t,y;
floatm;
dx=x1-x0;
dy=y1-y0;
m=1.0*dy/dx;//¼ÆËãбÂÊ£¬²¢ÒÀ¾Ý´Ë½øÐÐÅжÏ
if(m<=1&&m>=0)
...{
if(x0>=x1)
...{
swap(x0,x1);
swap(y0,y1);
dx=-dx;dy=-dy;//½»»»×ø±êºódx,dy±äΪÏà·´µÄÊý
}
x=x0;y=y0;
d=dx-2*dy;//d0
nexte=-2*dy;//ÏÂÒ»¸ö×ø±ê¾àÀëÇ°Ò»¸ö×ø±êµÄÆ«ÒÆ
nextne=-2*dy+2*dx;
while(x<x1)
...{
if(d>0)
d+=nexte;
else
...{
d+=nextne;
y++;
}
x++;
dc->SetPixel(x,y,color);
}
}
elseif(m>=-1&&m<0)
...{
if(x0>=x1)
...{
swap(x0,x1);
swap(y0,y1);
dx=-dx;dy=-dy;
}
x=x0;y=y0;
d=-dx-2*dy;//d0
nexte=-2*dy;
nextne=-2*dy-2*dx;
while(x<x1)
...{
if(d>0)
...{
d+=nextne;
y--;
}
else
d+=nexte;
x++;
dc->SetPixel(x,y,color);
}
}
elseif(m>1)
...{
if(y0>=y1)
...{
swap(x0,x1);
swap(y0,y1);
dy=-dy;dx=-dx;
}
x=x0;
y=y0;
d=-dy+2*dx;//d0
nexte=2*dx;
nextne=-2*dy+2*dx;
while(y<y1)
...{
if(d>0)
...{
d+=nextne;
x++;
}
else
d+=nexte;
y++;
dc->SetPixel(x,y,color);
}
}
elseif(m<-1)
...{
if(y0>=y1)
...{
swap(x0,x1);
swap(y0,y1);
dx=-dx;dy=-dy;
}
x=x0;
y=y0;
d=2*dx+dy;//d0
nexte=2*dx;
nextne=2*dx+2*dy;
while(y<y1)
...{
if(d<0)
...{
d+=nextne;
x--;
}
else
d+=nexte;
y++;
dc->SetPixel(x,y,color);
}
}
ReleaseDC(dc);
}
voidswap(int&x1,int&x2)
...{
intt;
t=x1;
x1=x2;
x2=t;
}
voidCDrawLinesView::MenuBhline()
...{
CDC*dc=GetDC();
intx0=m_pnt1.x,y0=m_pnt1.y,x1=m_pnt2.x,y1=m_pnt2.y,color=RGB(0,0,255);
intx,y,dx,dy,sx,sy;
intf;
boolflag=false;
x=x0;
y=y0;
dx=abs(x0-x1);
dy=abs(y0-y1);
if(x1-x0>=0)
sx=1;
else
sx=-1;
if(y1-y0>=0)
sy=1;
else
sy=-1;
if(dy>dx)
...{
swap(dx,dy);
flag=true;
}
else
flag=false;
f=2*dy-dx;
for(inti=1;i<=dx;++i)
...{
dc->SetPixel(x,y,color);
if(f>=0)
...{
if(flag)
x+=sx;
else
y+=sy;
dc->SetPixel(x,y,color);
f-=2*dx;
}
else
...{
if(flag)
y+=sy;
else
x+=sx;
f+=2*dy;
}
}
}
voidCDrawLinesView::OnMenuDdaline()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=true;
m_blMid=false;
m_blBre=false;
}
voidCDrawLinesView::OnMenuMindlepoint()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=false;
m_blMid=true;
m_blBre=false;
}
voidCDrawLinesView::OnMenuBhline()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=false;
m_blMid=false;
m_blBre=true;
}
voidCDrawLinesView::OnLButtonDown(UINTnFlags,CPointpoint)
...{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
++m_pntCount;
if(m_pntCount==1)
m_pnt1=point;
elseif(m_pntCount==2)
...{
m_pnt2=point;
if(m_blDDA)
MenuDdaline();
if(m_blMid)
MenuMindlepoint();
if(m_blBre)
MenuBhline();
m_pntCount=0;
}
CView::OnLButtonDown(nFlags,point);
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
【计算机图形学实验报告实验一 直线生成算法】 实验一的主题聚焦于计算机图形学中的直线生成算法,这是计算机科学与信息学院软件工程专业学生在学习过程中的一项实践任务。实验旨在帮助学生熟悉计算机图形学的实验...
在计算机图形学中,直线生成算法是至关重要的一个部分,用于在屏幕上绘制直线。本项目主要探讨了“直线生成算法”,并且使用C++编程语言(VC++环境)实现了其中的中点画线算法(Midpoint Drawing Algorithm),这也...
Bresenham直线生成算法是目前最常用的一种直线绘制算法,由Jack E. Bresenham于1965年提出。它基于误差累积的概念,以最小的计算量和内存需求来近似绘制直线。算法的主要步骤如下: 1. 初始化两个变量,x_error表示x...
"计算机图形学-三种直线生成算法及圆的生成算法" 计算机图形学是计算机科学与技术学院中的一个重要方向,它涉及到计算机图形的生成、显示和处理。在计算机图形学中,直线和圆是最基本的图形元素,本文将介绍三种...
计算机图形学直线生成算法实现 计算机图形学是计算机科学和数学的交叉领域,研究如何使用计算机生成和处理图形图像。本文档主要介绍计算机图形学中的一种基本算法,即直线生成算法的实现。 一、实验目的和要求: ...
在计算机图形学中,直线生成算法是至关重要的一个部分,它允许我们在屏幕上精确地绘制出直线,从而构建出复杂的图形和图像。这个“shiyan1.zip”压缩包包含的源代码正是关于直线生成算法的实现,对于学习和理解这一...
在计算机图形学中,直线生成算法是至关重要的一个部分,特别是在二维和三维渲染中。本文将深入探讨"各个方向直线生成算法演示"所涵盖的知识点,包括不同角度的直线生成方法,以及如何处理小于和大于45度角的情况。 ...
### DDA直线生成算法 #### 一、简介 在计算机图形学中,DDA(Digital Differential Analyzer,数字差分分析器)算法是一种用于绘制直线的基本算法。它通过计算每一步移动的方向来逼近理想直线的位置,从而实现直线...
计算机图形学中,直线生成算法是基础且关键的一部分,它涉及到如何在像素级别的二维空间上精确地描绘出直线。在不考虑线宽的情况下,直线是由像素集合构成的,因此算法的目标是在有限的像素网格中找到最接近实际直线...
### 逐点比较直线生成算法 C 语言实现详解 #### 一、算法原理与背景介绍 逐点比较直线生成算法是一种在计算机图形学领域中常用的绘制直线的方法之一,主要用于确定两个端点之间的像素序列,使得这些像素能够尽可能...
### Bresenham直线生成算法 Bresenham直线生成算法是一种用于绘制二维空间中整数坐标点上近似直线段的算法。该算法由杰克·B·布雷斯哈姆(Jack Elton Bresenham)在1962年提出,并广泛应用于计算机图形学领域,...
### 直线生成算法实验报告知识点解析 #### 实验背景与目标 本次实验的主要目的是让学生通过实际编程操作,深入理解并熟练掌握直线的生成算法,尤其是Bresenham直线生成算法。通过实验,学生需要掌握以下技能: 1....
### DDA直线生成算法及其C语言实现 #### DDA算法简介 数字差分分析器(Digital Differential Analyzer,简称DDA)是一种用于计算机图形学中的基本绘图算法之一,主要用于生成直线段。它通过逐步累加斜率的方式计算...
这是已运行通过的Bresenham的直线生成算法和整圆生成算法完整代码,希望给初学者一点帮助。
"直线生成算法" 本实验报告的主要目的是了解并掌握在光栅显示系统中直线的生成和显示算法,熟悉相关开发平台。实验要求使用 DDA 数值微分法、 中点画线算法和 Bresenham 画线算法绘制直线。 一、DDA 数值微分法 ...
本文将详细介绍如何使用C++实现三种经典的直线生成算法:DDA(Digital Differential Analyzer),BRESENHAM算法以及中点画线算法。 1. **DDA(数字微分分析器)算法**: DDA算法是一种简单的直线生成方法,主要...
本文将深入探讨两种广泛使用的直线生成算法:DDA(Digital Differential Analyzer)和Bresenham算法,并结合MFC(Microsoft Foundation Classes)框架,介绍如何在Visual Studio 2013环境下实现这两种算法的演示程序...