2D
图形相关
使用拓扑进行几何图形布尔运算
摘要: 首先吐槽一下:今天考IT项目管理,100道选择题。前几天考配置管理,10道大题。如今的老师都喜欢走极端……
这个方法是在考完试回宿舍的路上想到的,适用于2D与3D。主要想法是这样的。给定两个几何图形A、B,把A和B都分成『内『、『外』两部分。A的『内』就是处于B内部的部分。于是A和B就变成了A内、A外、B内、B外。然后就有如下公式:
·A and B=A外+B外
·A sub B=A外+B内
·A or B=A内+B内
·A xor B=A外+B外+A内+B内
这种数据结构是为了满足如下算法:一个A点在图形内<==>过这个点的直线交图形与点集P,其中|{Pi|Pi<=A}|和|{Pi|Pi>=A}|都是奇数。注意我们使用的是<=和>=,这样的话两个集合的数量的奇偶性都是一致的。这个算法无论2D、3D多边形还是3D多面体都能适用,就算是这个图形有孔(镶嵌)也可以,而且跟凹凸体无关。这个算法只有一种情况是不能用的:就是自己跟自己有交叉,譬如我们习惯的5条直线构成五角星的画法。这
阅读全文
posted @
2008-06-17 11:20 陈梓瀚(vczh) 阅读(1159) |
评论 (5) 编辑
接下去的事情
posted @
2008-06-13 01:40 陈梓瀚(vczh) 阅读(119) |
评论 (2) 编辑
椭圆段扫描完成
摘要: 终于完成了相当于GDI中Arc函数的功能了。这次仍然跟API有点误差,不多这里的误差是GDI的问题。这里贴出截图和代码。观看图2和图3,我们知道椭圆是对称的,但是GDI并没有做到这一点。我的算法也不能精确对称,但是左右两边仅相差1个像素。Arc是椭圆的子集,所以Arc在这个局部(椭圆的最上方)中也应该左右对称。图1中我先用GDI绘制黑色Arc,然后使用我的算法绘制红色Arc。这里的自适应步长算法跟上一篇的Bezier曲线的算法是一样的。
阅读全文
posted @
2008-06-12 22:02 陈梓瀚(vczh) 阅读(1152) |
评论 (2) 编辑
自适应步长Bezier曲线扫描
摘要: 花了两个小时把这个东西做好了。虽然不及[LIEN87 ; SHAN87 ; SHAN89]论文厉害,不过自己弄的这个写起来倒是相当容易的。在这里贴出效果图和代码。效果图中,我先使用蓝色画笔,用PolyBezier绘制曲线,然后使用红色像素使用自己的算法绘制曲线。可以看见有一点点误差,不过效果还是可以接受的。代码仍然使用自己的那套库开发,不过曲线扫描的方法不受库的限制。这个算法保证点不会被重复绘制。
有了这个算法之后我就可以把贝塞尔曲线转换成密度刚好的折线了。这才是最终目的。
阅读全文
posted @
2008-06-12 13:20 陈梓瀚(vczh) 阅读(1101) |
评论 (1) 编辑
终于提取到了TrueType字体的轮廓了
摘要: 为了让这篇文章说的东西能够落实,无法躲避的基本东西还是要先准备一下的。今天花了6个小时查了无数资料终于把文字的边框弄出来了。
在此贴出代码和效果图,不作过多解释。熟悉Win32API中的GDI部分的朋友们可以很容易看懂。
效果图:
提取的轮廓:红色和黑色为直线,蓝色为四次贝塞尔曲线。其中上面是先TextOut后自己画,下面是先自己画后TextOut。四次贝塞尔曲线转换成三次贝塞尔曲线之后使用PolyBezier绘制。
代码:
代码使用的框架是我自己寒假无聊的时候封装API的结果,暂时有窗口、菜单、组合键以及菜单,附带GDI。事件自己弄了一个跟C#差不多的可以同时Bind很多不同种类函数的东西。不过这个不是重点。需要重点阅读的是如何使用GetGlyphOutline。
dtof将double转换成FIXED,ftod相反。
GetPoint进行点的变换,主要是因为画字符的时候需要偏移。
DrawCurve绘制边框。
阅读全文
posted @
2008-06-11 23:48 陈梓瀚(vczh) 阅读(1474) |
评论 (7) 编辑