我正在寻找一个公式来计算给定角度和半径的规则多边形(例如八边形)轮廓上的点。我可以使用三角函数来计算多边形的顶点,并使用线/线相交来获取轮廓上的点,但这有点笨拙。是否有一个简单的公式给出相同的结果?
答案 0 :(得分:1)
首先,我假设多边形的方向使得第一个平面在其右侧垂直。相对于x轴测量角度,我们想找到射线与多边形的交点,如下所示:
我们为多边形指定了边数及其apothem。如果有外接圆,则Wikipedia页面包含推导阿托姆的公式。如果您的多边形是旋转的,则只需从查询角度中添加或减去旋转角度即可。
第一步是找到射线相交的那一侧。由于多边形是规则的,因此可以简单地通过除法和舍入来完成。我将侧面的相应角度称为侧面角度。上述五边形的右侧的侧角为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();
}
<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) )
angle
从atan(y_1/x_1)
到atan(y_2/x_2)
的范围。
因此,您要做的就是将一个圆分成n
个段,并找到每个顶点的(x,y)
坐标。然后使用上面的公式拟合两个连续顶点之间的线。
下面是使用此技术的示例