- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否有任何开源工具或库(最好是 python)可用于执行与从 ESRI shapefile 读取的 3D 几何图形的大量交集?大多数测试将是简单的线段与多边形。
我研究了 OGR 1.7.1/GEOS 3.2.0,虽然它正确加载了数据,但生成的交叉点不正确,而且大多数其他可用工具似乎都建立在这项工作的基础上。
虽然 CGAL 是替代方案,但它的许可证不合适。 Boost 通用几何库看起来很棒,但 API 非常庞大,而且似乎不支持开箱即用的 wkt 或 wkb 阅读器。
最佳答案
近10年后的更新!
这里是 some code I wrote 10 years ago对于我的光线追踪项目的第一个版本。新版代码不再使用多边形;我们现在用网格做所有事情。
代码可以清理,有很多防御性复制。我不对其准确性或实用性提供任何保证。我试图将它从上面的 GitHub 链接几乎逐字提取到一个独立的脚本中。
import numpy as np
def cmp_floats(a,b, atol=1e-12):
return abs(a-b) < atol
def magnitude(vector):
return np.sqrt(np.dot(np.array(vector), np.array(vector)))
def norm(vector):
return np.array(vector)/magnitude(np.array(vector))
class Ray(object):
"""A ray in the global cartesian frame."""
def __init__(self, position, direction):
self.position = np.array(position)
self.direction = norm(direction)
class Polygon(object):
""" Polygon constructed from greater than two points.
Only convex polygons are allowed!
Order of points is of course important!
"""
def __init__(self, points):
super(Polygon, self).__init__()
self.pts = points
#check if points are in one plane
assert len(self.pts) >= 3, "You need at least 3 points to build a Polygon"
if len(self.pts) > 3:
x_0 = np.array(self.pts[0])
for i in range(1,len(self.pts)-2):
#the determinant of the vectors (volume) must always be 0
x_i = np.array(self.pts[i])
x_i1 = np.array(self.pts[i+1])
x_i2 = np.array(self.pts[i+2])
det = np.linalg.det([x_0-x_i, x_0-x_i1, x_0-x_i2])
assert cmp_floats( det, 0.0 ), "Points must be in a plane to create a Polygon"
def on_surface(self, point):
"""Returns True if the point is on the polygon's surface and false otherwise."""
n = len(self.pts)
anglesum = 0
p = np.array(point)
for i in range(n):
v1 = np.array(self.pts[i]) - p
v2 = np.array(self.pts[(i+1)%n]) - p
m1 = magnitude(v1)
m2 = magnitude(v2)
if cmp_floats( m1*m2 , 0. ):
return True #point is one of the nodes
else:
# angle(normal, vector)
costheta = np.dot(v1,v2)/(m1*m2)
anglesum = anglesum + np.arccos(costheta)
return cmp_floats( anglesum , 2*np.pi )
def contains(self, point):
return False
def surface_identifier(self, surface_point, assert_on_surface = True):
return "polygon"
def surface_normal(self, ray, acute=False):
vec1 = np.array(self.pts[0])-np.array(self.pts[1])
vec2 = np.array(self.pts[0])-np.array(self.pts[2])
normal = norm( np.cross(vec1,vec2) )
return normal
def intersection(self, ray):
"""Returns a intersection point with a ray and the polygon."""
n = self.surface_normal(ray)
#Ray is parallel to the polygon
if cmp_floats( np.dot( np.array(ray.direction), n ), 0. ):
return None
t = 1/(np.dot(np.array(ray.direction),n)) * ( np.dot(n,np.array(self.pts[0])) - np.dot(n,np.array(ray.position)) )
#Intersection point is behind the ray
if t < 0.0:
return None
#Calculate intersection point
point = np.array(ray.position) + t*np.array(ray.direction)
#Check if intersection point is really in the polygon or only on the (infinite) plane
if self.on_surface(point):
return [list(point)]
return None
if __name__ == '__main__':
points = [[0,0,0],[0,0.1,0],[0.1,0.1,-0.03],[0.1,0,-0.03]]
polygon = Polygon(points)
ray = Ray(position=(0,0,0), direction=(0,0,1))
print(polygon.intersection(ray))
关于python - python 中 3D 多边形的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2549708/
我创建了一个函数来计算两条线段的交点。 不幸的是,如果其中一个段是垂直的,下面的代码将不起作用 public static Point intersection(Segment s1, Seg
我有一个由中心 (x,y,z)、半径和方向矢量定义的圆,该矢量指定圆的朝向。我需要测试这样的圆是否与轴对齐的边界框相交。为了澄清,通过相交,我的意思是如果圆圈描述的区域内的任何点在边界框内,那么就构成
虽然我认为这是一个基本问题,但我似乎无法找到如何在 R 中计算: 2 个或多个正态分布(拟合在直方图上)的交点(我需要 x 值),例如具有以下参数: d=data.frame(mod=c(1,2),m
我看过几个关于找到两个 OBB 之间的交点的线程。我仍然不明白如何找到最小穿透轴。我需要找到最小穿透轴,我相信它在 David Eberly 的论文中也被称为最后一个分离轴,以确定我应该使用表格的哪一
我想使用 intersection()通过 key 或filter()在 Spark 。 但是我真的不知道怎么用intersection()按键。 所以我尝试使用filter() ,但它不起作用。 示
我正在画一个circle在canvas上。我想知道,给定 circle 的半径和原点 x/y ,在什么时候 circle与 canvas 相交(如果有的话)边缘。 这肯定是一个几何问题,但这部分似乎太
我正在尝试计算任意数量平面的最顶部交点,但没有任何乐趣!我正在使用 actionscript,但只需要找到一个我可以实现的算法。 问题: 考虑 3 个垂直轴。 用户为每个三角形/平面输入 3 个点,使
我是一名优秀的程序员,十分优秀!