Canvas.arcTo() 的使用,画一条带圆角的线段,画一个思维导图一基础

news2024/11/18 13:27:10

Canvas.arcTo() 的使用,画一条带圆角的线段,画一个思维导图一基础

在这里插入图片描述

一、方法定义

canvas.arcTo 这个方法还是比较难理解的。因为它不是直观的绘制路径,而是间接的。

它的参数是这样的。

canvas.arcTo(ax,ay,bx,by,radius)

它是由两个点和一个圆角半径来确定一条弧线。这么说你肯定是不能明白的,看下面例子。

二、参数解释

结合图解释一下这几个参数的含义。

比如需要画这样一条曲线。

在这里插入图片描述

先告诉你,这条线是由三条线段组成的:
两条 arcTo() 线段,一条 lineTo() 线段

1. 线段1 arcTo()

在不了解 arcTo() 之前,你绝对想不到,第一条 arcTo() 线段是这样的:

在这里插入图片描述

在这里插入图片描述
来解释一下,如上图所标注的信息:

  • 1点,就是路径原来所在的位置,起点
  • 2点,就是 ax, ay
  • 3点,就是 bx, by
  • 这个圆角的大小就是 radius

这样需要说明的是,从 1 点到 2 点并没有 lineTo() 的操作,这段直线+弧角的线段完全是 arcTo() 生成的。

这里我用 abcd 点表示 1234点,1 点坐标就是 ax,ay b点就是 bx,by

canvas.arcTo(ax,ay,bx,by,radius)

2. 线段2 arcTo()

那么接下来的线段就是从第一个 arcTo() 末端开始以 2、3点为参数做 arcTo() 操作,就会生成第二条线段。

canvas.arcTo(bx,by,cx,cy,radius)

在这里插入图片描述

3. 线段3 直线 lineTo()

最后一条直线就是直接

canvas.lineTo(dx,dy)

在这里插入图片描述

三、完整代码就是

你只需要根据参数说明传入参数,即可得到这样一条线段

/**
 *  在 a 与 d 点之间线一条带圆角的拆线
 * @param ctx canvas.context
 * @param pointA 起点坐标 {x,y}
 * @param pointD 末端坐标 {x,y}
 * @param radius  圆角半径 Number
 * @param lineWidth  线段宽度 Number
 */
function drawArcLine(ctx, pointA, pointD, radius, lineWidth){
    ctx.strokeStyle = 'black'
    ctx.fillStyle = 'black'
    ctx.font = '24px 微软雅黑'
    ctx.moveTo(pointA.x, pointA.y)
    ctx.fillText(`${pointA.x},${pointA.y}`,pointA.x, pointA.y + 30)
    // ctx.lineTo(pointA.x + (itemCenter.x - pointA.x) / 2 - radius, pointA.y)

    ctx.fillText(`${pointA.x + (pointD.x - pointA.x) / 2},${pointA.y}`,pointA.x + (pointD.x - pointA.x)/2, pointA.y + 30)

    ctx.arcTo(
        pointA.x + (pointD.x - pointA.x) / 2,
        pointA.y,
        pointA.x + (pointD.x - pointA.x) / 2,
        pointD.y,
        radius
    )

    ctx.fillText(`${pointA.x + (pointD.x - pointA.x) / 2},${pointD.y}`,pointA.x + (pointD.x - pointA.x) / 2, pointD.y)

    ctx.arcTo(
        pointA.x + (pointD.x - pointA.x) / 2,
        pointD.y,
        pointD.x,
        pointD.y,
        radius
    )

    ctx.lineTo(pointD.x, pointD.y)
    ctx.stroke()
}

四、可以做什么

最终你可以实现这样的效果,像思维导图一样

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学学习笔记(十):Digital Signatures - 数字签名1

什么是数字签名? 想象一下一下情景: Alice生成两个密钥:一个公钥𝑃𝐾𝐴 & 对应的密钥𝑆𝐾𝐴, 发布公钥,保留密钥然后Alice使用𝑆&#x1d4…

ARG DEBIAN_FRONTEND=noninteractive作用说明

使用 在Dockerfile中使用ARG指令定义变量并为其指定一个默认值。ARG指令用于在构建过程中传递变量的值。 对于DEBIAN_FRONTENDnoninteractive,它定义了一个名为DEBIAN_FRONTEND的变量,并将其默认值设置为noninteractive。在这个上下文中,no…

【uniapp开发h5】点击复制微信号并自动打开微信应用,类似可以唤起淘宝、知乎应用等

效果展示: 准备工作: 引用jquery.js 和 clipboard.min.js jQuery就不用多说了,而clipboard.min.js 是一个 JavaScript 库,用于实现网页上的复制到剪贴板功能。它提供了一种简单的方式来处理复制操作,无需使用浏览器原…

Ubuntu 包管理的 20 个“apt-get”命令

动动发财的小手,点个赞吧! 在引入 apt 命令之前,apt-get 命令是基于 Debian 的 Linux 发行版中使用的主要包管理命令。 使用 apt-get 命令,您可以在系统上安装、删除、升级、搜索和管理软件包。然而,从 Ubuntu 16.04 和…

22运动估计(matlab程序)

1.简述 实验目的 熟悉运动估计的块匹配(BMA)算法原理,编程实现全搜索算法(三步搜索或钻石搜索算法),了解运动估计在混合编码器中的作用。 实验内容 1)编写全搜索算法函数,将运动矢量…

