Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将重心坐标转换为笛卡尔坐标?_Python_Math_Geometry - Fatal编程技术网

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

Python 如何将重心坐标转换为笛卡尔坐标?,python,math,geometry,Python,Math,Geometry,根据,重心坐标到笛卡尔坐标的转换如下 这是一段来自其他地方的代码 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.

根据,重心坐标到笛卡尔坐标的转换如下

这是一段来自其他地方的代码

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是什么?您的公式是正确的

假设三角形的三个角被编码为矩阵
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具有重心坐标
(l1,l2,l3)
。然后,P的笛卡尔坐标
(xp,yp)

xp = l1*x1 + l2*x2 + l3*x3
yp = l1*y1 + l2*y2 + l3*y3

你的问题不清楚。您是在询问代码片段中代码的用途,还是用于将重心坐标转换为笛卡尔坐标的正确代码,还是其他问题?谢谢您的回答!
中的
是否每个列都是一个表示点
表示(0,1,1/2)是
,并且(0,0,sqrt(3)/2)是另一个
?@singulari否,我的意思是矩阵的列由
a
b
c
构成,即六个点:(0,0,1,0)、(1,0)、(1,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点为例,详细说明转换过程好吗?@Singulari我编辑了答案以涵盖你提到的情况。谢谢你的解释!does
…是吗未用重心坐标表示
mean(0,0,1)不是B的重心坐标吗?