- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机图形学实验文件.doc
课程名称计算机图形学实验项目 直线裁剪
批改日期 成 绩
一算法设计
(1)整条直线在窗口内。此时,不需剪裁,显示整条直线。
(2)整条直线在窗口外,此时,不需剪裁,不显示整条直线。
(3)部分直线在窗口内,部分直线在窗口外。此时,需要求出直线与窗框的交点,并将
窗口外的直线部分剪裁掉,显示窗口内的直线部分。
直线剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删去在窗外的直线。然
后,对其余直线,逐条与窗框求交点,并将窗口外的部分删去。
以区域编码为基础, 将窗口及其周围的 8 个方向以 4 bit 的二进制数进行编码。 如图1-24
所示的编码方法将窗口及其邻域分为5 个区域。
(1)内域:区域( 0000)。
(2)上域:区域( 1001,1000,1010)。
(3)下域:区域 (0101, 0100, 0110)。
(4)左域:区域 (1001, 0001, 0101)。
窗口及其邻域的 5 个区域及与直线的关系
区域 (1010, 0010, 0110)。
当线段的两个端点的编码的逻辑 “与”非零时,线段显然为不可见的。对某线段的两各
端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右。算法的主要思
想是,对每条直线,如 P1P2 利用以下步骤进行判断:
①对直线两端点 P1、P2编码分别记为C1(P1)={ a1, b1, c1, d1} ,C2(P2)={ a2, b2, c2, d2} 其中,
ai、bi、ci、di 取值范围为{1, 0} ,i∈{1, 2} 。
② 如果 ai=bi=ci=di=0,则显示整条直线,取出下一条直线,返回步骤①;否则,进入
步骤③。
③ 如果 |a1–a2 |=1,则求直线与窗上边( y=yw –max)的交点,并删去交点以上部分。如果
|b1–b2|=1,|c1–c2|=1,|d1–d2 |=1,进行类似处理。
④ 返回步骤①判断下一条直线。
设计下图所示的菜单项。在工作区的 ResourceView 标签中,单击 Menu 项左边“ +”,
然后双击其子项 IDR_MAINFRAME ,并根据下图的定义编辑菜单资源。
菜单标题 菜单项标题 标示符 ID
裁剪 线段裁剪 ID_CLIPLINE
添加消息处理函数。
利用 ClassWizard (建立类向导)为应用程序添加与菜单项相关的消息处理函数,
ClassName 栏中选择 CMyView ,下表建立如下的消息映射函数, ClassWizard 会自动完成有
关的函数声明。
菜单项 ID 消 息 消息处理函数
ID_CLIPLINE CONMMAN OnIDTRANSLATION
利用 ClassWizard(建立类向导)为应用程序添加鼠标响应函数 OnLButtonDblClk ,以
实现双击鼠标左键弹出所要进行裁剪的直线,在这里应用了 mylineView.h 中定义的类
CPoint 的一个对象数组,来存放所要画直线的一些点。
二程序代码
函数代码,程序如下:
① 在“图形裁剪 View.h ”文档中的适当位置添加定义存储线段端点的数组。
#include N 9
public:
CPoint ptset[N];
在“mylineView.cpp ”适当位置添加以下代码。
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define XL 100
#define XR 300
#define YT 100
#define YB 250
在OnDraw 中添加下列代码:以下的数据为所要生成直线的起点与终点
CPen newpen(PS_SOLID,1,RGB(255,0,0));
CPen *old=pDC-SelectObject(newpen);
pDC-Rectangle(CRect(XL,YT,XR,YB));// 剪切窗口
ptset[0]=CPoint(120,150);
ptset[1]=CPoint(170,110);
ptset[2]=CPoint(400,0);
ptset[3]=CPoint(350,150);
ptset[4]=CPoint(0,250);
ptset[5]=CPoint(150,230);
ptset[6]=CPoint(200,50);
ptset[7]=CPoint(130,200);
pDC-TextOut(0,0, 双击鼠标左键出现要裁剪的直线 );
在添加的鼠标响应函数 OnLButtonDblClk 里加入下列代码用来在双击鼠标左键时生成要裁剪的直
线
CDC* pDC=GetDC();
CPen newpen(PS_SOLID,1,RGB(255,0,0));
C
文档评论(0)