线型的通用算法和数据结构(300分)

  • 主题发起人 主题发起人 proman
  • 开始时间 开始时间
P

proman

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个绘图系统,其中需要画一些矢量图形。在画图时有一个很重要的参数就是画笔
大家都知道Windows的画笔比较简单。现在我需要一个通用的能够改变我的画笔画出来的线
型。我的初步思想是要设计一个通用算法能够从一个描述线型的结构中读出数据从而画出来。
而我可以通我一个编辑器来改变数据结构的数据从而改变线型。
盼望高手能在算法的实现及数据结构的设计上给予帮助,可探讨也可。分数可以再加,请
大家积极计论。
 
几点意见:

1、原来用AutoCAD的时候,看过它的自定义线型的结构,好象是个文本文件
说明线长与间隔,比较简单的,唉,很久不用想不起来了!一般书上都有介绍
你的线型结构可以参考.

2、在API的HPEN是支持自定义线型的(PS_USERSTYLE和结构)具体用法的
可以参考Win32API.hlp
 
To:杜宝
你说的我也知道,可是PS_USERSTYLE太简单了,不能够实现高级线型,比如火车线路等各种
型号的线型。希望大家积极讨论。
 
其实你自己不就已经想到办法了吗? 定义一个结构体来描述你的画笔,写个程序能够根据
这个结构体来设置画笔. 如果结构体的信息需要保存下来,就自己定一个文件格式,把结构
体按照二进制流的方式保存下来就行了
 
TO:hopfield
问题是没法画出来啊。比如说你定义了一个线型,可是你怎么样用Windows的画笔画出来呢?
请大家再积极讨论。
 
>>比如火车线路等各种型号的线型。

我不知道火车线路是什么样子的,如果复杂的话就只有用自定义Brush了,新建一个新的
线型类,加实现基本的画线功能:
1、画直线:就是画一个矩形,用Brush来填充它
2、圆、椭圆:就是圆环或椭圆环
3、多边形:比较复杂,得具体想一想它的算法
Brush的图案可能用BitMap,应该还是比较方便的。

 
画区域也是一个办法,可是有问题,当是曲线时,填充的刷子不能随着线的方向而变化,而
是总是正的,而我要求是能够随是线的方向变化的。
 
AutoCad中用的是glLineStipple实现的;如果对于TPenStyle不满意,
可以借鉴自己写类似的函数,可以分段截取分段画出,一般说来效率还可以。
画区域的时候得自己写刷子了;类似的方法是先画到32*32的位图上,然后再一块一块的
拼接起来,类似于glPolygonStipple。建议尽量不要采用DC作图;比如做到三维字体
的时候,DC就远远不够了。一般的功能还是可以的。
 
To proman:
Autocad我没用过,对你的需求我还是不太清楚. 不过我觉得你所说的其实已经不是
我们平常对Pen或Brush的属性的设置了,而是根据所要画的线型对Pen和Brush做设置
并把线型画出来,也就是说分两步:设置---->画图.
我觉得你有必要对你需求做一个很好的分析,建立起一个面向对象的体系,比如:
多边形---->矩形--->三角形.
有了上面的体系以后,可以再建立起具体的对象,如:火车线,汽车线,.....
只要规划合理,就可以建立起一个很好的面向对象的程序
 
To:大家
关键是画出来。如果不能用Windows的画笔去画的话,我自己想不出什么好方法,除非一个
点一个点的画。我再讲一下我的需求:
我需要画很多图形,有线段,区域等。所有这些对象我都是用Windows的Api去画的。设置好
画笔和刷子以后直接画就可以了。
可是Windows的画笔支持的类型实在是太少了,就算是Windows2k的扩展画笔也是一样。这样
我就不能画出任意的线型,线型不光是画线段的时候用,区域的边界也是要有线型的。现在
要解决的就是这样的问题,怎么样画出任意的线型。
谢谢大家,请继续讨论。
 
只能自己写;分段截取,把线一段一段的画。但是Windows在这方面处理得不好;
如果线性过粗,每段线段的接头处就会圆圆的;自己用实心矩形来模拟,
就是效率会有一点点影响。
线段总长为w,填充部分每单位长a,不填充部分每单位长b,就可以分成w div (a+b)个小段。
区域的填充,那样肯定不行的;只能一段一段的拼接。
DC作图的限制太多;。。。
 
TO:engleking.
对于直线这是没有问题的,可是如果是弧线呢,在转弯的地方怎么处理呢?不会要我自己去
算吧,太慢了。
 
对于圆弧合椭圆弧来说,画法你可以采用三点画弧或者圆心->半径->圆心角 画弧,
我觉得尽量的用多边形来逼近比用API好;一个32分圆已经很圆了,把需要角度的
三角函数用大数组存储起来,省却很多麻烦,而且如果你接下来要写求交点,切点
,垂线等等来说,用多边形也比直接画圆好得多,而且效率也高(任意的正多边形
也免得写了);而且如果做整体的压缩或者旋转,用点来计算也要好得多。。
 
我不是很明白 "现在我需要一个通用的能够改变我的画笔画出来的线型"是什么意思?
Windows提供了几种线型,如实线,虚线等...,你可以通过Windows的Help查找到。对单纯
的画线,画圆等来说这些线型是足够的。

另:我以为你的现在的问题的本质是不是:想做成photoShop中画刷那样的工具?用选择的画
刷画出鼠标移动的轨迹?
如果是那样的话,下面是我的想法,希望能帮的你。
1、因为慢慢的移动鼠标和快速移动鼠标是不一样的,如果慢慢的移动,你得到的WM_MOUSEMOVE
的消息就会比较多一些,这样,你就可用以插值的方法将这个离散的鼠标轨迹恢复成一条光
滑的曲线,i.e. y=f(x)。肯定有一个方法让鼠标快移在慢移时取得的轨迹信息差不多,但
是我没有找出来,希望你能。
2、关于插值,你可以去看数学书,这我帮不了你。我以前做这个的时候,这方面是效率不是
太好。
3、最后,你在曲线上取若干个点,两点间的距离就是设置的画刷的间距。然后,就把你的画
刷的中点放在这些点上,你的线也就成画成了。

大致的算法是这样的,但是质量可就不一样了。:)
 
To:baibaichen
意思就是比如给你两个点,要你在两个点之间画条线,但是画出来的线型要可以选择,比如
简单的实线,虚线,点划线等,这些都是Windows提供的,我现在要的是复杂的线型,这个
线型要是可以修改的才行,不知我说明白了没有。
TO:engleking
对这种想法,我现在首先想知道怎么样组织这个线型的数据结构,就是怎么样描述这个多边
型。
 
不晓得,你需要什么样画什么样形状的线?
 
TO:baibaichen
比如说:我要画一条火车道路。
 
画铁路是GIS/CAD领域的经典问题之一。
我的实现是这样的:
可以用一个字节(或多个)的01分布来描述线型,如11101110就是虚线的一种,再加上其它的一些信息(有没有边框等)就可以了,不过我想告诉你:画铁路最难的地方是在拐弯处和两条铁路交叉的地方,其它没有什么花头。
 
TO:吕雪松
我也知道这个地方难,所以才问你应该怎么实现。能提供一段代码给我参考吗?
 
后退
顶部