我是SymPy的新手,我想从3维点创建一个SymPy-Triangle,例如获得其表面积:
import numpy as np
import sympy as sp
p1 = np.array([1,1,1])
p2 = np.array([3,2,2])
p3 = np.array([2,3,4])
不可能创建这样的Triangle对象:
triangle = sp.Triangle(p1,p2,p3,) #Won't work: Nonzero coordinates cannot be removed.
下一步,我在xy平面上创建了一个平面,z = 0,并将三角形的原始点投影到该平面上:
plane = sp.Plane((0,0,0), (1,0,0), (0,1,0))
p1_proj = plane.projection(p1) # Point3D(1,1,0)
p2_proj = plane.projection(p2) # Point3D(2,2,0)
p3_proj = plane.projection(p3) # Point3D(3,3,0)
triangle_proj = sp.Triangle(p1_proj, p2_proj, p3_proj,)
area_proj = triangle_proj.area # 3/2
现在我不再有错误了,因为所有投影点的z分量均为零,但是三角形现在显然也已变形,因此其面积也发生了变化:
area_original = 0.5 * np.linalg.norm( np.cross((p2-p1),(p3-p1),) ) # 2.96
有人知道如何变换三角形的点,以便所有z坐标变为零吗?甚至可以使用SymPy(但这不是必须的)。
非常感谢,空间想象力不是我的优点之一!最好的祝福马丁
[Triangle
可以通过指示三角形的每一边的长度来构造,因此无需寻找变换,您可以按照平面中的定义来计算每一边的长度:
>>> a,b,c=map(Point,([1,1,1],[3,2,2],[2,3,4]))
>>> Triangle(sss=(a.distance(b),b.distance(c),c.distance(a)))
Triangle(Point2D(0, 0), Point2D(sqrt(6), 0), Point2D(7*sqrt(6)/6, sqrt(210)/6))
>>> _.area
sqrt(35)/2
>>> _.n()
2.95803989154981
讨论了平面到xy平面的变换here。