- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(图形旋转和歪斜的椭圆
图形旋转和歪斜的椭圆 介绍 窗口中的矩形,带圆角的矩形和椭圆只能由GDI在轴向上绘制。假如有人希望在Windows NT下绘制旋转或歪斜的图形,他可以使用世界坐标系变换。很不幸的是在Windows 95/98下,是没有世界坐标系变换的。作为一个跨平台的解决方案,就需要自己做更多的工作。矩形能由四边形模拟,这样它就能旋转和歪斜了。然而,椭圆又该怎么办呢?基本上有三个选择 两种选择 使用一个定制的函数来画椭圆。 椭圆的数学模型相对简单,而且还有用于在标准文本中旋转椭圆的修改过的Bresenham方程。然而,这种方法必须自己执行光栅操作,这样在绘制宽线时就变得复杂了。这种努力只有在向一个脱离屏幕的表面(比如DirectDraw)或位图上绘制视才是值得的 用连接的线段来绘制椭圆。 实际的线条可以通过LineTo(...)或Polyline(...)图形设备接口调用。你可以自己完成椭圆的近似,或者使用GDI的FlattenPath(...) 函数 使用贝塞尔曲线来近似绘制椭圆。 这里就举例说明这种方法。 用贝塞尔曲线绘制椭圆 使用四条贝塞尔曲线,每条代表原轴向椭圆的90度,这样就能获得一个相当近似的椭圆,最大误差只有0.027%。这个最大误差相当于长径3700的椭圆的误差小于一个像素,这已经超出我们所要求的准确度了。 优点 简单。 只需要有四个GDI调用。贝塞尔曲线控制点的计算代价是很小的。 快速 你可以利用现在新的显卡对曲线绘制的硬件支持。在我的系统上,这和调用GDI函数Ellipse(...)绘制椭圆的速度比,如果不是更快,至少也是一样快。 变化 因为贝塞尔曲线在旋转、缩放和平移时是不变的,在对椭圆做同样的变化时就只需要传送控制点。更巧的是,因为在一个三次贝塞尔曲线上的每个点都是控制点的重心组合,在仿射映射中曲线上控制点之间的关系是不变的。 设备无关性 假如想自己把椭圆转化为线段或光栅,那么每次表面的分辨率和设备描述表改变时(例如向一个打印机设备描述表绘制时),就必须重新光栅化。而使用贝塞尔曲线时就不需要这样做。还有一个好处就是椭圆能通过图元文件输出到绘画程序,例如CORELDRAW,在其中可以没有失真的缩放图形。 过程 首先以一个轴向椭圆的外接边界矩形开始(使用一个普通的GDI调用)。13个定义4条组成椭圆的贝塞尔曲线的控制点(以下标为0-12)可使用一个经验常量计算得出。下列代码为Y轴正方向向下的的映射模式产生控制点(例如MM_TEXT)。在Y轴正方向向上时,只要如注释中所示,把偏移量设为负值就行了。 // Create points to simulate ellipse using beziers//使用贝塞尔曲线创建点,模拟椭圆void EllipseToBezier(CRect r, CPoint* cCtlPt){ // MAGICAL CONSTANT to map ellipse to beziers // 2/3*(sqrt(2)-1) // 把椭圆映射为贝塞尔曲线的常量 2/3*(sqrt(2)-1) const double EToBConst =0.2761423749154; CSize offset((int)(r.Width() * EToBConst), (int)(r.Height() * EToBConst));// Use the following line instead for mapping systems where +ve Y is upwards// 在Y轴正方向向上时,使用下面一行// CSize offset((int)(r.Width() * EToBConst), -(int)(r.Height() * EToBConst)); CPoint centre((r.left + r.right) / 2, (r.top + r.bottom) / 2); cCtlPt[0].x = //------------------------/ cCtlPt[1].x = // / cCtlPt[11].x = // 2___3___4 / cCtlPt[12].x = r.left; // 1 5 / cCtlPt[5].x = // | | / cCtlPt[6
您可能关注的文档
最近下载
- (2025秋新版)青岛版科学二年级上册《14 制作方向辨识盘》教案.pdf VIP
- [美的空调]2017美的中央空调设计选型手册(上).pdf
- TCRHA-床旁超声引导下鼻肠管留置操作规范.pdf VIP
- T_ZZB 3785-2024 中小学生午休课桌椅.docx VIP
- 预防艾滋病、梅毒和乙肝母婴传播登记及随访表.docx
- 高考数学母题:三角函数.doc VIP
- 义务教育版(2024)五年级信息科技 第29课 智能工具再体验 教案.docx VIP
- 第二单元+第2课+科技之光+课件 +2024—2025学年人教版(2024)初中美术七年级上册+.pptx VIP
- 【外研版】(三起)五年级英语上册(全册)同步训练(含答案).pdf VIP
- 黑色素瘤诊疗指南(2025年版).docx VIP
文档评论(0)