context.arcTo()

  arcTo() 方法在画布上创建介于两个切线之间的弧/曲线。

JavaScript 语法: context.arcTo(x1,y1,x2,y2,r);

参数描述

参数 描述
x1 弧的起点的 x 坐标。
y1 弧的起点的 y 坐标。
x2 弧的终点的 x 坐标。
y2 弧的终点的 y 坐标。
r 弧的半径。

使用如下:

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
ctx.moveTo(20,20); // 创建开始点
ctx.lineTo(100,20); // 创建水平线
ctx.arcTo(150,20,150,70,50); // 创建弧
ctx.lineTo(150,120); // 创建垂直线
ctx.stroke(); // 绘制

上述代码绘制效果如下:

起点A,先画一条线AB,使用arcTo声明另外一条线CD,那么BC和CD组成一个夹角,arcTo绘制半径为50的圆弧,然后连接到E点

如果把创建弧的C点坐标改一下(150,0):ctx.arcTo(150,0,150,70,50);

如下图看到因为半径大,所以圆弧会撑开,圆弧的起点撑到了BC的线段的反向延长线上

  我们把半径改小到20,ctx.arcTo(150,0,150,70,20)

如下图:

绘制圆角多边形  

  理解了arcTo画弧的逻辑,我们回到绘制圆角多边形的话题

需求简述如下图,三角形ABC,我们绘制成圆角,顶点处是个圆弧。

知道多半形顶点坐标,利用canvas的api方法 arcTo() 就可以实现了。

一个绘制圆角多边形简单的实现:

 1 <!DOCTYPE html>
2 <html lang="en">
3
4 <head>
5 <meta charset="UTF-8" />
6 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 <title>Document</title>
8 <style>
9 #canvas {
10 width: 400px;
11 height: 400px;
12 }
13 </style>
14 </head>
15
16 <body>
17 <canvas id="canvas" width="800" height="800"></canvas>
18 </body>
19 <script>
20 function draw() {
21 const p = [
22 [15, 20],
23 [20, 200],
24 [200, 300],
25 [300, 100],
26 [200, 20],
27 ];
28 const p1 = [
29 [300,50],
30 [400,50],
31 [350,150]
32 ]
33 const canvas = document.getElementById("canvas");
34 const ctx = canvas.getContext("2d");
35 drawRect(p, 30, ctx);
36 drawRect(p1, 10, ctx);
37 }
38
39 function drawRect(p, radius, ctx) {
40 ctx.beginPath();
41 const startPoint = [
42 (p[0][0] + p[p.length - 1][0]) / 2,
43 (p[0][1] + p[p.length - 1][1]) / 2,
44 ];
45 ctx.moveTo(...startPoint);
46 for (let i = 0; i < p.length; i++) {
47 if (i === p.length - 1) {
48 ctx.arcTo(...p[p.length - 1], ...p[0], radius);
49 } else {
50 ctx.arcTo(...p[i], ...p[i + 1], radius);
51 }
52 }
53 ctx.closePath();
54 ctx.stroke();
55 }
56 window.onload = function() {
57 draw();
58 };
59 </script>
60
61 </html>

实现效果如下图:

canvas绘制--圆角多边形的更多相关文章

  1. [原译]WPF绘制圆角多边形

    原文:[原译]WPF绘制圆角多边形 介绍 最近,我发现我需要个圆角多边形.而且是需要在运行时从用户界面来绘制.WPF有多边形.但是不支持圆角.我搜索了一下.也没找到可行的现成例子.于是就自己做吧.本文 ...

  2. canvas绘制圆角头像

    如果你想绘制的网页包含一个圆弧形的头像的canvas图片,但是头像本身是正方形的,需要的方法如下:首先, 拿到头像在画布上的坐标和宽高:(具体怎么获取不在此做具体介绍) 使用canvas绘制圆弧动画 ...

  3. canvas 绘制圆角矩形

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  4. JavaScript+canvas 绘制多边形

    效果图: <body> <canvas id="square" width="500"></canvas> <canv ...

  5. canvas绘制多边形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 小程序canvas绘制纯色圆角区域 setdata数组某一项

    小程序canvas绘制纯色圆角区域: //方法: roundRectPath:function(ctx, x, y, w, h, r) { ctx.beginPath(); ctx.moveTo(x ...

  7. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习   从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方 ...

  8. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  9. Canvas绘制图形

    1.Canvas绘制一个蓝色的矩形 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  10. HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash Line)

    HTML5 Canvas自定义圆角矩形与虚线(RoundedRectangle and Dash Line) 实现向HTML Canvas 2d context绘制对象中添加自定义的函数功能演示,如何 ...

随机推荐

  1. 【测试平台开发】——01后端web开发框架Flask

    官方中文地址:https://flask.net.cn/ 官方英文地址:https://flask.palletsprojects.com/en/2.1.x/ github地址:https://git ...

  2. 折腾 Quickwit,Rust 编写的分布式搜索引擎 - 可观测性之分布式追踪

    概述 分布式追踪是一种跟踪应用程序请求流经不同服务(如前端.后端.数据库等)的过程.它是一个强大的工具,可以帮助您了解应用程序的工作原理并调试性能问题. Quickwit 是一个用于索引和搜索非结构化 ...

  3. 淘宝订单信息获取接口,淘宝开放平台R2权限,淘宝开放平台订单获取接口

    目前淘宝开放平台是关闭了订单权限申请的,有这方便的需求的人,除非是天猫用户才能申请(天猫用户申请到只能给自己天猫店授权),否则是申请不到这个订单接口了,如果有这方面需要的人可以联系我,站内信留下QQ或 ...

  4. 低代码 + BI 数字化转型如何助力制造业供应链协同?

    引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇.全球化竞争.消费者需求的快速变化.技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性.供应链协同作为 ...

  5. Eclipse中Java项目的导入和导出

    eclipse中项目的导出 当我们完成自己的java项目之后,我们可以将其打包发给别人,eclipse为我们提供了自动打包的功能. 之后单击finish即可.在你选择的导出位置便可以看到导出的压缩包: ...

  6. CCF CSP-S 2024 提高组初赛解析

    本解析不提供阅读程序与完善程序题目的代码,如有需要请通过 luogu.com.cn 相关链接 下载 如有谬误烦请指正 答案 AACBB BDABD ACBCD ✓××BC ✓✓✓BCC ✓×✓CAC ...

  7. SXYZ-7.3训练赛

    T1 房 啥啥啥,T1又又又爆了,整个人精神状态 良好. 解题思路 考虑数据保证任意两个房子不重合 建一个结构体存两边 最后判断一下 \(>t\) 加两个 \(==t\) 加一个 == 但是!! ...

  8. 【赵渝强老师】使用kubeadmin部署K8s集群

    首先,我们来看一下整体的架构. K8s的部署方式: yum方式部署 二进制包:手动使用tar包来部署 minikube:单机版,用于开发测试. kubeadm:可以把kubeadmin看成一个部署工具 ...

  9. 分析ueventd Coldboot耗时问题

    安卓go平台启动时间发现如下ueventd耗时1.907s问题: 01-11 00:20:02.854 0 0 I init : Parsing file /odm/etc/init... 01-11 ...

  10. CNN每层卷积结果视觉展示(3Dircadb肝脏数据为例)

    试着展示了肝脏每层卷积之后的结果.代码如下: import torch import torch.nn as nn import SimpleITK as sitk import numpy as n ...