【问题标题】:Formula for point on regular polygon outline given angle and radius给定角度和半径的正多边形轮廓上的点公式
【发布时间】:2019-08-29 21:54:26
【问题描述】:

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

【问题讨论】:

  • 听起来像是这个网站的问题:math.stackexchange.com
  • 您的要求不明确。你给了什么“角度”?您是否还给出了多边形的边数及其方向?
  • 您需要正多边形的极坐标。这是正确的吗?

标签: math


【解决方案1】:

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

我们得到多边形的边数及其apothem。如果您有外接圆,则 Wikipedia 页面包含用于推导 apothem 的公式。如果您的多边形被旋转,只需从查询角度添加或减去旋转角度。

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

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

给定这个边角,我们可以计算出查询射线的剩余角和边的垂直平分线:

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();
}
&lt;canvas id="cnv" width="500" height="500" style="background-color:#ddd;"&gt;&lt;/canvas&gt;

【讨论】:

    【解决方案2】:

    通过(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) 坐标。然后用上面的公式拟合两个连续顶点之间的线。

    以下是使用此技术的示例

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2019-05-23
      • 1970-01-01
      • 2012-09-19
      • 2011-03-03
      相关资源
      最近更新 更多