- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详细设计说明书
1.程序结构
1.1程序结构
整个解决方案包含6个子项目。其中pugixml、tinyxml是引用的两个库,用来实现XML解析。Setup是一个安装程序生成项目,需要插件才能编译。UAC为在开启UAC之后提升进程优先级用的辅助程序。configEdit是配置文件编辑器,是一个MFC项目。lineCircle是核心的主程序,使用c++和Windows API直接编写。矚慫润厲钐瘗睞枥庑赖賃軔朧碍鳝绢懣硯涛镕頃赎巯驂雞虯从躜鞯烧。
1.2程序文件清单
Js 目录:用NodeJS写的小程序,用来打表
Data:测试数据目录
Pugixml
Tinyxml
configEdit
configEdit.h
configEdit.cpp 程序的APP类
configEdit.rc 程序的资源文件
configEditDlg.cpp 程序的Dlg类
configEditDlg.h
Resource.h 生成的资源符号文件
Stdafx.cpp
Stdafx.h 预编译头
Targetver.h
lineCircle
Common 公共部分
CMemPool.cpp 内存池实现
CMemPool.h
Global.cpp 全局变量
Global.h
Cut 裁剪模块代码
cutCPU.cpp 使用CPU进行裁剪
cutCPU.h
Draw 绘图模块
drawGDI.cpp 通过GDI进行绘图
drawGDI.h
drawMemory.cpp 使用内存绘图模式绘图
drawMemory.h
drawMemoryGDI.cpp 通过GDI缓存绘图
drawMemoryGDI.h
drawOpenGL.cpp 通过OpenGL绘图(未完成)
drawOpenGL.h
Wrapper
Graph.cpp 几个图形类的定义
Math.cpp 封装的数学函数(并没有使用,现在强制查表)
Math.h
Xml
minXml.cpp 状态机的XML解析
minXml.h
pugiXMLPrase.cpp pugixml解析
pugiXMLPrase.h
tinyXMLPrase.cpp tinyxml解析
tinyXMLPrase.h
xmlPrase.cpp 统一的解析接口,包含了数据缓存
xmlPrase.h
Graph.h 图形部分的头文件
lineCircle.cpp 主文件
lineCircle.rc 资源文件
Resource.h 资源文件生成的符号文件
Setting.cpp 设置文件
Setting.h
Stdafx.cpp
Stdafx.h 预编译头。程序没有使用预编译头进行编译,这个算是公共的头文件吧
Targetver.h
Setup 安装程序
1.3程序架构
主程序
配置模块
绘图模块
裁剪模块
其他模块
读取配置
写入配置
GDI
GDI缓存
内存绘图
CPU裁剪
裁剪算法
2.1 直线裁剪
假设有上图所示线段进行裁剪。黑色的线为多边形边界,红色的线为被裁剪的线段。依次求多边形每条边与被裁剪线段的交点,可以得到四个交点。除此之外还有两个端点,在图种用绿色点表示。对这六个点以x为标准或者以y为标准进行排序,排序之后的这六个点每两个点可以连接成一条线段。依次判断这些线段的中点(黄色标出)是否在多边形内,在多边形内就保留,否则舍弃。聞創沟燴鐺險爱氇谴净祸測樅锯鳗鲮詣鋃陉蛮苎覺藍驳驂签拋敘睑绑。
当线段没有交点的时候操作也是一样的,对端点进行排序,然后判断中点是否在多边形边界内。
2.2 圆裁剪
如上图所示,让圆依次和多边形边界线段求交点,得到极坐标的弧度。对弧度进行排序然后判断两个点的中间点是否在边界内,来确定弧形的保留还是删除。残骛楼諍锩瀨濟溆塹籟婭骒東戇鳖納们怿碩洒強缦骟飴顢歡窃緞駔蚂。
2.3 判断点在边界内
先在位图内把边界填充完成,这里为了方便使用的GDI的填充。填充之后取得位图,需要的时候查表判断像素就可以了。酽锕极額閉镇桧猪訣锥顧荭钯詢鳕驄粪讳鱸况閫硯浈颡閿审詔頃緯贾。
射线法也可以实现,不过由于效率底下,放弃。
内积之类的方法只能在凸多边形使用,放弃。
2.4 求两个线段交点
没有什么特殊的算法,就是单纯的求两个线段的交点,然后判断交点坐标是否在允许的范围之内。
2.5 求线段和圆的交点
这个问题考虑了挺久。没什么好的方法,还是单纯的解方程。本来用极坐标下来解,但是由于有两个虚根没法区分所以没用极坐标。用的还是直角坐标。彈贸摄尔霁毙攬砖卤庑诒尔肤亿鳔简闷鼋缔鋃耧泞蹤頓鍥義锥柽鳗铟。
先坐标平移,把圆心作为原点,然后联立解方程(丢给wolframalpha就好,用前三个实根就好)。然后判断解出来的解是否在线段的范围内。謀荞抟箧飆鐸怼类蒋薔點鉍杂篓鳐驱數硯侖葒屜懣勻雏鉚預齒贡缢颔。
应用的常数优化
3.1
文档评论(0)