当前位置:首页 > 计算机图形学学习总结
pNewBrush1=new CBrush;
if (pNewBrush1->CreateSolidBrush(RGB(255,0,0))) {
//选择新画刷
pOldBrush1=pDC->SelectObject(pNewBrush1); //绘制矩形
pDC->Rectangle(200,200,300,400); //恢复原有画刷
pDC->SelectObject(pOldBrush1); }
delete pNewBrush1; //阴影画刷
CBrush Brush(HS_DIAGCROSS,RGB(255,255,255)); CBrush *pOldBrush;
pOldBrush=pDC->SelectObject(&Brush); pDC->SetBkColor(RGB(192,192,192)); pDC->Rectangle(0,0,100,100); pDC->SelectObject(pOldBrush);
实验二
一、实验目的
在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是验证直线生成的三种扫描算法,并要求对基本算法进行扩充和改进,包括:利用Visual C++实现三种直线生成算法,验证算法的正确性; 二、实验任务
1. 理解三种直线生成算法思想,写出实现程序; 2. 添加鼠标功能,实现交互式画直线程序;
3. 将10个像素作为步距单位,编出Bresenham算法的示例。 三、基本知识和实验步骤
任务一:实现DDA画线程序
实验步骤:
1. 建立一个DDALine的工程文件; 2. 添加ddaline()成员函数 方法:在工作区中选择CLASSVIEW类窗口,右击CDDAlineView类,选择“add member function…”,定义如下的成员函数:
void ddaline(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color); 3. 编写自定义的成员函数ddaline()程序
void CDDALineView::ddaline(CDC* pDC, int x0, int y0, int x1, int y1, COLORREF color) {
int length,i; float x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)>length)
9
length=abs(y1-y0); dx=(x1-x0)/length; dy=(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;i<=length;i++) 4.编写OnDraw()函数
void CDDALineView::OnDraw(CDC* pDC) {
CDDALineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: add draw code for native data here ddaline(pDC,100,100,400,100,RGB(255,0,0)); ddaline(pDC,400,100,400,400,RGB(0,255,0)); ddaline(pDC,400,400,100,400,RGB(0,0,255)); ddaline(pDC,100,400,100,100,RGB(255,255,0)); ddaline(pDC,100,100,400,400,RGB(255,0,255)); ddaline(pDC,100,400,400,100,RGB(0,255,255));} }
5.编译、调试和运行程序,查看程序结果。
任务二、放大10倍后,算法演示程序
先画出(100,100)到(600,400)大小为10的网格,然后从(100,100)以10为单位,计算出直线上各个像素位置。 步骤:
1. 建立DDA2Line工程;
2. 在OnDraw()函数中画出网格,并调用DDA2Line()函数 void CDDA2LineView::OnDraw(CDC* pDC) {
CDDA2LineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: add draw code for native data here //画网格 int gi,gj; //画横线
pDC->TextOut(90,90,\ pDC->MoveTo(100,100); for(gj=100;gj<=400;gj=gj+10) {
pDC->MoveTo(100,gj); pDC->LineTo(600,gj); }
//画竖线
pDC->MoveTo(100,100);
for (gi=100;gi<=600;gi=gi+10) {
pDC->MoveTo(gi,100); pDC->LineTo(gi,400); }
pDC->TextOut(590,410,\ //画出像素点
DDA2line(pDC,100,100,600,400,RGB(255,0,0)); }
3.添加DDA2Line()成员函数 方法:在工作区中选择CLASSVIEW类窗口,右击CDDAlineView类,选择“add member function…”,定义如下的成员函数:
10
void DDA2Line(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color); 4.编写DDA2Line()函数
void CDDA2LineView::DDA2line(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) {
int length,i,tx,ty; float x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)>length) length=abs(y1-y0);
dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; //char tbuf[20];
//sprintf(tbuf,\ //AfxMessageBox(tbuf); x=x0;y=y0;
for (i=0;i<=length;i=i+10) {
tx=(int)((x+5)/10)*10; ty=(int)((y+5)/10)*10;
pDC->SetPixel(tx,ty,color);
pDC->Ellipse(tx-5,ty-5,tx+5,ty+5); x=x+dx*10;y=y+dy*10; } }
5.调试、运行程序
任务三、加入鼠标功能,实现交互式画直线
第一步:建立DDAMouseLine工程文件; 第二步:向视图类中添加自定义的成员变量
用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。 proctected :
CPoint m_p1; // 起点 CPoint m_p2; //终点
int m_ist; //区别,m_ist=0,表示直线起点, //m_ist=1,表示直线终点
第三步:向视图类中添加自定义的成员函数原型: public:
void DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color); 第四步:在视图类CPP文件的构造函数中初始化成员变量。
视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,CDDAMouseLineView(),用鼠标左键双击,输入下面程序代码: CDDAMouseLineView::CDDAMouseLineView() {
// TODO: add construction code here m_p1.x=0; m_p1.y=0; //起点 m_p2.x=0; m_p2.y=0; //终点
m_ist=0; //0,第1点;1,第2点; }
第五步:在视图类的OnDraw()函数中加入下列代码,实现视图绘图。 void CMouseSpringView::OnDraw(CDC* pDC) {
CMouseSpringDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: add draw code for native data here pDC->SelectStockObject(NULL_BRUSH);
如:11
DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0)); // 调用自定义的成员函数,用鼠标画直线 }
第六步:向视图类中添加鼠标OnLButtonDown()函数消息响应函数,并输入鼠标处理程序代码。 void CMouseSpringView::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();
pDC->SelectStockObject(NULL_BRUSH); if (!m_ist) //是起点 {
m_p1=m_p2=point; //纪录第一次单击鼠标位置,定起点 m_ist++; } else {
m_p2=point; //记录第二次单击鼠标的位置,定终点的点 m_ist--; // 为新绘图作准备
DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0)); //绘制新直线}
ReleaseDC(pDC); //释放设备环境
CView::OnLButtonDown(nFlags, point); }
第七步:添加成员函数的程序代码
12
共分享92篇相关文档