基于VTK折线的区域查找

时间:2012-03-23 12:56:22

标签: python vtk raytracing

我有以下由VTK多边形线组成的域 - 每条线以'x'开头和结尾,可能有很多点,并且被分配左右标志以表示左边的区域和如果我们从头到尾走下线,确定该线的右侧。

the domain of interest http://oi43.tinypic.com/vwsug5.jpg

对于域中的任何随机点rp,我需要确定它所在的区域。

到目前为止,我已经尝试过:

  • 计算距rp最近的vtk点,找到它所属的曲线,然后计算rp是否在曲线的左侧或右侧。这对于闭合曲线不起作用,例如上图中区域1周围的曲线,特别是如果它们不是连续的(即一个回转)
  • 将域分解为桶:最初,包含vtk点的那些桶用与该点关联的区域标志填充;然后根据邻居填充剩余的桶。然后rp落入的桶返回其标志集。但是,当存储桶包含多个区域标志时(即当rp靠近一条线时),我无法使其工作。

我认为这可能是一个已解决的问题,但我不太确定在哪里看。我考虑过point-in-polygon问题,但我处理的是曲线而不是多边形。其他想法涉及光线追踪,但似乎更适合3D。

有人可以提出替代方案,或者对我尝试过的方法进行修改吗?

1 个答案:

答案 0 :(得分:0)

感兴趣的子域(SDOI)周边的每一行必须将SDOI作为其边界域之一。

  • 因此,您可以在rp所在的域中填充(或展开一个圆圈)。
  • 找出所有这些线路附近的共同域名。
  • 那是你的SDOI。

除非:

特殊情况:rp处于响铃状态(即域1)。所以我们不知道我们是在环内还是外环。我们知道我们处于这种'特殊情况',因为只有两个域从上面的方法(1或2)返回,但我们不知道哪个域。

解决方案:

  • rp遍历一条直到它越过封闭线,然后进入另一个域。
  • 现在在此域中执行洪水填充,但不包括您穿过的线(以及第一次填充的所有线)。
  • 所有这些线路相邻的域名不是您的SDOI
  • 因此,您现在可以从第一次填充洪水中推断出SDOI。