交互式绘图技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 窗口坐标(用户坐标)和视口坐标(设备坐标)
的相互转换
– 设备坐标转换为逻辑坐标
• void DPtoLP(LPPOINT lppoints, int nCount); • void DPtoLP(LPRECT lpRect);
– 逻辑坐标转换为设备坐标
• void LPtoDP(LPPOINT lppoints, int nCount);
A C B P
2
D
• 矩形拾取
完全在矩形内部
与矩形相交及被 选取
• 拾取直线段的步骤:
– 1、点击拾取按钮:
• View类中当前工具m_ToolIndex = SELECTBYPOINT
– 2、线段类中增加SelectByPoint(CPoint)函数
• 判断点是否在直线段的外接矩形内部;
• 判断点到直线的距离的平方;
交互图形显示
• 全图 • 拉框放大 • 平移 • 直线段的选取 通过GDI窗口到视口的映射
机制实现
如何建立映射?
1、设置缩放比例: 按窗口和视口的长 宽比例对图形进行 缩放变换 2、设置显示位 置:窗口中某一 点与视口某一点 对应
窗口:用户坐标系中 的显示范围
视口:设备(屏幕) 中的显示范围
如何建立映射:
• 交互绘制折线的步骤:
– 1、添加折线类CPolyline,增加成员变量和 成员函数
– 2、 Doc类中增加折线动态数组,用于存放 绘制的折线 – 3、点击绘制按钮,修改绘制状态:
• View类中 m_ToolIndex = DRAWPOLYLINE;
– 4、OnLButtonDown函数 – 5、OnMouseMove函数 – 6、View类的OnDraw中增加绘制polyline的 代码
– CDC::SetWindowOrg(int X,int Y);
– 2)定义设备(屏幕)坐标中的视口原点 – CDC::SetViewportOrg(int X, int Y)
• 设置客户区中心为视口原点: – CRect Rect; //获取客户区尺寸; – GetClientRect(&Rect); – pDC->SetViewportOrg(Rect.Width()/2,Rect.Height()/2);
DC(Device Context) 实现与设备无关绘图的虚拟画布
交互图形绘制
• 线段的交互式绘制 • 矩形的交互式绘制 • 折线(polyline)的交互式绘制 • 橡皮线技术
• 交互绘制直线段的步骤:
– 1、建立线段类
– 2、Doc类中增加线段动态数组,用于存放绘
制的线段
– 3、点击直线绘制按钮(菜单),设置绘制状 态,View类中 m_ToolIndex = DRAWLINE – 4、View类中增加OnLButtonDown函数 – 5、View类中增加OnMouseMove函数 – 6、View类的OnDraw中增加绘制线段的代码
• 如果距离的平方小于16,表示该线段被拾取, b_Selected = true
– 3、OnLButtonDown函数
• 调用每条线段中的SelectByPoint函数
实验七
• • 实验项目名称:交互绘图程序 实验日期:2011年12月12日7.8节 检查
•
实验内容:
– 实现线段、矩形、折线(polyline)、多边
– CDC::SetViewportExt(int Pwidth, int Pheight)
视口y轴默认向下,若Lheight和Pheight 符号不一致,则纵坐标取反,y轴向上
• 3、设置显示位置:窗口中某一点与视口某一点对
应,CDC通过设置窗口和视口的“原点”实现
– 1)定义用户(逻辑)坐标中的窗口原点
Windows下基于消息的事件驱动编程
消息MSG结构是Windows的一种数据结构,是对事件的描述。 接收和处理消息的是窗口,每个窗口都有一个专门负责处理消 息的 “窗口函数”。
MFC中的事件驱动编程 定义消息与处理函数的对照表(消息映射),实现了消息处理的 分离编程。程序员不再需要编写庞大的窗口函数。
1、映射模式设置:
int
• • • • •
SetMapMode(int
nMapMode);
+Y ↓ ↑ ↑ ↑
一是控制坐标轴Y的方向;二是坐标系统的单位长度
映射模式 MM_TEXT(默认) MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH 逻辑单位 1象素 0.1mm 0.01mm 0.01英寸
VC6中的基本绘图类
CObject
GDI(Graphics Device Interface) API函数,负责系统与绘图程序 之间的信息交换,实现与设备无 关的图形输出
绘图工具类
CGdiObject
CPen CBrush CFont CBitmap CPalette CRgn CDC
绘图类
CClientDC CWindowDC CPaintDC
– 2、OnMouseMove
• 记录平移终点; • 计算出x和y方向的平移量;
• 修改窗口区矩形MapRc;
• Invalidate() 刷新视图。
• 全图:
– 1、OnFullExtent:
• 对所有图形的外接矩形进行合并,得到包含所有 图形的外接矩形;
• 修改窗口区矩形MapRc;
• Invalidate() 刷新视图。
• 点拾取:点到直线段的距离小于一定阈值,则线被 选取 点P0(x0,y0)到线段P1(x1,y1)P2(x2,y2)距离的平方可以由
下式计算得到:
d
2
( y1 y2 ) x0 ( x1 x2 ) y0 ( y1 y2 ) x1 ( x1 x2 ) y1 ( x1 x2 ) 2 ( y1 y2 ) 2
交来自百度文库绘图技术
• 事件驱动模式 • 交互图形绘制 • 线段、矩形、折线、橡皮线技术 • 交互图形显示 • 全图、拉框放大、平移
• 事件驱动模式
消 息
消息 (1)事件是产生某种后果或影响的行为,比如单击鼠 标左键等;
(2)消息是描述事件发生的信息。如单击鼠标左键时, 系统产生消息WM_LBUTTONDOWN。
• void LPtoDP(LPRECT lpRect);
• 拉框放大: – 1、定义窗口区矩形和视口区矩形
• RECT MapRc; • RECT sr; //窗口区矩形 //视口区矩形
– 2、OnPrepareDC中设定窗口到视口的映射,其 会在OnDraw之前被调用 – 3、OnLButtonDown:
•
•
MM_ANISOTROPIC
MM_ISOTROPIC
不固定
默认↓
不固定(XY比例一致) 默认↓
• 2、设置缩放比例:按窗口和视口的长宽比例对图形 进行缩放,CDC通过设置窗口和视口的宽度和高度 实现 – 1)定义用户(逻辑)坐标中的窗口宽度高度 – CDC::SetWindowExt(int Lwidth, int Lheight) – 2)定义设备(屏幕)坐标中的视口宽度高度
• 交互绘制矩形的步骤:
– 1、Doc类中增加矩形动态数组,用于存放绘
制的矩形
– 2、点击绘制按钮,修改绘制状态:
• View类中 m_ToolIndex = DRAWRECT;
– 3、OnLButtonDown函数 – 4、OnMouseMove函数 – 5、View类的OnDraw中增加绘制矩形的代码
形(polygon)的交互式绘制
– 实现全图、拉框放大、平移等图形浏览功能 – 实现直线段的拾取功能:点拾取、拉框拾取
• 记录窗口区矩形MapRc的左上坐标(逻辑坐标)
– 4、OnLButtonUp:
• 记录窗口区矩形MapRc的右下坐标(逻辑坐标) • Invalidate();
– 5、OnMouseMove
• 绘制橡皮矩形框
• 平移:
– 1、OnLButtonDown:
• 记录平移起点;
• m_PanMoving = true;