计算机图形学实验—中点算法画直线
VS中直线的绘制—计算机图形学实验报告一

Else
k += 2 * (dy - dx)
y = y + 1
Enห้องสมุดไป่ตู้If
x = x + 1
EndWhile
Else
k = 2 * dx - dy
Whiley < y2
g.DrawEllipse(p,CInt(x),CInt(y), 1, 1)
Ifk < 0Then
k += 2 * dx
08地信
学号
200875000203
姓名
指导老师
课程名称
计算机图形学
实验题目
直线的绘制
成绩
一、实验目的:
熟练掌握绘制直线的DDA算法、中点画线算法和Bresenham画线算法。
二、实验准备:
学习绘制直线的DDA算法、中点画线算法和Bresenham画线算法,注意考虑不同斜率条件下算法的变化。
三、实验内容:
MessageBox.Show("请输入正确的坐标!", "警告!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
x1 =CDbl(TextBox1.Text)
y1 =CDbl(TextBox2.Text)
x2 =CDbl(TextBox3.Text)
Dimx1, y1, x2, y2, dx, dy, x, y, k, a, bAsDouble
DimgAsGraphics = PictureBox1.CreateGraphics
DimpAsPen =NewPen(Color.Green, 1)
计算机图形学--绘制直线

计算机图形学实验报告专业:信息与计算科学班级: 1002班学号: 10080602** 姓名: *****1.实验目的熟悉CDC类的MoveTo()和LineTo()直线段绘制函数。
熟悉斜率-1<k<0内任意值的直线段的中点Bresenham扫描转换算法。
2.问题分析通过Cline类来模拟CDC类完成任意斜率的直线段绘制,同样提供MoveTo()和LineTo()成员函数。
3.实验步骤(1)规定颜色的处理,定义了CRGB类.(2)设计CLine直线类.(3)在直线类中创建MoveTo()和LineTo()成员函数.4.部分程序代码#Line.hclass CLine{public:CLine();virtual ~CLine();void MoveTo(double,double);void LineTo(CDC* pDC,double,double,double);public:CPoint m_p1;CPoint m_p2;};#Line.cppCLine::CLine(){}CLine::~CLine(){}void CLine::MoveTo(double x,double y){m_p1=CPoint(x,y);}void CLine::LineTo(CDC* pDC,double x,double y,double k) {m_p2=CPoint(x,y);CPoint p,t;pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(200,200);double d;if(k>=-1.0&&k<0.0){if(m_p1.x >m_p2.x ){t=m_p1;m_p1=m_p2;m_p2=t;}d=-0.5-k;for(p=m_p1;p.x <m_p2.x ;p.x ++){pDC->SetPixel (p.x ,p.y ,RGB(0,0,255));if(d>0){p.y--;d-=1+k;}else{d-=k;}}}}void CTEXTView::OnDraw(CDC* pDC){CTEXTDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CLine cline;cline.MoveTo (-200,300);cline.LineTo (pDC,200,-300,-0.3);}5.程序效果图6.实验总结本实验实现了一个类似于CDC类的MoveTo()函数和LineTo()函数,用于绘制任意斜率的直线段,这次只是绘制固定斜率的直线段,但还是出现了很多问题,经过与同学的讨论解决了问题。
华中科技大学计算机图形学实验报告——画直线、日地月模型

计算机图形学基础实验报告专业:班级:姓名:学号:日期:OpenGL简介(1)OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。
它具有以下功能。
1. 模型绘制2. 模型观察在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。
3. 颜色模式的指定OpenGL应用了一些专门的函数来指定三维模型的颜色。
4. 光照应用用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。
5. 图象效果增强OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。
6. 位图和图象处理OpenGL还提供了专门对位图和图象进行操作的函数。
7. 纹理映射8. 实时动画9. 交互技术应用软件OpenGL窗口系统操作系统图形硬件图1.1 OpenGL图形处理系统的层次结构(2)OpenGL的操作步骤在OpenGL中进行的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤如下:1. 根据基本图形单元建立景物模型,得到景物模型的数学描述(OpenGL 中把点、线、多边形、图像和位图都作为基本图形单元);2. 把景物模型放在三维空间中的合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观;3. 计算模型中所有物体的色彩,同时确定光照条件、纹理粘贴方式等;4. 把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化(rasterization)。
在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。
另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。
(3)OpenGL的组成OpenGL不是一种编程语言,而是一种API(应用程序编程接口),它实际上是一种图形与硬件的接口,包括了多个图形函数。
计算机图像图形学-中点画线法

场景渲染
通过中点画线法,游戏开 发者可以快速渲染复杂的 场景,提高游戏运行效率。
计算机辅助设计
机械零件绘图
在计算机辅助设计中,中 点画线法可以用于绘制机 械零件的轮廓和细节,提 高绘图精度。
建筑设计
中点画线法可以用于建筑 设计领域,生成建筑物的 平滑轮廓,提高设计效果。
电路板设计
在电路板设计中,中点画 线法可以用于绘制电路路 径,优化电路布局和信号 传输。
图像处理与编辑
图像平滑处理
中点画线法可以用于图像平滑处 理,减少图像中的噪声和细节失
真。
图像修复
中点画线法可以用于图像修复,对 损坏或缺失的图像部分进行修复和 填充。
图像变换与合成
通过中点画线法,图像处理与编辑 软件可以实现图像的缩放、旋转和 平移等变换操作,以及图像合成和 拼接等操作。
PART 04
优化线条质量可以提高绘制的准确性和视觉效果,使线条 更加平滑、自然。
PART 03
中点画线法的应用场景
REPORTING
WENKU DESIGN
游戏开发
01
02
03
游戏中的பைடு நூலகம்图绘制
中点画线法可以用于游戏 中的地图绘制,生成平滑、 连续的路径,提高游戏体 验。
角色移动动画
在游戏开发中,中点画线 法可以用于生成角色移动 动画,使角色移动更加自 然流畅。
PART 02
中点画线法的实现过程
REPORTING
WENKU DESIGN
确定起点和终点
01
确定线条的起点和终点是中点画 线法的第一步,通常通过输入坐 标或鼠标点击屏幕上的位置来确 定。
02
起点和终点的坐标需要精确,否 则可能导致线条绘制错误或出现 偏差。
《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。
【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。
【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。
ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。
3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。
【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。
计算机图形学实验一画直线

贵州大学实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科131
算法原理:
与DDA算
法相似,
Bresenham
画线算法也
要在每列象
素中找到与
理想直线最逼近的象素点。
根据直线的斜率来确定变量在x或y方向递增一个单位。
另一个方向y或x的增量为0或1,它取决于实际直线与最接近网格点位置的距离。
这一距离称为误差。
算法的巧妙构思,使每次只需检查误差项(增量)的符号即可。
定义决策变量:d =d+k (0<k<1)设0<k<1,如直线上的一点为(x,y),则下一点为:(x+1,y) (d< 或(x+1,y+1)(d>=当d>1时,让d=d-1,以保证0<=d<1,d0=0
令e = (0<k<1),则e0 =
则下一点为:
(x+1,y),(e<0)
(x+1,y+1)(e>=0)
当e >0时, 让e =e-1,(重新初始化误差项)由于算法只用到误差项的符号,为了改用整数以避免除法,可以作如下替换:
e = 2*e*dx定义决策变量e= 2*e*dx,则e0 = -dx,e=e +2*dy
printf("输入有误,请重新输入\n");
break;
}
}
return 0;
}
实
验
结
果
实
验总结
通过这次试验我对于中点生成算法和Bresenham生成算法有了进一步的了解,在平时上课的基础上对计算机图形学有了更深的认识,同时对课程内容也更加了解。
计算机图形学实验一:画直线

