MS visio 中交叉线自动弯曲是如何实现的?

ziscloud 2009-04-03 09:58:53
大家好!
小弟正在做一个PERT(网络计划图)的绘制程序,在编写程序的过程中遇到一个问题:
在MS 的visio中,用户在画线的时候,如果两条线出现了交叉,那么新的线条会自动在交叉处弯曲。在我正在写的程序中,也需要有这样的一个功能,但是不知道这样的功能是如何实现的。
最主要的问题是:
1、如何确定交叉?是不是每添加或者每当绘制一条线条的时候,都要遍历之前的所有线条来确定和新的线条是否存在交叉,有没有一些好的算法可以推荐一下;
2、两条线条存在交叉的成立条件是什么?现在我能想到的办法是遍历线条上的所有点来确定交叉点,但这个方法并不好!
还望高手指点!
谢谢!


...全文
5257 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
IONPhantom 2009-04-03
  • 打赏
  • 举报
回复
遍历所有线条确定是否相交这个是必须的,而且没有其他替代方法,因为这些线条也没有任何可排序的方法,线条可能在屏幕上任意一点画另一个任意点.

至于求交点当然不能每点遍历,首先可以通过几何计算求2条直线交点(这个不困难,中学几何),然后判断这个交点是否在两条线段之内.
量子高宏亮 2009-04-03
  • 打赏
  • 举报
回复
建议将问题分解到每个线条对象的处理上。不要采用窗口中保存所有线条的信息,并遍历的方法,效率低。

也就是说,做一个Line类或者控件,能够接收其他线条发送的消息,并能发送消息给其他控件

例如:线条A和线条B

绘图窗口口保存所有绘图对象(直线、曲线等)的指针
线条A放在某处,线条B每次移动时,线条B发送自己的“位置区域消息”发送给窗口,窗口将其通过对象指针列表通知到所有绘图对象,
线条A接收到消息,判断自己的位置区域和B的“位置区域消息”存在交叉,线条A发送“交叉消息”给窗口,窗口再通过对象指针列表通知到所有绘图对象,
对象B接收到消息,知道自己和其他线条交叉后,改变自己的形状出现交叉弯曲。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