【发布时间】:2014-12-25 15:42:35
【问题描述】:
考虑以下设置:
CSS:
div {
position :absolute;
top: 50px;
left: 50px;
height: 200px;
width: 200px;
border: 2px solid black;
}
HTML:
<div id="container">
<canvas id="my-canvas"/>
</div>
现在在#my-canvas 内部,我希望能够绘制一个具有任意数量的角的多边形,这些角总是位于它的一侧(而不是它的一个角)。多边形将“占据”的高度和宽度应始终等于其父级的高度和宽度(在本例中为 200 像素 X 200 像素),我们假设它始终是正方形。
是否有标准算法来实现这一点(不使用任何 JS 库)?
我想在#my-container 内绘制一个有 4 个角的多边形是最简单的,因为您基本上会创建一个大小相等的正方形:
var c = document.getElementById('my-canvas').getContext('2d');
var side = document.getElementById('container').clientHeight;
c.fillStyle = '#f00';
c.beginPath();
c.moveTo(0, 0);
c.lineTo(0, side);
c.lineTo(side, side);
c.lineTo(side, 0);
c.closePath();
c.fill();
但是有 5 个角或 n 个角的多边形呢?
var corners = 5;
var c = document.getElementById('my-canvas').getContext('2d');
var side = (document.getElementById('container').clientHeight * 4) / corners;
c.fillStyle = '#f00';
c.beginPath();
c.moveTo(0, 0);
// ok the following is totally wrong, but I'm sure there is a loop involved and that the x & y
// should increment/decrement each time around in some way, relevant to the value of *side*
for (var i=0; i<corners; i++) {
c.lineTo((side*i), side);
}
c.closePath();
c.fill();
提前感谢您的帮助!
注意:
我只对边长相等的多边形感兴趣(我猜这就是你所说的“常规”多边形?)。
由于我们在 HTML/CSS 世界中,允许的最小边显然是 1px 的长度。所以这是唯一的限制。
我所指的多边形类型位于this image 的左下方。显然它们属于“常规凸”类型?抱歉,我不是数学家。
【问题讨论】:
-
内切线:
P1=[sin(a*n)*r+Cx, cos(a*n)*r+Cy]; P2=[sin(a*(n+1))*r+Cx, cos(a*(n+1))*r+Cy]; n=0..Nc. -
我在 Java 中做了这个(作为一个多边形)。基本上,您从矩形的中心开始,并使用 x / y 半径以 n 个顶点的步长绕一圈,每个角度增加 2 * PI / # 个顶点。如果您想查看代码,请告诉我
-
有趣的等式,但我不知道
P1,P2,a,r,Cx,Cy代表什么。我猜n是角的数量? -
感谢 ControlAltDel。是的,我不想看到代码,但最好将它作为通用算法发布,这样我就可以想到它的 JS 版本。 :-)
-
请注意,无法满足您“始终有边”的要求。即使是像六边形这样简单的东西,它的两个相邻顶点也不能在矩形的边缘上并适合矩形:如果我们将它们标记为 p1,...,p6,然后是 p1 和 p2,以及 p4 和 p5,将位于边界矩形的边缘,但 p3 和 p6 将位于该矩形之外。有平方内标算法,但额外的要求会产生几何上不可能的约束 =)
标签: javascript html algorithm canvas polygon