h5 Canvas正多边形绘制

Posted suwu150

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了h5 Canvas正多边形绘制相关的知识,希望对你有一定的参考价值。

在之前文章中,我们使用线段进行绘制过矩形,使用arc,arcTo绘制过圆弧和圆形,但是Canvas还能够进行绘制其他图形,比如三角形、六边形、八边形等.这篇文章主要就是说明如何绘制多边形.

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>a sample canvas example</title>
    <style>
    body
      background: #dddddd;
    
    #canvas 
      margin: 20px;
      padding: 10px;
      background: #ffffff;
      border: thin inset #aaaaaa;
    
    </style>
  </head>
  <body>
    <canvas id="canvas" width="500" height="500">
      canvas not supported
    </canvas>
    <script src="h5Polygon.js"></script>
  </body>
</html>

  • JS
window.addEventListener('load', eventWindowLoaded, false);

function eventWindowLoaded () 
  canvasApp(); // 包含整个Canvas应用程序

function canvasSupport(e) 
  return !!e.getContext;

function canvasApp() 
  let canvas = document.getElementById('canvas');
  Point = function (x, y) 
    this.x = x;
    this.y = y;
  ;

  const colors = ['#f0f', '#eef', '#ff0', '#f0f', '#aaf', '#0f0', '#ccc', '#999', '#eee', '#ccc', '#606'];
  if (!canvasSupport(canvas)) 
    return;
  
  let ctx = canvas.getContext('2d');
  canvas.width = window.innerWidth - 100;
  canvas.height = window.innerHeight - 50;

  function drawHorizontalAxis() 
    ctx.beginPath();
    ctx.moveTo(10, canvas.height / 2 + 0.5);
    ctx.lineTo(canvas.width - 10, canvas.height / 2);
    ctx.stroke();
  

  function drawVerticalAxis() 
    ctx.beginPath();
    ctx.moveTo(canvas.width / 2, 10);
    ctx.lineTo(canvas.width / 2, canvas.height - 10);
    ctx.stroke();
  

  function getPolygonPoints(centerX, centerY, radius, sides, startAngle) 
    const points = [];
    let angle = startAngle || 0;
    for (let i = 0; i < sides; ++i) 
      points.push(new Point(
        centerX + radius * Math.sin(angle),
        centerY - radius * Math.cos(angle)
      ));
      angle += 2 * Math.PI / sides;
    
    return points;
  

  function createPolygonPath(centerX, centerY, radius, sides, startAngle) 
    const points = getPolygonPoints(centerX, centerY, radius, sides, startAngle);

    ctx.beginPath();
    ctx.moveTo(points[0].x, points[0].y);

    for (let i = 0; i < sides; ++i) 
      ctx.lineTo(points[i].x, points[i].y);
    
    ctx.strokeStyle = colors[sides];
    ctx.closePath();
  

  function drawRubberbandShape(currentSides) 
    createPolygonPath(
      (canvas.width) / 2,
      (canvas.height) / 2,
      150, currentSides, Math.PI * 2
    );
    ctx.stroke();
  

  function drawScreen() 
    ctx.lineWidth = 1;
    ctx.strokeStyle = '#b3c3de';
    ctx.font = '24px Arial';
    drawHorizontalAxis();
    drawVerticalAxis();

    let curSides = 3;
    setInterval(function() 
      drawRubberbandShape(curSides++);
      if (curSides > 10) 
        curSides = 3;
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        drawHorizontalAxis();
        drawVerticalAxis();
      
    , 1200);
  
  drawScreen();


效果如下:

上述代码,我们进行绘制了一组根据时间进行变化的生成的多边形,通过方法drawHorizontalAxis绘制横向坐标轴,方法drawVerticalAxis绘制纵向坐标轴,通过方法getPolygonPoints进行计算获取多边形中所有的点,进行为后面连线时连接点作准备工作,通过createPolygonPath进行绘制具体的路径,其中使用循环的方式将points数组中坐标点进行连接,填充样式和描边,最后使用计时器进行控制图形的变化.
其实总的来说刚才绘图的模型就是下图所示,其中确定坐标点points数组的方式就是图中的(x,y)坐标.

可以看到我们其实绘制的全都是正多边形.那我们就不得不说说正多边形.

正多边形

维基百科上是这样描述的:正多边形是所有角都相等、并且所有边都相等的简单多边形,简单多边形是指在任何位置都不与自身相交的多边形。

正多边形的特性

正n边形每个内角为(1 - 2 / n) * 180或者表示为(n - 2) * 180 / n角度。也可以用弧度表示为(n - 2) * π / n 或者(n - 2) / 2n。

正多边形的所有顶点都在同一个外接圆上,每个正多边形都有一个外接圆,这也称为圆内接正多边形。

上图描述了正多边形的相关属性:

正多边形的中心点正好是一个正多边形的外接圆的圆心
正多边形每条边的长度都相等,如上图中的x
正多边形的每个内角都相等,如上图中的β
正多边形的每个外角都相等,如上图中的α
正多边形的中心角都相等,如上图中的θ
正多边形的中心点距正多边形的内切圆的半行为r
正多边形的顶点数和边数相等,常用n表示
正多边形中心距正多边形的外接圆(或者正多边中心点距正多边形的顶点)就是正多边形外接圆半么,如上图中的R
正多边形中心点距和每条边的端点构成一个等腰三角形,如上图中的A1。这个三角形的两条边长度相等,刚好是正多边形外接圆半径R,而这个三角形的高,刚好是正多边形内切圆半径r

那么在Canvas中要使用CanvasRenderingContext2D对象自带的方法,比如moveTo()和lineTo()绘制多边形,我们就必须知道正多边形属性之间的关系。也就是这些属性之间的三角函数。言外之意,在Canvas中,我们使用moveTo()和lineTo()方法,再配合一些简单的三角函数,就可以绘制出任意边数的多边形。

下面我们在上面代码的基础上进行更加灵活的配置,希望通过进行选择进行绘制任意边数的正多边形.

See the Pen h5Polygon by suwu150 ( @suwu150) on CodePen.

参考链接
1.canvas绘制蜘蛛网图

以上是关于h5 Canvas正多边形绘制的主要内容,如果未能解决你的问题,请参考以下文章

26opencv入门轮廓查找与绘制——正外接矩形

canvas绘制多边形

Canvas:绘制线和填充多边形

canvas绘制直线和多边形基本操作

HTML5 Canvas 学习笔记(canvas绘制线条矩形多边形圆形圆环组合图形文字自定义图像)

Web前端 Canvas图片加载拖拽缩放绘制多边形打点,坐标偏移获取和颜色获取 例程