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实用的开源框架项目
2769 0
盘点10个.NetCore实用的开源框架项目
|
Prometheus 监控 Cloud Native
hyperf| hyperf/metric 上手指南
这期又开始聊微服务的基础设施之一: 实时监控. 更准确的说法, 基于 prometheus 的实时监控. 关于技术选型这里就不多啰嗦啦, 很多时候「从众」或者「用脚投票」往往是最有效的
1029 0
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
1596 0
|
7月前
|
人工智能 IDE 开发工具
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
JetBrains Rider 2025.1 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
470 29
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
|
存储 Swift 对象存储
OpenStack的对象存储(Swift)
【8月更文挑战第24天】
587 1
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
1318 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
存储 API Go
学习gin-vue-admin之创建api和swagger
学习gin-vue-admin之创建api和swagger
|
JavaScript
Vue3搜索框(InputSearch)
这篇文章介绍了如何在Vue 3中创建一个具有搜索、清除、加载状态等多功能的搜索框组件(InputSearch),并提供了组件的配置选项、事件处理和使用示例。
1189 6
Vue3搜索框(InputSearch)
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
804 3
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
3809 2