Python实现三维轨迹段面积求解?

需要用Python实现一个算法,求解三维空间中两条轨迹所围成的面积,具体如下:

clipboard.png

如上所示,两条轨迹由点序列组成(红色和黑色轨迹),三维坐标可表示为(x,y,t),目的就是要求这两条轨迹之间所围成的面积。现在的思路是将求两条轨迹之间围城的面积转换为分别求两条轨迹点构成三角形的面积,然后利用海伦公式进行面积求解,具体如下:

clipboard.png

但是这样做有一个问题,就是两条轨迹的点序列如何构成三角形,在此想问问大家有没有什么好的方法,或者好的建议,谢谢!(注意:两条轨迹的点序列个数可能是不一样的,即一条轨迹可能只有3个点,而另一条轨迹有5个点)

阅读 3.9k
3 个回答

两点:三角形是a, b轮流的;轨迹序列可能不等长。

def find_triangle(a, b):
    # 比较轨迹序列长短并交换,方便取起始点
    la, lb = len(a), len(b)
    if la > lb:
        a, b = b, a
        la, lb = lb, la
    # 三角形构造,a,b轮流    
    triangles = []
    for i in range(la - 1):
        triangles.append((b[i], a[i], b[i + 1]))
        triangles.append((a[i], b[i + 1], a[i + 1]))
    # 长序列轨迹其他点的三角形构造
    more = b[la - 1:]
    for j in range(len(more) - 1):
        triangles.append((more[j], a[la - 1], more[j + 1]))
    return triangles
>>> S1 = ['a1', 'a2', 'a3']
>>> S2 = ['b1', 'b2', 'b3', 'b4', 'b5']
>>> print(find_triangle(S1, S2))
[('b1', 'a1', 'b2'), ('a1', 'b2', 'a2'), ('b2', 'a2', 'b3'), ('a2', 'b3', 'a3'), ('b3', 'a3', 'b4'), ('b4', 'a3', 'b5')]
>>> print(find_triangle(S2, S1))
[('b1', 'a1', 'b2'), ('a1', 'b2', 'a2'), ('b2', 'a2', 'b3'), ('a2', 'b3', 'a3'), ('b3', 'a3', 'b4'), ('b4', 'a3', 'b5')]

我看了一下,你这个三角形构造是有个规律性的,我用一个伪代码表示一下两条轨迹,设每个点的坐标为:

dot_nt = (x,y,z) # n代表第几条运动轨迹,n in (1,2);t代表第几个点n in [0,n]

那么对于轨迹1可以形成:

[dot_10,dot_11,dot_12,...]

对于轨迹2可以形成:

[dot_20,dot_21,dot_22,...]

然后的话,可以看到一个

[dot_10,dot_20,dot_11],[dot_11,dot_21,dot_12],[dot_12,dot_22,dot_13],...

这样的一个有规律的数据,然后根据这个规律就可以用程序围成一个三角形了,如果你觉得思路对的话可以尝试去实现,我感觉应该就是这个样子了

总面积=所有黑底三角形面积+所有红底三角形面积
重点是凑三角形的三个点
黑色点编号为b0~b4
红色点编号为r0~r4
黑底三角形三点为 b0 b1 r0,... b3 b4 r3
红底三角形三点为 r0 r1 r1,... r3 r4 r4
点凑出来了 其他的再继续想办法吧

部分代码可以写成这样

class Point:

__slots__=('x','y','z')
def __init__(self,x,y,z):
    self.x,self.y,self.z=x,y,z

red_point,black_point=list(range(4)),list(range(4))
blacktria=[(i,i+1,j) for i,j in zip(black_point[:4],red_point[:4])]
redtria=[(j,j+1,i+1) for i,j in zip(black_point[:4],red_point[:4])]
print(blacktria,'n',redtria)

blacktria与redtria的内容如下:
[(0, 1, 0), (1, 2, 1), (2, 3, 2), (3, 4, 3)]
[(0, 1, 1), (1, 2, 2), (2, 3, 3), (3, 4, 4)]

推荐问题