给定角度和半径的规则多边形轮廓上的点的公式

时间:2019-08-29 21:54:26

标签: math

我正在寻找一个公式来计算给定角度和半径的规则多边形(例如八边形)轮廓上的点。我可以使用三角函数来计算多边形的顶点,并使用线/线相交来获取轮廓上的点,但这有点笨拙。是否有一个简单的公式给出相同的结果?

2 个答案:

答案 0 :(得分:1)

首先,我假设多边形的方向使得第一个平面在其右侧垂直。相对于x轴测量角度,我们想找到射线与多边形的交点,如下所示:

Polygon

我们为多边形指定了边数及其apothem。如果有外接圆,则Wikipedia页面包含推导阿托姆的公式。如果您的多边形是旋转的,则只需从查询角度中添加或减去旋转角度即可。

第一步是找到射线相交的那一侧。由于多边形是规则的,因此可以简单地通过除法和舍入来完成。我将侧面的相应角度称为侧面角度。上述五边形的右侧的侧角为0,下一个的侧边为72°,依此类推。

sectorAngle = 2 * PI / sides
sideAngle = sectorAngle * round(angle / sectorAngle)

鉴于该侧角,我们可以计算查询射线的残角和该侧的垂直平分线:

Difference Angle

diffAngle = angle - sideAngle

请注意,该角度是带符号的。

现在,我们只需要在此旋转坐标系中重建点,平分线是一个轴,垂直方向是另一个轴。我们需要沿着等分线走等距离的距离。我们需要垂直走的距离是:

sideward = apothem * tan(diffAngle)

我们可以用它来阐明我们的观点:

sideNormalX = cos(sideAngle)
sideNormalY = sin(sideAngle)

pointX = centerX + sideNormalX * apothem - sideNormalY * sideward
pointY = centerY + sideNormalY * apothem + sideNormalX * sideward

这是一个JavaScript实现:

window.onload = function()  {
	canvas = document.getElementById('cnv');
	ctx = canvas.getContext('2d');			
	
	var pts = 100;
	for(var i = 0; i < pts; ++i) {
		plotPolygonPoint(i * 2 * Math.PI / pts, 5, 150, ctx);
	}
}

function plotPolygonPoint(angle, sides, apothem, ctx) {
	var sectorAngle = 2 * Math.PI / sides;
	var sideAngle = sectorAngle * Math.round(angle / sectorAngle);	
	
	var diffAngle = angle - sideAngle;
	
	var forward = apothem;
	var sideward = apothem * Math.tan(diffAngle);
	
	var sideNormalX = Math.cos(sideAngle);
	var sideNormalY = Math.sin(sideAngle);
	
	ctx.beginPath();
	ctx.ellipse(250 + sideNormalX * forward - sideNormalY * sideward, 250 + sideNormalY * forward + sideNormalX * sideward, 3, 3, 0, 0, 2 * Math.PI);
	ctx.fill();
}
<canvas id="cnv" width="500" height="500" style="background-color:#ddd;"></canvas>

答案 1 :(得分:0)

穿过两个点(x_1,y_1)(x_2,y_2)的直线的极坐标是

radius = (x_2*y_1 - x_1*y_2)/( (x_2-x_1)*cos(angle) - (y_2-y_1)*sin(angle) )

angleatan(y_1/x_1)atan(y_2/x_2)的范围。

因此,您要做的就是将一个圆分成n个段,并找到每个顶点的(x,y)坐标。然后使用上面的公式拟合两个连续顶点之间的线。

下面是使用此技术的示例

scr