算法如下:
上面的图是正三角形:
说下算法,关于上面那些x,y是怎么算出来的。
这里大圆的5个顶点,每个顶点占用的角度为360/5 = 72度,左边那个18度是通过90 - 72 = 18度。
大圆半径为R,所以
x为cos(18度) * R
y为-sin(18度) * R
这个负是因为坐标y,是因为向下为正。
其他角度通过加72度就可以了!
下面来看下那个54度是怎么算的!
72 * 2 - 90 = 54度,同样半径为r
x为cos(54度) * r
y为-sin(54度) * r
其他角度通过加72度就可以了!
如果要旋转角度,只要画点时,每个点加一个对应的角度即可!
下面是代码:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
-
- <canvas id="canvas" style="border:1px solid #aaa;display:block;margin:50px auto;">
- 当前浏览器不支持Canvas,请更换浏览器后再试
- </canvas>
-
- <script>
- window.onload = function() {
-
- let canvas = document.getElementById("canvas");
- canvas.width = 800;
- canvas.height = 800;
- let context = canvas.getContext("https://cdn.jxasp.com:9143/image/2d");
- context.lineWidth = 10;
- drawStar(context, 150, 300, 400, 400, 0);
- }
-
- function drawStar(cxt, r, R, x, y, rot){
-
- cxt.beginPath();
- for(let i = 0; i < 5; i++){
-
- cxt.lineTo(Math.cos((18 + i * 72 - rot) / 180 * Math.PI) * R + x,
- -Math.sin((18 + i * 72- rot) / 180 * Math.PI) * R + y);
-
- cxt.lineTo(Math.cos((54 + i * 72 - rot) / 180 * Math.PI) * r + x,
- -Math.sin((54 + i * 72 - rot) / 180 * Math.PI) * r + y);
- }
-
- cxt.closePath();
- cxt.stroke();
- }
- </script>
-
- </body>
- </html>
程序运行截图如下:
这里有一个要注意的,就是cos里面要传弧度,下面是度和弧度转换的格式:
1弧度=180/pai 度
1度=pai/180 弧度