【问题标题】:how to make the conversion from barycentric coordinates to Cartesian coordinates?如何进行从重心坐标到笛卡尔坐标的转换?
【发布时间】:2019-05-27 14:45:40
【问题描述】:

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

【问题讨论】:

  • 您的问题不清楚。您是在询问 sn-p 中代码的用途,还是用于从重心坐标转换为笛卡尔坐标的正确代码,或其他什么?

标签: python math geometry


【解决方案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。这段代码不假设规范化,所以它需要除以 lambdas 的总和来确保这个属性。当然,我们可以看到所有 6 个点的总和始终为 1,但代码可用于总和不为 1 的 lambdas。


在你给出的最后一个例子中,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

【讨论】:

  • 感谢您的回答! every column is a point expressed 中的 column 是否意味着 (0,1,1/2) 是 column,而 (0,0,sqrt(3)/2) 是另一个 column
  • @singularli 不是,我的意思是abc组成的矩阵的列,即六个点:(0,0,1), ( 0,1,0), (1,0,0), (1/4,1/4,1/2), (1/4,1/2,1/4), (1/2,1/ 4,1/4) 是六个点的重心坐标。 (0,0)、(1,0) 和 (1/2,sqrt(3)/2) 是三角形的 3 个点。
  • 感谢您的耐心等待!专栏部分​​很清楚,仍然对整个画面感到困惑。我刚刚更新了问题,请您以B点为例,详细说明转换过程?
  • @singularli 我编辑了答案以涵盖您提到的情况。
  • 感谢您的解释! ... is not expressed with barycentric coordinates 的意思是 (0,0,1) 不是 B 的重心坐标吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多