使用Llama.cpp在CPU上快速的运行LLM

大型语言模型(llm)正变得越来越流行,但是它需要很多的资源,尤其时GPU。在这篇文章中,我们将介绍如何使用Python中的llama.cpp库在高性能的cpu上运行llm。 大型语言模型(llm)正变得越来越流行,但是它们的运行在计算上是非常消耗资源…

MongoDB教程-5

复制是跨多个服务器同步数据的过程。复制在不同的数据库服务器上提供数据的多个副本,从而提供冗余并提高数据可用性。复制可防止数据库丢失单个服务器。复制还允许您从硬件故障和服务中断中恢复。通过增加数据拷贝,您可以将其中一个用于灾难恢复、报告或…

Spring系列4 -- Bean的作用域和生命周期

目录 1. 案例 2. 作用域定义 2.1 Bean的6种作用域 2.2 设置作用域 3. Sring的执行流程 4. Bean的生命周期 思考: 为什么不是先进行初始化然后再进行设置属性呢? 1. 案例 假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中…

【面试】Hbase

逻辑模型 1 NameSpace 命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。Hbase有两个自带的命名空间,分别是hbase和default, hbase中存放的是HBase内置的表, default表是用户默认使用的命名空间。 2 Region 类似于关系型数据库的表…

综合 案例

案例1:淘宝焦点图布局 基本结构 1.大盒子我们类名为: tb-pro淘宝广告 2.里面先放一张图片 3.左右两个按钮用链接。左箭头prev 右箭头 next 4.底侧小圆点用ul 类名为pro-nav 注意: 1.如果一个盒子既有left属性也有right属性,则默认会执行lef…

Nvidia Jetson Orin系列配置教程

Nvidia Jetson Orin系列配置教程包含Orin系列的安装及配置办法,目前最为推荐的办法是通过Nvidia SDK Manager进行安装,详细内容如下: 法1:通过Nvidia SDK Manager进行安装 1.下载工具 前往Nvidia SDK Manager下载工具 2.安装工…

Lesson3-3:OpenCV图像处理---图像平滑

图像平滑 学习目标 了解图像中的噪声类型了解平均滤波,高斯滤波,中值滤波等的内容能够使用滤波器对图像进行处理 1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高…

MySQL之CRUD及常见面试题讲解

目录 一、CRUD是什么 二、什么是SQL注入 三、行转列的使用 四、CRUD中常用关键词 关键词: GROUP BY HAVING ORDER BY 五、聚合函数和连表查询 聚合函数 连表查询 六、DELETE、TRUNCATE、DROP的区别 七、MySQL常见面试题讲解 一、CRUD是什么 CRUD是一个常…

ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)

目录 1&#xff0c;异常等级&#xff08;Exception Level&#xff09; 2&#xff0c;Execution states&#xff0c;执行状态 AArch64的异常等级 AArch32的异常等级 3&#xff0c;异常等级切换 4&#xff0c;执行状态切换&#xff08;AArch64 <> AArch32&#xff09;…

文件下载功能(简单粗暴)

文件下载功能 // 模板下载 export const modelLoadInterface (data: any) > {return get<Response>(tsureexapp-exchange/config/points/grant/export.json, data, {skipErrorHandler: true,}); };import {modelLoadInterface} from "/services/CommunicationF…

山西电力市场日前价格预测【2023-07-11】

日前价格预测 预测明日&#xff08;2023-07-11&#xff09;山西电力市场全天平均日前电价为419.66元/MWh。其中&#xff0c;最高日前价格为490.80元/MWh&#xff0c;预计出现在11: 45。最低日前电价为365.06元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a;实…

关于Xxl-job执行器自动注册不了的问题

最近项目里面用到了xxljob&#xff0c;然后按照官方文档自己搭建了一个&#xff0c;发现一个问题&#xff0c;就是执行器自动注册不了&#xff0c;然后一顿百度&#xff0c;发现是这个配置的问题&#xff1a; 这个 xxl.job.executor.appname 是执行器的名称&#xff0c;是要和页…

Jenkisn远程执行Shell命令

Jenkisn远程执行gating 1、安装插件 SSH plugin** 系统管理Manage Jenkins->管理插件Plugin Manager->搜索SSH plugin并安装 2、配置 Credentials凭据 系统管理Manage Jenkins->凭据插件Manage Credentials-> 凭据的类型有很多&#xff0c;本次学习用户名与密…

关于Arduino UNO R3主控板(CH340)驱动问题

网上买了一个Arduino UNO R3的标准版产品&#xff0c;开始学习智能编程工具。主要是给小孩子提高一点兴趣爱好&#xff0c;还有就是想在创客实验方面找点素材。 问题&#xff1a; 刚拆包安装驱动遇到一个问题&#xff0c;按说明装了Arduino UNO R3主控板驱动&#xff0c;但就是…

这所院校学硕年年国家线,8人过线,全部录取!保护一志愿!

一、学校及专业介绍 山东科技大学&#xff0c;简称“山科大&#xff0c;SDUST”&#xff0c;山东省重点建设应用基础型人才培养特色名校和高水平大学“冲一流”建设高校。&#xff08;我也第一次听说冲一流这个概念图片&#xff09; 1.1 招生情况 山东科技大学通信2023年一共…