我想在一个三维空间中画一个船体的“横截面”,是船体与平面的交集。
空间由轴X, Y, Z定义,与XZ平行的交叉平面由Y = 50定义。
首先,我在一个points中加载了一个3D np.array云:
#loading colors
points = np.array([(GEO.XYZRGB(rank, name, X, Y, Z))
for rank, name, X, Y, Z in csv.reader(open('colors.csv'))])rank, name, X, Y, Z, R, G, BX, Y, Z在三维空间中定义了每个点。有几个例子:
['2' 'Y2 ' '77.89506204' '87.46909733' '42.72168896' '254' '244' '21']
['3' 'Y4 ' '76.95634543' '83.94271933' '39.48573173' '255' '234' '0']
['4' 'PINKwA' '64.93353667' '59.00840333' '84.71839733' '218' '154' '225']
...现在,我对点进行了scipy.Delaunay四面体化:
# Delaunay triangulation
tri = scipy.spatial.Delaunay(points[:,[2,3,4]], furthest_site=False) 所以我可以得到所有的vertices (即船体上的每个奇异四面体):
# indices of vertices
indices = tri.simplices
# the vertices for each tetrahedron
vertices = points[indices]
print vertices我的问题:从这里,我有顶点,我如何找到所有的交点之间的飞机和船体?
谢谢
发布于 2018-11-12 13:45:18
下面我给出了python代码,给出了一组三维点和一个平面(由它的法向量和平面上的一个点定义)计算三维Delaunay三角剖分和Delaunay边与平面的交点。
下图显示了一个例子的结果,即单位立方体中的20个随机点与x=0平面相交(交点为蓝色)。用于可视化的代码是从代码in this answer中修改的。

要实际计算平面交点,我使用以下代码。基本函数plane_delaunay_intersection使用两个辅助函数collect_edges来收集Delaunay三角剖分的边缘(每个段只有一个副本)和plane_seg_intersection,后者将线段与平面相交。
以下是代码:
from scipy.spatial import Delaunay
import numpy as np
def plane_delaunay_intersection(pts, pln_pt, pln_normal):
"""
Returns the 3d Delaunay triangulation tri of pts and an array of nx3 points that are the intersection
of tri with the plane defined by the point pln_pt and the normal vector pln_normal.
"""
tri = Delaunay(points)
edges = collect_edges(tri)
res_lst = []
for (i,j) in edges:
p0 = pts[i,:]
p1 = pts[j,:]
p = plane_seg_intersection(pln_pt, pln_normal, p0, p1)
if not np.any(np.isnan(p)):
res_lst.append(p)
res = np.vstack(res_lst)
return res, tri
def collect_edges(tri):
edges = set()
def sorted_tuple(a,b):
return (a,b) if a < b else (b,a)
# Add edges of tetrahedron (sorted so we don't add an edge twice, even if it comes in reverse order).
for (i0, i1, i2, i3) in tri.simplices:
edges.add(sorted_tuple(i0,i1))
edges.add(sorted_tuple(i0,i2))
edges.add(sorted_tuple(i0,i3))
edges.add(sorted_tuple(i1,i2))
edges.add(sorted_tuple(i1,i3))
edges.add(sorted_tuple(i2,i3))
return edges
def plane_seg_intersection(pln_pt, pln_normal, p0, p1):
t0 = np.dot(p0 - pln_pt, pln_normal)
t1 = np.dot(p1 - pln_pt, pln_normal)
if t0*t1 > 0.0:
return np.array([np.nan, np.nan, np.nan]) # both points on same side of plane
# Interpolate the points to get the intersection point p.
denom = (np.abs(t0) + np.abs(t1))
p = p0 * (np.abs(t1) / denom) + p1 * (np.abs(t0) / denom)
return p下面的代码用于为上面的示例图生成输入:
np.random.seed(0)
x = 2.0 * np.random.rand(20) - 1.0
y = 2.0 * np.random.rand(20) - 1.0
z = 2.0 * np.random.rand(20) - 1.0
points = np.vstack([x, y, z]).T
pln_pt = np.array([0,0,0]) # point on plane
pln_normal = np.array([1,0,0]) # normal to plane
inter_pts, tri = plane_delaunay_intersection(points, pln_pt, pln_normal)https://stackoverflow.com/questions/24163252
复制相似问题