创建一个SymPy三角形三维点

时间:2020-05-10 13:18:37

标签: sympy coordinate-transformation

我是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(但这不是必须的)。

非常感谢,空间想象力不是我的优点之一!
最好的祝福 马丁

1 个答案:

答案 0 :(得分:1)

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

here讨论了平面向xy平面的转换。