我正在尝试使用LibGDX库制作一个等边三角形,但是我并不是最擅长几何/三角学。我真的很接近,但是一侧太长了,我无法弄清楚哪里出了问题。
这些点相对于形状的中心。
shapeX[0] = x + MathUtils.cos(radians) * Variables.lineLength;
shapeY[0] = y + MathUtils.sin(radians) * Variables.lineLength;
shapeX[1] = x + MathUtils.cos(radians - 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeY[1] = y + MathUtils.sin(radians - 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeX[2] = x + MathUtils.cos(radians + 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
shapeY[2] = y + MathUtils.sin(radians + 4 * Variables.pi / (Variables.pi * 2)) * Variables.lineLength;
最佳答案
圆周上有2pi弧度。要获得等边的n边多边形,请将2pi分为n个片段:(2 / n)pi。对于i = 0,1,...(n-1),多边形顶点将落在i(2 / n)pi处。由于您有n = 3,因此您希望0 * 2 / 3pi = 0pi,1 * 2 / 3pi = 2 / 3pi和2 * 2 / 3pi = 4 / 3pi。但是使用循环可能比硬编码这些值更容易。
另外,如果希望边缘具有给定的linelength
,则必须按sqrt(3)/ 3缩放以找到半径。为什么?由单位圆外接的等边三角形的边的长度为3 / sqrt(3),因此按反比例缩放半径以获得单位长度的边。打包所有这些,
double radius = Math.sqrt(3) / 3 * Variables.lineLength;
for (int i = 0; i < 3; ++i) {
double theta = 2 * Math.PI / 3 * i;
shapeX[i] = x + radius * MathUtils.cos(theta);
shapeY[i] = y + radius * MathUtils.sin(theta);
}
请注意,这会将第一个顶点放在正x轴上。要旋转多边形,请将所需的偏移量添加到
theta
。例如,要使第一个顶点在正y轴上,请使用pi / 2。