每wiki,从重心坐标到笛卡尔坐标的转换如下
这是一段来自其他地方的代码
import numpy as np
import matplotlib.pyplot as plt
# from barycentric coordinates to Cartesian coordinates
a = np.array([0. , 0. , 1. , 0.25, 0.25, 0.5 ])
b = np.array([0. , 1. , 0. , 0.25, 0.5 , 0.25])
c = np.array([1. , 0. , 0. , 0.5 , 0.25, 0.25])
x = 0.5 * ( 2.*b+c ) / ( a+b+c )
y = 0.5*np.sqrt(3) * c / (a+b+c)
plt.scatter(x,y)
plt.show()
似乎这段代码正在使用另一个公式,如果是,则公式是什么?
假设B的重心坐标为(0,0,1),如何计算其笛卡尔坐标?什么是B点的lambda_1,lambda_2,lambda_3,x_1,x_2,x_3,y_1,y_2,y_3是什么?
答案 0 :(得分:1)
您的公式正确。
假设将三角形的三个角编码为矩阵t
的列,这是一个简单的Python实现:
import numpy as np
def get_cartesian_from_barycentric(b, t):
return t.dot(b)
b = np.array([0.25,0.3,0.45]) # Barycentric coordinates
t = np.transpose(np.array([[0,0],[1,0],[0,1]])) # Triangle
c = get_cartesian_from_barycentric(b, t)
您发现的公式也从重心坐标计算笛卡尔,但是使用具有以下坐标的预定义正则三角形:
(x1,y1) = (0,0)
(x2,y2) = (1,0)
(x3,y3) = (1/2,sqrt(3)/2)
在此计算中,代码认为每列都是以重心坐标表示的点。因此,它一次计算6个点。此外,需要规范重心坐标,即lambda1 + lamda2 + lambda3 = 1
。此代码未假定标准化,因此需要除以lambda的总和以确保该属性。当然,我们可以看到,所有6个点的总和始终为1,但是该代码可用于不等于1的lambda。
在您给出的最后一个示例中,B是三角形的一个点,并且不使用重心坐标表示。 P是相对于点A,B和C的重心坐标表示的点。设A = (x1,y1)
,B = (x2,y2)
和C = (x3,y3)
,并且P具有重心坐标{{1 }}。然后,P的直角坐标(l1,l2,l3)
为
(xp,yp)