通过边的长度和它们之间的角度确定多边形顶点坐标的算法
Algorithm for determining the coordinates of the vertices of a polygon by the lengths of the sides and the angles between them
求解判断题的一般算法是什么
通过边长和它们之间的角度的任意多边形的顶点坐标。
例如,我们有一个边长数组 [10 10 10 10]
和一个角度数组 [90 90 90 90]
,
我们需要得到一个顶点坐标数组[[0 0] [10 0] [10 10] [0 10]]
。
查资料:
l=[10 10 10] a=[60 60 60] => [[0 0] [10 0] [5 8.66]]
l=[20 14.14 10 10] a=[45 135 90 90] => [[0 0] [10 0] [20 10] [0 10]
解决方案位于坐标网格的哪个位置并不重要。旋转方向(顺时针或逆时针)也无关紧要。最主要的是得到的坐标集对应于原始条件。感兴趣的可能集中的任何解决方案。
澄清。假设多边形的第一条边位于 X 轴上,顶点的坐标为 [0 0] [L 0]
,其中 L 是边的长度。顺时针绕过。
我们称“Ang”为边相对于 X 轴的角度。该值未给出,但可以通过对该边之前的所有边间角度求和来计算。
因此,对于边 1,我们有“Ang= 0”(假设)。对于边 2,我们知道边 1 的内角(比如“a2”)。因此对于这条边,我们有“Ang= 0 + a2”。
如果边 3 的内角为“a3”,则我们有“Ang= 0 + a2 + a3”。其余边以此类推。
你说边之间的角度是顺时针给定的。因为三角函数使用顺时针系统,所以我们必须更改中间角度的符号。
为了计算边的 X、Y 分量,我们将使用三角函数“cos(a)”和“sin(a)”,其中“a”是逆时针测量的角度。
这些组件是
x = L * cos(a)
y = L * sin(a)
其中 L 是边的长度。
坐标是添加了这些组件的前边的坐标。
将它们放在一起,在伪代码中我们有:
//First vertex
x(0) = 0
y(0) = 0
Ang = 0;
for i=1 to numOfVertices {
Ang = Ang - a(i)
x(i) = x(i-1) + L(i) * cos(Ang)
y(i) = y(i-1) + L(i) * sin(Ang)
}
通知a(i)
。这是与前一条边的角度。这意味着角度数组必须以“0”开头,它对应于第一条边相对于 X 轴的角度。
另外,请注意在三角函数中使用度数或弧度。
可能是这样的
import numpy as np
import matplotlib.pyplot as plt
def get_vertices(a, l):
n = l.size
p = np.empty((n+1,2), dtype=float)
p[0,:] = np.array([0,0])
p[n-1,:] = np.array([0,0])
p[1,:] = np.array([l[0] ,0])
angle = 0
for i in range(1, n-1):
angle = angle + np.pi - a[i]
v_edge = l[i]*np.array([np.cos(angle), np.sin(angle)])
p[i+1,:] = p[i,:] + v_edge
# correcting for the input data, the lase edge and the first and last angles
l[n-1] = np.linalg.norm(p[n-1,:])
a[0] = np.arccos(p[n-1, 0]/l[n-1])
a[n-1] = angle - a[0]
return p
a = np.array([0, np.pi/2, 75*np.pi/180, np.pi/2])
l = np.array([1, 1, np.sqrt(6)/2, np.sqrt(2)/2])
#a = np.array([0, np.pi/2, 75*np.pi/180, 0])
#l = np.array([1, 1, np.sqrt(6)/2, 0])
x, v = get_vertices(a, l)
fig, axs = plt.subplots(1)
axs.plot(x[:,0], x[:,1], 'b')
for p in x:
axs.plot(p[0], p[1], 'ro')
axs.set_aspect('equal')
plt.grid()
plt.show()
一个评论:你要给算法的数据包含三个冗余。基本上,对于 n 个顶点的多边形,如果您有 n 个角和 n 条边的数据,则有 3 个方程,一个用于边,两个用于该边与其相邻边的角度。所以独立的输入参数应该更像是n-1条边和n-2条角。
如有必要,我让算法更正了您的角度和边缘数据。
求解判断题的一般算法是什么
通过边长和它们之间的角度的任意多边形的顶点坐标。
例如,我们有一个边长数组 [10 10 10 10]
和一个角度数组 [90 90 90 90]
,
我们需要得到一个顶点坐标数组[[0 0] [10 0] [10 10] [0 10]]
。
查资料:
l=[10 10 10] a=[60 60 60] => [[0 0] [10 0] [5 8.66]]
l=[20 14.14 10 10] a=[45 135 90 90] => [[0 0] [10 0] [20 10] [0 10]
解决方案位于坐标网格的哪个位置并不重要。旋转方向(顺时针或逆时针)也无关紧要。最主要的是得到的坐标集对应于原始条件。感兴趣的可能集中的任何解决方案。
澄清。假设多边形的第一条边位于 X 轴上,顶点的坐标为 [0 0] [L 0]
,其中 L 是边的长度。顺时针绕过。
我们称“Ang”为边相对于 X 轴的角度。该值未给出,但可以通过对该边之前的所有边间角度求和来计算。
因此,对于边 1,我们有“Ang= 0”(假设)。对于边 2,我们知道边 1 的内角(比如“a2”)。因此对于这条边,我们有“Ang= 0 + a2”。
如果边 3 的内角为“a3”,则我们有“Ang= 0 + a2 + a3”。其余边以此类推。
你说边之间的角度是顺时针给定的。因为三角函数使用顺时针系统,所以我们必须更改中间角度的符号。
为了计算边的 X、Y 分量,我们将使用三角函数“cos(a)”和“sin(a)”,其中“a”是逆时针测量的角度。
这些组件是
x = L * cos(a)
y = L * sin(a)
其中 L 是边的长度。
坐标是添加了这些组件的前边的坐标。
将它们放在一起,在伪代码中我们有:
//First vertex
x(0) = 0
y(0) = 0
Ang = 0;
for i=1 to numOfVertices {
Ang = Ang - a(i)
x(i) = x(i-1) + L(i) * cos(Ang)
y(i) = y(i-1) + L(i) * sin(Ang)
}
通知a(i)
。这是与前一条边的角度。这意味着角度数组必须以“0”开头,它对应于第一条边相对于 X 轴的角度。
另外,请注意在三角函数中使用度数或弧度。
可能是这样的
import numpy as np
import matplotlib.pyplot as plt
def get_vertices(a, l):
n = l.size
p = np.empty((n+1,2), dtype=float)
p[0,:] = np.array([0,0])
p[n-1,:] = np.array([0,0])
p[1,:] = np.array([l[0] ,0])
angle = 0
for i in range(1, n-1):
angle = angle + np.pi - a[i]
v_edge = l[i]*np.array([np.cos(angle), np.sin(angle)])
p[i+1,:] = p[i,:] + v_edge
# correcting for the input data, the lase edge and the first and last angles
l[n-1] = np.linalg.norm(p[n-1,:])
a[0] = np.arccos(p[n-1, 0]/l[n-1])
a[n-1] = angle - a[0]
return p
a = np.array([0, np.pi/2, 75*np.pi/180, np.pi/2])
l = np.array([1, 1, np.sqrt(6)/2, np.sqrt(2)/2])
#a = np.array([0, np.pi/2, 75*np.pi/180, 0])
#l = np.array([1, 1, np.sqrt(6)/2, 0])
x, v = get_vertices(a, l)
fig, axs = plt.subplots(1)
axs.plot(x[:,0], x[:,1], 'b')
for p in x:
axs.plot(p[0], p[1], 'ro')
axs.set_aspect('equal')
plt.grid()
plt.show()
一个评论:你要给算法的数据包含三个冗余。基本上,对于 n 个顶点的多边形,如果您有 n 个角和 n 条边的数据,则有 3 个方程,一个用于边,两个用于该边与其相邻边的角度。所以独立的输入参数应该更像是n-1条边和n-2条角。
如有必要,我让算法更正了您的角度和边缘数据。