如何将重心坐标转换为笛卡尔坐标?

5 python math geometry

根据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 是什么?

Gil*_*llé 5

你的公式是正确的。

假设三角形的三个角被编码为矩阵 的列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)