凸多边形的拾取 - 范文中心

凸多边形的拾取

07/21

实验设计说明书

题目:凸多边形的拾取 学院:国土资源与旅游学院 专业:地理信息系统 组长:黎明

同组成员:李岩、唐鑫、胡仁德、丁王平、张锦华

完成日期:2010 年 6 月 10 日

文档历史

1 引言

1.1 项目简要介绍

在一个CAD系统中,最基本的操作就是对一个图形的拾取,本次实验就是对凸多边形进行拾取。

1.2 项目的创新点

由于本次实验是对凸多边形进行拾取,所以在判断点在其内部时,采用了叉乘法,不涉及三角运算(内角和法)、开方(面积法)和水平垂直交叉线检测。

2 概要设计

2.1 模块

2.2 简要算法

2.2.1 判断点是否在多边形内

叉乘法

若P0在凸多边形内部,则如图所示的向量的乘积应该都是大于0的。

2.2.2 填充算法

我们直接调用了VC函数FloodFill( )对所绘制的多边形进行填充

2.3 步骤

1. 在头文件“shiquView.h”中添加如下成员变量和函数

int polygen[50][2]; int flag,n; int x0,y0,x1,y1; float maximum(float a,float b); float minimum(float a,float b); CShiquDoc* GetDocument(); int mutiply(int a,int b,int c,int d); CShiquView();

CShiquView继承了CView类。我们在CShiquView类中定义了polygen[50][2]对各个顶点的坐标进行存储。变量n存储是边(或者顶点)的个数。变量flag判断凸多边形是否画完,flag初始为0,flag=1表示正在绘制,flag=2绘制结束。x0,y0,x1,y1用来存放线段的端点,并进行循环更新。

2. 在源文件“shiquView.cpp”中的构造函数进行如下初始化

CShiquView::CShiquView() { // TODO: add construction code here flag=0; n=0; }

3. 在源文件“shiquView.cpp”中如下实现成员函数maximum( )和minimum( )

float CShiquView::maximum(float a,float b) { if(a

float CShiquView::minimum(float a,float b) { if(a>b)a=b; return a; }

4. 在源文件“shiquView.cpp”中如下实现成员函数mutiply( ),此函数求向量乘积

int CShiquView::mutiply(int a,int b,int c,int d) { return (a*c+b*d); }

5. 添加WM_LbuttonDown消息。在响应函数OnLButtonDown 中添加如下信息(加粗

部分)

void CShiquView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC*pDC=GetDC(); CPen pen; pen.CreatePen(PS_SOLID,1,RGB(0,0,0)); CPen*pold=pDC->SelectObject(&pen); if(!flag) { polygen[n][0]=x0=point.x; polygen[n][1]=y0=point.y; flag=1; } else { n++; pDC->MoveTo(x0,y0); polygen[n][0]=x1=point.x; polygen[n][1]=y1=point.y; pDC->LineTo(x1,y1); x0=x1;y0=y1; } pDC->SelectObject(pold); CView::OnLButtonDown(nFlags, point); }

6. 添加WM_LButtonDblClk消息。在响应函数OnLButtonDblClk 中添加如下信息(加

粗部分)

void CShiquView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC*pDC=GetDC(); CPen pen; pen.CreatePen(PS_SOLID,1,RGB(0,0,0)); CPen*pold=pDC->SelectObject(&pen);

pDC->MoveTo(polygen[n][0],polygen[n][1]); pDC->LineTo(polygen[0][0],polygen[0][1]); ReleaseDC(pDC); flag=2; //CView::OnLButtonDblClk(nFlags, point); }

7. 添加WM_RbuttonDown消息。在响应函数OnRButtonDown 中添加如下信息(加粗

部分)

void CShiquView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC* pDC=GetDC(); CPen pen; int a,b,c,lx,ly,j,i,zero,arrow[50][2],arrow2[50][2]; float b0,b1,b2,k; double d; // arrow[50][2]用于存放边向量,arrow2[50][2]用于存放定点到内部点的向量。 if(flag==2||flag==3) { //点在内部判断 lx=point.x; ly=point.y; for(i=0;in) {

CDC*p_DC=GetDC(); CBrush brush;

brush.CreateSolidBrush(RGB(255,0,0));

CBrush*pold2=p_DC->SelectObject(&brush); int u,v;

u=1.0/2*(polygen[0][0]+polygen[2][0]); v=1.0/2*(polygen[0][1]+polygen[2][1]); p_DC->FloodFill(u,v,RGB(0,0,0)); p_DC->SelectObject(pold2);

//改变线形

pen.CreatePen(PS_SOLID,2,RGB(0,0,255)); CPen* pold=pDC->SelectObject(&pen); for(i=0;iMoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[i+1][0],polygen[i+1][1]); }

pDC->MoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[0][0],polygen[0][1]); pDC->SelectObject(pold);

}

if(flag==3) { //对边框进行拾取 //对最后一条边进行判断 a=polygen[n][1]-polygen[0][1]; b=polygen[0][0]-polygen[n][0]; c=polygen[n][0]*polygen[0][1]-polygen[0][0]*polygen[n][1]; k=-(float)(polygen[0][0]-polygen[n][0])/(polygen[0][1]-polygen[n][1]); lx=point.x; ly=point.y; d=(float)abs(a*lx+b*ly+c)/sqrt(a*a+b*b); b0=ly-k*lx; b1=polygen[n][1]-k*polygen[n][0]; b2=polygen[0][1]-k*polygen[0][0]; if(d

CPen* pold=pDC->SelectObject(&pen); for(i=0;iMoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[i+1][0],polygen[i+1][1]); }

