如何找到矢量路径的方向

时间:2010-12-14 10:08:24

标签: algorithm vector vector-graphics

我有一个矢量路径(由lineto,curveTo点组成),我想确定它的方向(顺时针,逆时针)。

是否有可用于相同的算法?

我想这样做的原因是我从不同的功能获得两条路径;一个是顺时针方向但另一个函数有时会返回逆时针方向;当我组合这两条路径并填充结果路径时,非零绕组填充规则会在路径重叠的区域中创建一个孔。

所以我试图通过在合并之前将所有路径转换为顺时针方向来解决问题。

2 个答案:

答案 0 :(得分:2)

编辑:请参阅以下评论:

什么是顺时针?一个很好的例子。你顺时针考虑这条路径吗?:

alt text

如果您说是,那么这个呢?

alt text

遵循我的原始提案,该提案适用于凸路径:

您可以使用3D矢量的叉积。

如果a,b两个向量,那么:

  

a =(a1,a2,a3)

     

b =(b1,b2,b3)

然后交叉产品

  

axb =(a2b3-a3b2,a3b1-a1b3,a1b2 - a2b1)

现在,如果你假设你描述的路径本身不相交(这会使顺时针或逆时针点无效),那么你所需要的只是它们呈现顺序的前三个点。然后从它们中创建2个向量,您可以计算它们的叉积。

假设您按顺序拥有这些要点:

  

a =(a1,a2)

     

b =(b1,b2)

     

c =(c1,c2)

您创建以下向量:

  

A =(A1,A2)= ab =(b1-a1,b2-a2)

     

B =(B1,B2)= bc =(c1-b1,c2-b2)

然后你需要的只是AxB的第三个坐标:

  

A1B2 - A2B1

     

     

(b1-a1)(c2-b2) - (b2-a2)(c1-b1)

如果此坐标为正,则路径为逆时针,如果为负,则为顺时针。

答案 1 :(得分:2)

选择路径组件内部的任何点,然后使用填充规则确定其绕组编号是+1还是-1:

  1. 从点到无穷远绘制光线
  2. 从零开始
  3. 开始
  4. 每次路径段从左到右穿过光线时添加1
  5. 每次路径段从右到左穿过光线时减去1
  6. (如果路径组件很简单,那么只会有一个交叉点。如果路径不简单,即它自身交叉,那么如果它是顺时针方向则没有任何意义。)

    然后,由于你需要顺时针组件,你应该期望+1的计数。计数为-1表示该组件在里面。