贵州大学实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131如果 d<0,则M在理想直线下方,选右上方P1点;如果 d=0,则M在理想直线上,选P1/ P2点。
由于d是xi和yi的线性函数,可采用增量计算提高运算效率。
1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为:d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cd new=d old+a= d old-dy2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cd new=d old+a+b= d old-dy+dx在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。
d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。
为了消除d的分数,重新定义 F(x,y)=2(ax+by+c)则每一步需要计算的d new 是简单的整数加法dy=y1-y0,dx=x1-x0d0=-2dy+dxd new=d old-2*dy,当 d old>=0d new=d old-2(dy-dx),当d old<0Bresenham画线算法算法原理:与DDA算法相似,Bresenham画线算法也要在每列象素中找到与理想直线最逼近的象素点。
根据直线的斜率来确定变量在x或y方向递增一个单位。
另一个方向y或x实验内容#include"stdafx.h"#include<glut.h>#include<iostream>#include<cmath>#include<stdio.h>using namespace std;void init(){glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, 200.0, 0.0, 150.0);}void IntegerBresenhamline(){int x1 = 10, y1 = 10, x2 = 150, y2 = 100;int dx = abs(x2 - x1);int dy = abs(y2 - y1);int x, y;int e = -dx;if (x1 > x2){x = x2;y = y2;x2 = x1;}else{x = x1;y = y1;}glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);glBegin(GL_LINES);glVertex2i(x, y);while (x < x2){if (e >= 0){y++;e = e - 2 * dx;}glVertex2i(x, y);x++; e += 2 * dy;}glEnd();glFlush();}void MidPointLine(){int x, y, x1 = 10, y1 = 10, x2 = 150, y2 = 100;int dy = y1 - y2;int dx = x2 - x1;int d = 2 * dy + dx;int dx1 = 2 * dy;int dx2 = 2 * (dx + dy);if (x1 > x2){x = x2;y = y2;x2 = x1;}else{x = x1;y = y1;}glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);glBegin(GL_LINES);glVertex2i(x, y);while (x < x2){if (d<0){y++; x++;d += dx2;}else{x++, d += dx1;}glVertex2i(x, y);}glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 100);glutInitWindowSize(400, 300);int choice;printf("输入你想画的直线 0代表Bresenham 1代表中点画线\n");while (1){scanf("%d", &choice);switch (choice){case 0:glutCreateWindow("Bresenham Draw Line");init();glutDisplayFunc(IntegerBresenhamline);glutMainLoop();break;case 1:glutCreateWindow("middle Point Line");init();glutDisplayFunc(MidPointLine);glFlush();glutMainLoop();break;default:printf("输入有误,请重新输入\n");break;}}return 0;}实验结果实验总结通过这次试验我对于中点生成算法和Bresenham生成算法有了进一步的了解,在平时上课的基础上对计算机图形学有了更深的认识,同时对课程内容也更加了解。
计算机图形学作业(中点法画直线和八分画圆法)

}
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
d=dx-2*dy;
up=2*x-2*y;
down=-2*dy;
while(x<=x1){
pDC->SetPixel(x,y,color);
x++;
if(d<0){
y++;
d+=up;
}
else d+=down;
}
}
void CMy213View::OnButton32772()
{
CDC *pDC;
pDC=this->GetDC();
int x0=50,y0=50,x1=300,y1=300,color=333;
MidBresenhamLine(pDC,x0,y0,x1,y1,color);
this->ReleaseDC(pDC);
计算机图形学作业中点法画直线和八分画圆法计算机图
1、中点法画直线:
void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){
int dx,dy,){
x=x1;x1=x0;x0=x;
}
x++;
}
}
void CmbView::Onbbb()
{
CDC *pDC;
pDC=this->GetDC();
int r=60,color=333;
MidBresenhamCircle(pDC,r,color);
this->ReleaseDC(pDC);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学实验报告
班级:软件1102
姓名:***
学号:************
中点算法的线段光栅化
一、设计思想和算法流程
1.假定直线斜率0<K<1
假定直线斜率0<K<1,且已确定点亮象素点P (X p ,Y p ),则下一个与直线最接近的像素只能是P1点或P2点。
设M 为中点,Q 为交点,现需确定下一个点亮的象素。
当M 在Q 的下方-> P 2离直线更近更近->取P 2 。
M 在Q 的上方-> P 1离直线更近更近->取P 1
M 与Q 重合, P 1、P 2任取一点。
问题:如何判断M 与Q 点的关系?
由常识知:若y=kx+b;
F(x,y)=y-kx-b;则有 ()()()⎪⎩⎪⎨⎧<>=点在直线下方
0,点在直线上方0,点在直线上面0,y x F y x F y x F
假设直线方程为:ax +by +c=0 (y=(-a/b)x-c/b)
通过两点不能唯一确定a,b,c,
取 a=y 0-y 1, b=x 1-x 0, c=x 0y 1-x 1y 0
F(x,y)=ax +by +c=b(y-(-a/b)x-c/b); ()()()⎪⎩⎪⎨⎧<>=点在直线下方0,点在直线上方0
,点在直线上面0,y x F y x F y x F
则有
∴欲判断M 点是在Q 点上方还是在Q 点下方,只需把M 代入F (x ,y ),并检查它的符号。
构造判别式:d=F(M)=F(x p +1,y p +0.5)=a(x p +1)+b(y p +0.5)+c
当d<0,M 在直线(Q 点)下方,取右上方P 2;
当d>0,M 在直线(Q 点)上方,取右方P 1;
当d=0,选P 1或P 2均可,约定取P 1;
能否采用增量算法呢?若d ≥0 ---->M 在直线上方->取P1;此时再下一个象素的判别式为 d 1=F(x p +2, y p +0.5)
=a(x p +2)+b(y p +0.5)+c
= a(x p +1)+b(y p +0.5)+c +a
=d+a ;
增量为a
若d<0 ------>M 在直线下方->取P2;此时再下一个象素的判别式为 d 2= F(x p +2, y p +1.5)
=a(x p +2)+b(y p +1.5)+c
= a(x p +1)+b(y p +0.5)+c +a +b
=d+a+b ;
增量为a+b
画线从(x0, y0)开始,d的初值d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c= F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了
d来摆脱小数,提高效率。
2.斜率不在[0,1]的直线的处理
设起点和终点分别为(x0,y0)和
(x1,y1)
若k>1则(y0,x0)和(y1,x1)所确定的
直线斜率k€ [0,1],适用于前面讨
论的情形。
对(y0,x0)和(y1,x1)所确
定的直线进行扫描转换,每确定
一组(x,y),输出(y,x)。
若-1<k<0
先对(x0,-y0)和(x1,-y1)所确定的直线进行扫描转换,每确定一组(x,y),输出(x,-y)。
若k<-1对(-y0,x0)和(-y1,x1)所确定的直线进行扫描转换,每确定一组(x,y),输出(y,-x)。
二、编程实现
#include<gl/glut.h>
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int a1, a2, b1, b2, x, y, m;
void main(int argc, char**argv)
{
cout << "第一个点横坐标:";
cin >> a1;
cout << "第二个点横坐标:";
cin >> a2;
cout << "第一个点纵坐标:";
cin >> b1;
cout << "第二个点纵坐标:";
cin >> b2;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("201109020221 夏明轩光栅直线");
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
if (a1<a2&&b1<b2)
{
x = 2 * (b2 - b1);
y = 2 * (b2 - b1) - 2*(a2 - a1); m = 2 * (b2 - b1) - (a2 - a1); }
else if (a1<a2&&b1>b2)
{
x = 2 * (b1 - b2);
y = 2 * (b1 - b2) - 2*(a2 - a1); m = 2 * (b1 - b2) - (a2 - a1); }
else if (a1>a2&&b1<b2)
{
x = 2 * (b2 - b1);
y = 2 * (b2 - b1) - 2*(a1 - a2); m = 2 * (b2 - b1) - (a1 - a2); }
else if (a1>a2&&b1>b2)
{
x = 2 * (b1 - b2);
y = 2 * (b1 - b2) - 2*(a1 - a2); m = 2 * (b1 - b2) - (a1 - a2); }
do
{
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POINTS);
glVertex2i(x, y);
if (a1<a2&&b1<b2)
{
a1++;
if (m<0)
m = m + x;
else
m = m + y;
b1++;
}
else if (a1<a2&&b1>b2)
{
a1++;
if (m<0)
m = m + x;
else
m = m + y;
b1--;
}
else if (a1>a2&&b1<b2)
{
a1--;
if (m<0)
m = m + x;
else
m = m + y;
b1++;
}
else if (a1>a2&&b1>b2)
{
a1--;
if (m<0)
m = m + x;
else
m = m + y;
b1--;
}
else if (a1 = a2&&b1>b2) {
b1++;
}
else
{
b1--;
}
} while (a1!=a2 | b1!=b2);
glEnd();
glutMainLoop();
}
三、运行结果
四、结论
这次试验有很大收获,首先加深了对书上几种算法画直线、画圆的理解;其次,对OpenGL 的运用熟练了很多,清楚了OpenGL 写程序的大致框架,一些典型OpenGL 语句的意义及运用都熟悉了很多。
在这次的图形学作业中,使我了解了图形界面的编程基础,也对VC 中的MFC 有了一定的了解,这会使得我能继续深入的了解VC 中的其它的部分,使我了解编写图
形界面也会带来乐趣。