pDC->MoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[0][0],polygen[0][1]); pDC->SelectObject(pold);

//拾取后的填充

CDC*p_DC=GetDC(); CBrush brush;

brush.CreateSolidBrush(RGB(255,0,0));

CBrush*pold2=p_DC->SelectObject(&brush); int u,v;

u=1.0/2*(polygen[0][0]+polygen[2][0]); v=1.0/2*(polygen[0][1]+polygen[2][1]); p_DC->FloodFill(u,v,RGB(0,0,255)); p_DC->SelectObject(pold2);

}

//对其他边进行判断 for(j=0;jSelectObject(&pen); for(i=0;i

pDC->MoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[i+1][0],polygen[i+1][1]); } pDC->MoveTo(polygen[i][0],polygen[i][1]); pDC->LineTo(polygen[0][0],polygen[0][1]); pDC->SelectObject(pold); //拾取后的填充 CDC*p_DC=GetDC(); CBrush brush; brush.CreateSolidBrush(RGB(255,0,0)); CBrush*pold2=p_DC->SelectObject(&brush); int u,v; u=1.0/2*(polygen[0][0]+polygen[2][0]); v=1.0/2*(polygen[0][1]+polygen[2][1]); p_DC->FloodFill(u,v,RGB(0,0,255)); p_DC->SelectObject(pold2); } } } } CView::OnRButtonDown(nFlags, point); }

8. 在OnDraw(CDC* pDC)函数中添加如下代码(加粗部分) void CShiquView::OnDraw(CDC* pDC) { // TODO: add draw code for native data here CShiquDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->TextOut(400,50,"1、单击左键绘制多边形。"); pDC->TextOut(400,70,"2、双击左键结束绘制。"); pDC->TextOut(400,90,"3、单击右键进行拾取。"); }

3 实验结果


相关内容

  • 3DMAX修改器类型
    3DMAX修改器类型(对象空间修改器) 对象空间修改器直接影响局部空间中对象的几何体. 应用对象空间修改器时,使用中的其他对象空间修改器,对象空间修改器直接显示在对象的上方.堆栈中显示修改器的顺序可以影响结果几何体. 本节内容  影响区域 ...
  • 隆中对知识归纳与练习题目
    隆中对知识归纳与练习 一.通假字 1. 欲信大义于天下 2. 自董卓已. 来 二.古今异义词 1.将军宜枉顾.之 2.凡.三往 3. 孤.不度德量力 4.此殆.所以资将军 5. 遂用.猖獗 6.遂用猖獗.. 7. 抑.亦人谋也 8.此可以. ...
  • 有趣也很有意义的图书漂流网 巴哥哥和巴姐姐的窝 网站 图书
    2006 2月 6日, 星期一 有趣也很有意义的图书漂流网 |手气不错? | 与本文相关的阅读 餐叉艺术网超可爱的情人节网站有点意思,支持AIM.ICQ.Gtalk.MSNM.Yahoo Messenger.Jabber登录的Web入口关注 ...
  • 滚动轴承故障
    轴承类故障 例1 云南铜业股份有限公司锅炉引风机故障 (1) 机组概述 电收尘车间锅炉引风机(布袋风机),由电动机通过联轴器和轴承座带动风机叶轮转动,叶片数12,为典型的悬臂风机,介质为烟气尾气,支撑均为滚动轴承.其相关参数如下: 电机额定 ...
  • 滚动轴承故障诊断中精确转频的实用计算新方法
    振 动 与 冲 击 第26卷第5期 J OURNAL OF V IBRAT I ON AND SHOCK Vo. l 26No . 52007 滚动轴承故障诊断中精确转频的实用计算新方法 罗红梅, 齐明侠, 裴峻峰, 潜 凌 1 1 2 3 ...
  • 松下KX系列传真机使用和维护常识
    随着传真机应用的逐渐普及,许多读者来信要求介绍传真机的使用维护知识.鉴于松下KX系列新型多用传真机融传真.应答和通话等多功能于一体,深受国内用户喜爱,特约请车生兵老师撰文就该系列传真机的使用和维护以讲座形式予以介绍,讲座共七讲,以期对大家有 ...
  • 初中数学[多边形及其内角和]教学案例
    <多边形及内角和>教学案例 讷河市孔国乡进化中心学校刘桂兰 教学目标. 1.知识目标:了解多边形内角和公式. 2.数学思考:通过把多边形转化成三角形体会转化思想在几何中的运用,同时让学生体会从特殊到一般的认识问题的方法. 3.解 ...
  • 初中数学综合实践活动教案
    课题:数格点 算面积 陆秀成 一.活动目标 (1)通过画图.列表.分析数据.寻找规律: (2) 获得一些研究问题的方法和经验,发展思维能力,加深理解相关的数学知识 (3)通过获得成功的体验和克服困难的经历,增强应用数学的自信心 二.活动重点 ...
  • 图形的相似
    图形的相似 1. 如果选用同一个长度单位量得的两条线段AB,CD的长度分别是m,n 那么就说这两条线段的比AB:CD=m:n,或写成AB/CD=m/n.分别叫做这个线段比的前项后项. 2. 在地图或工程图纸上,图上长度与实际长度的比通常称为 ...