实验报告计算机图形学.pdf

上传人:tbuqq 文档编号:5133158 上传时间:2020-02-06 格式:PDF 页数:9 大小:91.15KB
返回 下载 相关 举报
实验报告计算机图形学.pdf_第1页
第1页 / 共9页
实验报告计算机图形学.pdf_第2页
第2页 / 共9页
实验报告计算机图形学.pdf_第3页
第3页 / 共9页
实验报告计算机图形学.pdf_第4页
第4页 / 共9页
实验报告计算机图形学.pdf_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《实验报告计算机图形学.pdf》由会员分享,可在线阅读,更多相关《实验报告计算机图形学.pdf(9页珍藏版)》请在三一文库上搜索。

1、一、实验目的 了解梁友栋算法和编码裁剪算法并利用该算法思想实现某一图形或直线段的裁剪,加 深对梁友栋算法和编码裁剪算法的理解。 二、实验内容 利用梁友栋算法(参数化线段裁剪算法)或编码裁剪算法变成实现对直线段或者任一 图形的裁剪。 三、实验原理 梁友栋算法简介如下: 设线段两端点坐标分别为P1(x1,y1) 和 P2(x2,y2), 则其参数化直线方程可写成下列形 式: 0u1 当 u=0 时,得点 P1,当 u=1 时,得点 P2 。线段的裁剪条件可以由下面的不等式表示: Wxlx1 uxWxr ;Wyb y1 uyWyt 这四个不等式可以表示为:upkqkk=1,2,3,4 其中,参数p,

2、q 定义为: p1-x, q1 x1Wxl p2x,q2 Wxrx1 p3-y, q3 y1Wyb p4y,q4 Wyt y1 下标 k=1,2,3,4分别对应裁剪窗口的左、右、下、上四条边界线。如果线段平行于裁剪 窗口的某两边界,则必有相应的pk0,如果还满足qk0,则线段的端点位于窗口外部, 即线段在窗口外,应该舍弃。如果qk0 ,线段在窗口内。当pk0 时,直线是从裁剪窗口 第 k 条边界线的外部延伸到内部。当pk0 时,直线是从裁剪窗口第k 条边界线的内部延 伸到外部。当pk 不等于零时,可以计算出线段与第k 条裁剪窗口边界线的交点参数:根 据定义,对于每条线段,pk 中必有两个小于零

3、,而另两个大于零。对于小于零的pk,直线 同第 k 条裁剪窗口边线是从外到内相遇的,此时如果线段同第k 条裁剪窗口边界线有交点的 话,是参数u 从 0 变大时遇到的,这时计算出相应的rk 值,取 0 和各个 rk 值之中的最大值 记为 u1。与此相反,对于大于零的pk,计算出相应的rk 值,取 1 和各个 rk 值之中的最小 值记为 u2 。两个参数u1 和 u2 定义了在裁剪窗口内的线段部分。如果u1u2,则线段完 全落在裁剪窗口之外,应被舍弃。否则被裁剪线段可见部分的端点由参数u1 和 u2 计算出 来。 四、实验环境 Windows XP VisualC+6.0 五、实验步骤 进入 Vi

4、sualC+6.0环境,在菜单中选择“File New Projects ”,然后选择 “MFCAppWizard(exe) ” 新建一个工程文件单击“OK ”,在弹出的对话框中选择“Single documen t ”,单击 “Finish ”,在 VisualC+6.0编程界面中选择CMyView 单击右键,选择“Add Member Function ” ,在弹出的对话框中添写“void ”和函数名。 / 图形裁减View.cpp : implementation of the CMyView class / #include “stdafx.h“ #include “ 图形裁减 .h“

5、 #include “ 图形裁减Doc.h“ #include “ 图形裁减View.h“ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif / / CMyView IMPLEMENT_DYNCREATE(CMyView, CView) BEGIN_MESSAGE_MAP(CMyView, CView) /AFX_MSG_MAP(CMyView) / NOTE - the ClassWizard will add and remove mapping macro

6、s here. / DO NOT EDIT what you see in these blocks of generated code! /AFX_MSG_MAP / Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview) END_MESSAGE_MAP() / / CMyView c

7、onstruction/destruction CMyView:CMyView() / TODO: add construction code here CMyView:CMyView() BOOL CMyView:PreCreateWindow(CREATESTRUCT / / CMyView drawing void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); LINECLIP(); / TODO: add draw code for native data here / / CMyV

8、iew printing BOOL CMyView:OnPreparePrinting(CPrintInfo* pInfo) / default preparation return DoPreparePrinting(pInfo); void CMyView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add extra initialization before printing void CMyView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / T

9、ODO: add cleanup after printing / / CMyView diagnostics #ifdef _DEBUG void CMyView:AssertValid() const CView:AssertValid(); void CMyView:Dump(CDumpContext CMyDoc* CMyView:GetDocument() / non-debug version is inline ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyDoc); return (CMyDoc*)m_pDocument; #endi

10、f /_DEBUG / / CMyView message handlers void CMyView:LINECLIP() /使用梁友栋 -Basky 直线裁剪算法 CDC* pDC=GetDC();/取得绘图设备环境上下文指针 /设置不同颜色画笔 CPen newpen1(PS_SOLID,0,RGB(183,198,0);/窗口颜色 CPen newpen2(PS_SOLID,0,RGB(0,0,1);/待裁剪线段颜色 CPen newpen3(PS_SOLID,0,RGB(160,1,255);/裁剪后可见线段颜色 /辅助变量 float p4,q4,u4; float u1,u2,r

11、4; int x1,y1,x2,y2,x0,y0,x3,y3; int dx,dy,k; int wxl=300,wxr=450,wyb=100,wyt=400; /绘制裁剪窗口 pDC-SelectObject( pDC-Rectangle(wxl,wyt,wxr,wyb); x1=100; y1=200; x2=600; y2=400; /绘制被裁剪线段 pDC-SelectObject( pDC-MoveTo(x1,y1); pDC-LineTo(x2,y2); /计算 dx=x2-x1; dy=y2-y1; p0=(float)-dx; p1=(float)dx; p2=(float)

12、-dy; p3=(float)(dy); q0=(float)(x1-wxl); q1=(float)(wxr-x1); q2=(float)(y1-wyb); q3=(float)(wyt-y1); for(k=0;krk)?0:rk;/取用 0 与 rk 中的大值 else uk=(rku1)?uk:u1;/取用 0 与 uk中的大值 else u2=(ukSelectObject( pDC-MoveTo(x0,y0); pDC-LineTo(x3,y3); 六、实验结果与分析 本图中矩形内紫色线段为裁剪之后可见线段,外部的黑色线段部分为带裁剪部分。 七、实验中遇到的问题及解决方法 1.对于 VisualC+6.0的工程文件即:MFC 的环境不熟悉,开始时编写视图View 下的 程序在步骤上尚有困难,不知道该怎样使用该环境,再参考了一些相关书籍和求教于其他人 之后,这个问题得到了解决。 2.最初只是在后面添加了自编程序,并没有在“OnDraw ” 里面加入该程序的调用,程序 编译没有错误, 但运行后只是一个窗口,并没有图像, 后来在同学的帮助下发现了这个错误, 改正后程序顺利运行。 3.程序编写过程中的语法不再是问题,偶尔有疏忽的时候,编译时一般就能改正了。 4.在程序编写时对于点的坐标值不是很注意,随意定义了一些点,造成直线画到了图 形的外面。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1