圆角三角形,二次方贝塞尔曲线

简介: 圆角三角形,二次方贝塞尔曲线

源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圆角三角形,二次方贝塞尔曲线</title>
</head>
<body>
<canvas id="canvas" height="400" width="400" style="border: 1px solid black"></canvas>
</body>
<script>
    'use strict';
 
    let canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d'),
    TRIANGLE_MARGIN=30,
    POINT_RADIUS=7,
    points=[
        //右下角控制点
        {x:canvas.width-TRIANGLE_MARGIN,y:canvas.height-TRIANGLE_MARGIN},
        //右下角锚点
        {x:canvas.width-TRIANGLE_MARGIN*2,y:canvas.height-TRIANGLE_MARGIN},
        //左控制点
        {x:POINT_RADIUS,y:canvas.height/2},
        //左锚点
        {x:TRIANGLE_MARGIN,y:canvas.height/2-TRIANGLE_MARGIN},
        //右上角控制点
        {x:canvas.width-TRIANGLE_MARGIN,y:TRIANGLE_MARGIN},
        //右上角锚点
        {x:canvas.width-TRIANGLE_MARGIN,y:TRIANGLE_MARGIN*2}
    ];
 
    //Function……
    /**
     * 绘制锚点或控制点的方法封装,以不同的颜色参数绘制
     * @param x
     * @param y
     * @param strokeStyle
     * @param fillStyle
     */
    function drawPoint(x,y,strokeStyle,fillStyle) {
        context.beginPath();
        context.fillStyle=fillStyle;
        context.strokeStyle=strokeStyle;
        context.lineWidth = 0.5;
        context.arc(x,y,POINT_RADIUS,0,Math.PI*2,false);
        context.fill();
        context.stroke();
    }
 
    /**
     * 绘制所有的贝塞尔带你,锚点或控制点
     */
    function drawBezierPoints() {
        let i,
            strokeStyle,
            fillStyle;
        for (i=0;i<points.length;i++) {
            fillStyle = i%2===0?'white':'blue';
            strokeStyle=i%2===0?'blue':'white';
            drawPoint(points[i].x,points[i].y,strokeStyle,fillStyle);
        }
    }
 
    /**
     * 绘制圆角矩形
     */
    function drawArcTriangle() {
        context.strokeStyle='#999999';
        context.fillStyle='cornflowerblue';
 
        //从右上角的锚点开始绘制
        context.moveTo(canvas.width-TRIANGLE_MARGIN,TRIANGLE_MARGIN*2);
 
        context.lineTo(canvas.width-TRIANGLE_MARGIN,canvas.height-TRIANGLE_MARGIN*2);
 
        context.quadraticCurveTo(points[0].x,points[0].y,points[1].x,points[1].y);
 
        context.lineTo(TRIANGLE_MARGIN,canvas.height/2+TRIANGLE_MARGIN);
 
        context.quadraticCurveTo(points[2].x,points[2].y,points[3].x,points[3].y);
 
        context.lineTo(canvas.width-TRIANGLE_MARGIN*2,TRIANGLE_MARGIN);
 
        context.quadraticCurveTo(points[4].x,points[4].y,points[5].x,points[5].y);
        context.fill();
        context.stroke();
    }
 
    //Init……
    context.clearRect(0,0,canvas.width,canvas.height);
    drawArcTriangle();
    drawBezierPoints();
</script>
</html>
相关文章
|
2月前
|
前端开发 小程序 JavaScript
贝塞尔曲线的切线及其AABB问题
贝塞尔曲线的切线及其AABB问题
|
3月前
|
前端开发 JavaScript
canvas系列教程01——直线、三角形、多边形、矩形、调色板
canvas系列教程01——直线、三角形、多边形、矩形、调色板
33 0
|
3月前
|
前端开发
canvas系列教程02——圆、弧线、圆角矩形、曲线(气泡、心形、N叶草)、扇形
canvas系列教程02——圆、弧线、圆角矩形、曲线(气泡、心形、N叶草)、扇形
21 0
|
12月前
数学问题-圆上某点沿圆心旋转后的坐标关系式
数学问题-圆上某点沿圆心旋转后的坐标关系式
168 1
wustojc4008能否构成三角形
wustojc4008能否构成三角形
30 0
|
前端开发 JavaScript 数据可视化
用Canvas实现简单画图(线、三角形、矩形、圆)
👋因为在B站看到一个小demo是基于canvas写的,非常喜欢,然后上掘金大数据又给我推了 《Canvas 从入门到劝朋友放弃(图解版)》,就像上手一下canvas,本来不想写笔记的,因为《Canvas 从入门到劝朋友放弃(图解版)》自己看了一下挺全的,但本着输入要有输出,所以就有了这篇文章
238 0
138.正方形螺旋拼块图案
138.正方形螺旋拼块图案
70 0
140.递归法绘制三角形图案
140.递归法绘制三角形图案
77 0
|
算法 C# C++
n阶贝塞尔曲线绘制(C/C#)
原文:n阶贝塞尔曲线绘制(C/C#) 贝塞尔是很经典的东西,轮子应该有很多的。求n阶贝塞尔曲线用到了 德卡斯特里奥算法(De Casteljau’s Algorithm) 需要拷贝代码请直接使用本文最后的例程,文章前面的大部分代码都不是最佳实践,是在编程过程中的摸索(走过的弯路),不过这些示范对笔者今后写算法启发很大。
3561 0