如何在Python中检测空间路径中的自交叉?

时间:2018-05-04 05:28:19

标签: python algorithm graph-theory curve

让我们说我在多维空间中有一条路径,由路径上的一系列点给出。例如。

json.sort(function(a, b) { return a.caseID > b.caseID; });

var bad_order = [];
var good_order = [];

for(var i = 0; i < json.length; i++){
  if(json[i].order === null)
    bad_order.push(json[i]);
  else
    good_order.push(json[i]);
}

什么是检测路径是否有任何自交点的有效算法? 完全有可能路径在我存储的点之间的某个点相交。

例如,在2D中:

p[0] = [  0,  0,  0,   0,...]
p[1] = [  0,  0,  0,0.01,...]

此路径没有任何相同的点,但具有自相交。

编辑:

我目前正在测试是否有任何点落在每对点创建的柱面内。

以下是我一直在玩的代码:

p[0] = [  0,   0]
p[1] = [  1,   0]
p[2] = [  1,   1]
p[3] = [0.5,-0.5]

在我的机器上,这是相当慢的。

import numpy as np

def pairs(l):
    for i in range(0,len(l),2):
        yield (i,l[i:i+2])

def in_cyl(h0,h1,tol,p):
    # efficient cylinder test from https://www.flipcode.com/archives/Fast_Point-In-Cylinder_Test.shtml
    l = np.linalg.norm(h0-h1)
    dx = h1-h0
    for point in p:
        pdx = point-h0
        dot = np.dot(pdx,dx)
        if dot < 0 or dot > l**2:
            # outside end caps
            continue
        else:
            # point lies within end caps. Find dist from point to cyl axis
            dsq = np.dot(pdx,pdx) - dot**2/l**2
            if (dsq > tol**2):
                # outside cyl
                continue
            else:
                # inside cyl
                return True
    return False

def self_intersect(p,tol):
    for i,(h0,h1) in pairs(p):
        if in_cyl(h0,h1,tol,np.vstack([p[:i],p[i+2:]])):
            return True
    return False

# 50-dimensional test. Intersections should be very rare
dim = 50
test_points = np.random.randn(2500,(50))
print(self_intersect(test_points,0.1))

0 个答案:

没有答案