正多边形的编程绘制(javascript)

2019-11-26 11:11:59

参考地址 正多边形的编程绘制(javascript)

顺带给大家介绍一个网站,玄数,这个网站主要就是讲的算法,和各种计算。本身绘制五边形,就需要各种正弦,余弦的计算,相比大部分程序员已经忘记了怎么算了吧。大家可以从这个网站学习到很多算法。

如何用程序来绘制正多边形?

在一般情况下,会使用 x = radius * Math.cos(angle), y = radius * Math.sin(angle) 来进行绘制,但这是关于x轴对称的,如果遇到正多边形的边数为奇数,而你又希望它是以y轴对称时,可按照下面的方法。

正多边形

如图,正五边形ABCDE关于y轴对称,B与E,C与D互为对称点。A的坐标为(0, r)。 半径OA旋转一个内角θ,便是OB,此时B的坐标为(r·sin0, r·cos0)。继续旋转,可以得到OC、OD、OE等半径,坐标求法与OB的一致,只需把对应的角度依次增加(2π/边数)。

 

编程的流程图如下:

 

algorithm regular polygon

使用两个javascript文件:
Polygon.js —— 正多边形的类,在构造函数中求得所有的顶点,放在数组vertices

var Point = function(x, y)
{
    this.x = x;
    this.y = y;
};

var Polygon = function(x, y, radius, sides)
{
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.sides = sides;
    this.vertices = getPoints(x, y, radius, sides);    

    function getPoints(x, y, radius, sides){
        var points = [],
            angle = 0,
            centerAngle = 2 * Math.PI / sides;

        for(var i = 0;  i < sides;  i++){
            points.push(new Point( x + radius * Math.sin(angle), y - radius * Math.cos(angle) ));
            angle += centerAngle;
        }
        console.log(points);
        return points;
    }

    this.strokeStyle = 'black';
    this.fillStyle = 'rgba(200, 200, 200, 1)';    
};

Polygon.prototype = {

    createPath: function(context){

        context.beginPath();
        context.moveTo(this.vertices[0].x, this.vertices[0].y);
        for(var i = 1;  i < this.sides;  i++){
            context.lineTo(this.vertices[i].x, this.vertices[i].y);
        }
        context.closePath();
    },

    stroke: function(context){

        context.save();
        this.createPath(context);
        context.strokeStyle = this.strokeStyle;
        context.stroke();
        context.restore();
    },

    fill: function(context){

        context.save();
        this.createPath(context);
        context.fillStyle = this.fillStyle;
        context.fill();
        context.restore();
    }
}

drawPolygon.js —— 把多边形画到canvas上

 function init(){

    var canvas = document.getElementById('canvas'),
        cxt = canvas.getContext('2d');

    var polygon = new Polygon(200, 200, 130, 5);
    polygon.stroke(cxt);
}


  • 2020-03-30 15:37:12

    PM2下使用 npm run 命令

    npm run xxxx 是 node常用的启动方式之一,本文介绍下如何用PM2来实现该方式的启动。 下面是项目的package.json文件部分代码:

  • 2020-04-01 10:15:11

    vue-cli3.0中vue.config.js的基本配置(去除esLint提示和解决build后静态文件路径报错)

    vue-cli是开发vue项目必不可少的脚手架工具,3.0版本之前的目录结构是由config目录的,关于webpack配置的文件都放在该目录里面,而3.0版本之后做了一个大更新,webpack相关的默认配置都帮你集成到webpack的npm 包里面去了,官方提供的一种修改配置的方式就是开发者自己在项目的根目录(与src同层级的目录)下建立一个vue.config.js的文件,然后去覆盖自定义的配置,达到你想要的效果,下面写一个基本的默认配置

  • 2020-04-01 10:21:20

    Vue extend $mount 构造器详解

    本节介绍两个 Vue.js 内置但却不常用的 API——extend 和 $mount,它们经常一起使用。不常用,是因为在业务开发中,基本没有它们的用武之地,但在独立组件开发时,在一些特定的场景它们是至关重要的。

  • 2020-04-01 15:36:52

    CSS3中的transition属性详解

    transition: property duration timing-function delay transition属性是个复合属性,她包括以下几个子属性: transition-property :规定设置过渡效果的css属性名称 transition-duration :规定完成过渡效果需要多少秒或毫秒 transition-timing-function :指定过渡函数,规定速度效果的速度曲线 transition-delay :指定开始出现的延迟时间