根据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()
Run Code Online (Sandbox Code Playgroud)
这段代码似乎使用了另一个公式,如果是,公式是什么?
假设B的重心坐标为(0,0,1),如何计算其笛卡尔坐标?B 点的 lambda_1、lambda_2、lambda_3、x_1、x_2、x_3、y_1、y_2、y_3 是什么?
你的公式是正确的。
假设三角形的三个角被编码为矩阵 的列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)
Run Code Online (Sandbox Code Playgroud)
您找到的公式也是从重心坐标计算笛卡尔坐标,但使用具有以下坐标的预定义正三角形:
(x1,y1) = (0,0)
(x2,y2) = (1,0)
(x3,y3) = (1/2,sqrt(3)/2)
Run Code Online (Sandbox Code Playgroud)
在此计算中,代码认为每一列都是用重心坐标表示的点。因此,它一次计算 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 具有重心坐标(l1,l2,l3)。那么,P的笛卡尔坐标(xp,yp)为
xp = l1*x1 + l2*x2 + l3*x3
yp = l1*y1 + l2*y2 + l3*y3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5173 次 |
| 最近记录: |