Canvas绘画之简单的多边形绘画

简介: Canvas绘画之简单的多边形绘画

效果:

源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简单的多边形</title>
</head>
<body>
 
<canvas id="canvas"></canvas>
<p>试试选择不同的边数</p>
<label for="sidesSelects">多边形边数</label>
<select id="sidesSelects">
    <option selected value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="9">9</option>
</select>
</body>
<script>
    'use strict';
 
    let canvas = document.getElementById('canvas'),
        context = canvas.getContext('2d'),
 
        sidesSelect = document.getElementById('sidesSelects'),
 
 
 
        Point = function (x, y) {
            this.x = x;
            this.y = y;
        };
 
    //Function……
    /**
     * 获得多边形的所有外接圆顶点
     * @param centerX
     * @param centerY
     * @param radius
     * @param sides
     * @param startAngle
     */
    function getPolygonPoints(centerX,centerY,radius,sides,startAngle) {
        let points = [],
            //这里的angle是基于钟表0点的位置开始计算,0点位置为0度,3点位置为π/2度
            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;
    }
 
    /**
     * 根据每个顶点的位置,创建多边形的路径
     * @param centerX
     * @param centerY
     * @param radius
     * @param sides
     * @param startAngle
     */
    function createPolygonPath(centerX,centerY,radius,sides,startAngle) {
        let points = getPolygonPoints(centerX,centerY,radius,sides,startAngle);
 
        context.beginPath();
        context.moveTo(points[0].x,points[0].y);
 
        for (let i=0;i<sides;++i){
            context.lineTo(points[i].x,points[i].y);
        }
        context.closePath();
    }
 
    /**
     * 绘制多边形
     */
    function drawRubberbandShape() {
        createPolygonPath(canvas.width/2,canvas.height/2,canvas.width/4,parseInt(sidesSelect.value),0);
        context.stroke();
    }
 
    drawRubberbandShape();
 
    //event
    sidesSelect.onchange=function () {
        context.clearRect(0,0,canvas.width,canvas.height);
        drawRubberbandShape();
    }
</script>
</html>
相关文章
|
关系型数据库 API 数据库
盘点10个.NetCore实用的开源框架项目
盘点10个.NetCore实用的开源框架项目
3041 0
盘点10个.NetCore实用的开源框架项目
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
1799 0
|
Prometheus 监控 Cloud Native
hyperf| hyperf/metric 上手指南
这期又开始聊微服务的基础设施之一: 实时监控. 更准确的说法, 基于 prometheus 的实时监控. 关于技术选型这里就不多啰嗦啦, 很多时候「从众」或者「用脚投票」往往是最有效的
1182 0
|
10月前
|
人工智能 IDE 开发工具
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
JetBrains Rider 2025.1 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
753 29
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
1014 3
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
4027 2
|
存储 Linux Shell
常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件
这篇文章介绍了Vim编辑器的基本使用、常用命令和模式,以及Linux系统中用户和组的管理方法,包括用户和组相关文件如/etc/passwd、/etc/shadow和/etc/group的说明。
常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
物联网 人机交互 语音技术
计算机中输入输出设备
【7月更文挑战第28天】
623 1
|
存储 缓存 前端开发
单页应用(SPA)的架构与优化:深度探索与实践
【6月更文挑战第11天】本文探讨了单页应用(SPA)的架构与优化,包括前后端分离、路由管理和状态管理基础,以及加载性能、路由和状态管理的优化策略。通过合理设计与优化,SPA能提供流畅体验,同时应对加载性能、路由导航和状态管理的挑战。文章旨在帮助读者理解并提升SPA应用的性能和用户体验。