【H5 Canvas】【平面几何】特殊图形绘制(箭头/正多边/正多尖角形等)

文章目录

        • 直线/弧线 箭头

直线/弧线 箭头
// startX,startY 起始坐标
// endX,endY 结束坐标
// radian 圆弧角度,取值[0,PI]; 0表示画直线箭头,否则画圆弧箭头
CanvasRenderingContext2D.prototype.drawArrow = function(startX,startY,endX,endY,radian,options){if(startX===endX&&startY===endY){return;}options = options||{'leg':10,'up':true,'lineCap':'round','lineWidth':3,'strokeStyle':'red'}// options.up 弧线是否向上拱// 备份线条属性const {lineCap:defaultLineCap,lineWidth:defaultLineWidth,strokeStyle:defaultStrokeStyle} = this;this.lineCap = options.lineCap;this.lineWidth = options.lineWidth;this.strokeStyle = options.strokeStylethis.beginPath();let rotatedRadian;if(!radian){ // radian = 0, 画直线// 画长直线this.moveTo(startX,startY);this.lineTo(endX,endY);// 计算以结束点为中心点的旋转角度(atan只能返回-PI/2,PI/2,我们需要0,PI,使用atan2)rotatedRadian = (Math.atan2((startY-endY),(startX-endX)));}else{// 画圆弧// 计算圆弧圆心,半径let [middlePointX,middlePointY] = [(startX+endX)/2,(startY+endY)/2]let rotatedRadian1 if(options.up){rotatedRadian1 = (Math.atan2((endY-startY),(endX-startX)))+Math.PI/2;}else{rotatedRadian1 = (Math.atan2((startY-endY),(startX-endX)))+Math.PI/2;}let len = Math.atan(radian/2)*Math.sqrt(Math.pow(middlePointX-endX,2)+Math.pow(middlePointY-endY,2));let [radiusPointX,radiusPointY] = [middlePointX + len*Math.cos(rotatedRadian1),middlePointY + len*Math.sin(rotatedRadian1)]let radius = Math.sqrt(Math.pow(radiusPointX-endX,2)+Math.pow(radiusPointY-endY,2));// 画弧线this.arc(radiusPointX,radiusPointY,radius,Math.atan2((startY-radiusPointY),(startX-radiusPointX)),Math.atan2((endY-radiusPointY),(endX-radiusPointX)),!options.up)if(options.up){rotatedRadian = (Math.atan2((endY-radiusPointY),(endX-radiusPointX)))-Math.PI/2;}else{rotatedRadian = (Math.atan2((radiusPointY-endY),(radiusPointX-endX)))-Math.PI/2;}}// 计算2个箭头线的端点let x1 = endX + options.leg * Math.cos(rotatedRadian-Math.PI/4);let y1 = endY + options.leg * Math.sin(rotatedRadian-Math.PI/4);let x2 = endX + options.leg * Math.cos(rotatedRadian+Math.PI/4);let y2 = endY + options.leg * Math.sin(rotatedRadian+Math.PI/4);// 画2个箭头线this.moveTo(x1,y1);this.lineTo(endX,endY);this.moveTo(x2,y2);this.lineTo(endX,endY);this.stroke();// 恢复线条属性this.lineCap = defaultLineCapthis.lineWidth = defaultLineWidth;this.strokeStyle = defaultStrokeStyle}
context.drawArrow(0,0,220,120,Math.PI*3)
context.drawArrow(0,0,120,80,Math.PI/4)
context.drawArrow(60,130,60,20)
context.drawArrow(257,50,50,133)

在这里插入图片描述

此文将持续更新…

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路径规划之A*算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A*算法 路径规划之A*算法 系列文章目录前言一、前期准备1.1 算法对比1.2 数学式方法1.3 启发式方法 二、A*算法2.1 起源2.2 思想2.3 启发式函数2.4 过程2.5 案例查看 前言 之前提过Dijkstra算…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别?Spring AOP中的动态代理如何理解 Spring 中的代理?解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知:什么是切面 Aspe…

pyhon数据分析A股股票策略实际买卖总结(每月末更新数据)

简介 本篇文章主要记录python数据分析a股股票选股后实际买卖的记录。 选股策略 低位寻股,筛选出低位股价股票已经做过调整的股票,做短线交易(不超过7天),不贪,小赚即走。分三个时段,开盘三十…

使用VC++设计程序:实现常见的三种图像插值算法:最近邻插值,双线性插值,立方卷积插值

图像放大的三种插值算法 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章: 01- 一元熵值、二维熵值 02- 图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 04-…

定长子网划分和变长子网划分问题_二叉树解法_通俗易懂_配考研真题

引入:定长子网划分和变长子网划分的基本概念 定长子网划分和变长子网划分的基本概念 目前常用的子网划分,是基于CIDR的子网划分,也就是将给定的CIDR地址块划分为若干个较小的CIDR地址块。 定长子网划分: 使用同一个子网掩码来划分子网,因…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功,其中有几个关键问题需要解决: 全表筛选,或者说多列搜索中文排序…

文件元数据批量修改:mp3音频和mp4视频的元数据如何批量修改

在数字媒体处理和管理的日常工作中,文件元数据的批量修改是一个常见的需求。元数据,或者称为文件信息,可以包括文件的创建日期、修改日期、文件名、文件大小、标签等。在音乐和视频处理领域,例如对mp3音频和mp4视频文件&#xff0…

R语言期末复习一

创建一个长度为7的字符向量,元素为"A", "B", "C", "D", "E", "F", "G",并命名为vec1。 创建一个因子,包含6个水果:"apple", "banana"…

梯度详解与优化实战

什么是梯度 对所有自变量求偏微分构成的向量,它是一个向量(有大小和函数值增长方向) 导数是一个标量 找最小值点坐标的案例 import torchimport numpy as np import matplotlib.pyplot as plt def himmelblau(x):return (x[0]**2x[1]-11)…

android系统新特性——用户界面以及系统界面改进

用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言,它是一套完整的设计系统,包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述,让开发者设计出更符合目标的软件&#xff0c…

电子学会C/C++编程等级考试2023年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536输入 一行字符串,长度不超过100,字符串中不含空格。输出 字符串中所有数字字符作为数…

泛型你掌握多少?包装类你深入了解过吗?快进来看看吧~

目录 1、泛型是什么——引出泛型 2、泛型的使用 2.1、语法 2.2泛型类的使用 2.3、裸类型 3、泛型如何编译 3.1、擦除机制 3.2、为什么不能实例化泛型类型数组 4、泛型的上界 5、泛型方法 5.1、语法 5.2、举例 6、通配符 6.1、什么是通配符 6.2、统配符解决了什么…