Canvas 绘制坐标系中的点以及折线

2024-08-21 03:58
文章标签 绘制 canvas 折线 坐标系

本文主要是介绍Canvas 绘制坐标系中的点以及折线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求

上一篇章介绍了如何使用Canvas绘制坐标系,那么本篇章来看看怎么简单绘制坐标系中的点。

示例图如下:

13423234-faaeb548f168601c.png

可以看到这里绘画的坐标点比较大,为了更好看一些。其实不管大小,基本的绘制步骤如下:

  1. 设置坐标点的中心圆点位置(x0,y0)
  2. 设置坐标点的大小 dotSize
  3. 计算坐标点的上下左右四角的点坐标

条件1和2可以直接通过设置获取,而坐标点上下左右四角坐标看看下面的计算示意图。

计算坐标点的上下左右四角的点坐标

13423234-33896575d2e13a05.png

从上图可以看到要绘制一个正方形坐标点的上下左右四角点坐标的计算方式。
下面来具体示例代码。

绘制坐标系中的点

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>canvas{border: 1px solid #cccccc;margin-top: 100px;margin-left: 100px;}</style><script type="text/javascript">window.onload = function () {/*获取元素*/var myCanvas = document.querySelector('#myCanvas');/*获取绘图工具*/var ctx = myCanvas.getContext('2d');/*1. 设置坐标点的中心圆点位置(x0,y0)2. 设置坐标点的大小  dotSize3. 计算坐标点的上下左右四角的点坐标*/// 1. 设置坐标点的中心圆点位置(x0,y0)var x0 = 100;var y0 = 200;// 2. 获取Canvas的width、heightvar CanvasWidth = ctx.canvas.width;var CanvasHeight = ctx.canvas.height;// 3.设置坐标点的大小  dotSizevar dotSize = 10;// 4.计算坐标点的上下左右四角的点坐标: 左上(x1,y1) 左下(x2,y2) 右上(x3,y3) 右下(x4,y4)var x1 = Math.floor(x0 - dotSize/2);var y1 = Math.floor(y0 - dotSize/2);var x2 = Math.floor(x0 - dotSize/2);var y2 = Math.floor(y0 + dotSize/2);var x3 = Math.floor(x0 + dotSize/2);var y3 = Math.floor(y0 - dotSize/2);var x4 = Math.floor(x0 + dotSize/2);var y4 = Math.floor(y0 + dotSize/2);// 5.绘画坐标点ctx.beginPath();ctx.moveTo(x1,y1); // 左上点ctx.lineTo(x2,y2); // 左下点ctx.lineTo(x4,y4); // 右下点ctx.lineTo(x3,y3); // 右上点ctx.closePath();// 6.填充以及描边y轴ctx.fill();}</script>
</head>
<body><canvas id="myCanvas" width="400" height="400"></canvas>
</body>
</html>

浏览器显示如下:

13423234-b13d6d72513da36c.png

这样来看,就绘画好了单个坐标系中的点了,下面来增加复杂度,因为一般坐标系的点不会只单一画一个,一般都是后台返回多个点的坐标,然后一起绘画。

那么下面将绘制点的过程写成一个方法,然后定义多个点的坐标,进行多点绘制。

多点绘制

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>canvas{border: 1px solid #cccccc;margin-top: 100px;margin-left: 100px;}</style><script type="text/javascript">window.onload = function () {function drawPoints(data) {/*获取元素*/var myCanvas = document.querySelector('#myCanvas');/*获取绘图工具*/var ctx = myCanvas.getContext('2d');/*1. 设置坐标点的中心圆点位置(x0,y0)2. 设置坐标点的大小  dotSize3. 计算坐标点的上下左右四角的点坐标*/// 设置坐标点的大小  dotSizevar dotSize = 10;// 4.遍历点的坐标,以及绘画点data.forEach(function (item,i) {console.log("i = " + i + ", x = " + item.x + ", y = " + item.y);// 1. 设置坐标点的中心圆点位置(x0,y0)var x0 = item.x;var y0 = item.y;// 2.计算坐标点的上下左右四角的点坐标: 左上(x1,y1) 左下(x2,y2) 右上(x3,y3) 右下(x4,y4)var x1 = Math.floor(x0 - dotSize/2);var y1 = Math.floor(y0 - dotSize/2);var x2 = Math.floor(x0 - dotSize/2);var y2 = Math.floor(y0 + dotSize/2);var x3 = Math.floor(x0 + dotSize/2);var y3 = Math.floor(y0 - dotSize/2);var x4 = Math.floor(x0 + dotSize/2);var y4 = Math.floor(y0 + dotSize/2);// 3.绘画坐标点ctx.beginPath();ctx.moveTo(x1,y1); // 左上点ctx.lineTo(x2,y2); // 左下点ctx.lineTo(x4,y4); // 右下点ctx.lineTo(x3,y3); // 右上点ctx.closePath();// 4.填充以及描边y轴ctx.fill();});}// 定义需要绘制的点坐标var points = [{x: 20,y: 80,},{x: 40,y: 120,},{x: 100,y: 200,},{x: 150,y: 300,},{x: 250,y: 100,},{x: 300,y: 400,},{x: 350,y: 50,}];drawPoints(points)}</script>
</head>
<body><canvas id="myCanvas" width="400" height="400"></canvas>
</body>
</html>

浏览器显示如下:

13423234-a82fdc571f16c979.png

那么如果是折线图的话,那就还需要将这些多点连接起来,形成一个折线图。

连接多点,形成折线图

如果要连接多点,形成一点直线,那么每一条连接的线段都需要知道起点和终点。
对于第一个点,那么起点就是坐标原点。
对于第二个点开始,起点就是上一个点的坐标,自身坐标就是终点。

那么在这里关键就是要定义好坐标系的原点,作为第一个点的起点,后续的点只要将上一个点的坐标进行记录,然后将线条绘制起来,就可以形成折线图了。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>canvas{border: 1px solid #cccccc;margin-top: 100px;margin-left: 100px;}</style><script type="text/javascript">window.onload = function () {function drawPoints(data) {/*获取元素*/var myCanvas = document.querySelector('#myCanvas');/*获取绘图工具*/var ctx = myCanvas.getContext('2d');/*1. 设置坐标点的中心圆点位置(x0,y0)2. 设置坐标点的大小  dotSize3. 计算坐标点的上下左右四角的点坐标*/// 设置坐标点的大小  dotSizevar dotSize = 10;// 4.遍历点的坐标,以及绘画点data.forEach(function (item,i) {// console.log("i = " + i + ", x = " + item.x + ", y = " + item.y);// 1. 设置坐标点的中心圆点位置(x0,y0)var x0 = item.x;var y0 = item.y;// 2.计算坐标点的上下左右四角的点坐标: 左上(x1,y1) 左下(x2,y2) 右上(x3,y3) 右下(x4,y4)var x1 = Math.floor(x0 - dotSize/2);var y1 = Math.floor(y0 - dotSize/2);var x2 = Math.floor(x0 - dotSize/2);var y2 = Math.floor(y0 + dotSize/2);var x3 = Math.floor(x0 + dotSize/2);var y3 = Math.floor(y0 - dotSize/2);var x4 = Math.floor(x0 + dotSize/2);var y4 = Math.floor(y0 + dotSize/2);// 3.绘画坐标点ctx.beginPath();ctx.moveTo(x1,y1); // 左上点ctx.lineTo(x2,y2); // 左下点ctx.lineTo(x4,y4); // 右下点ctx.lineTo(x3,y3); // 右上点ctx.closePath();// 4.填充以及描边y轴ctx.fill();});}function drawLine(data) {/*获取元素*/var myCanvas = document.querySelector('#myCanvas');/*获取绘图工具*/var ctx = myCanvas.getContext('2d');// 设置坐标系与边界的间隙大小var space = 20;// 2. 获取Canvas的width、heightvar canvasWidth = ctx.canvas.width;var canvasHeight = ctx.canvas.height;// 3.计算坐标系的原点坐标(x0,y0)var x0 = space;var y0 = canvasHeight - space;/*遍历绘画多点连接的折线1. 第一个点与坐标系原点连成一条线2. 从第二个点开始与上一个点连成一条线,所以需要记录上一个点的坐标*/// 记录上一个点坐标var prev_point_x = null;var prev_point_y = null;data.forEach(function (item,i) {console.log("绘制折线: i = " + i + ", x = " + item.x + ", y = " + item.y);if (i===0){console.log("坐标系的原点坐标:x0 = " + x0 + ", y0 = " + y0);console.log("第一个点的坐标: x = " + item.x + ", y = " + item.y);// 第一个点与坐标系原点连成一条线ctx.beginPath();ctx.moveTo(x0,y0); // 坐标系原点ctx.lineTo(item.x,item.y); // 第一个点ctx.stroke();// 记录当前的点为下一个点的坐标的出发点坐标prev_point_x = item.x;prev_point_y = item.y;}else{ // 从第二个点开始与上一个点连成一条线,所以需要记录上一个点的坐标ctx.beginPath();ctx.moveTo(prev_point_x,prev_point_y); // 设置上一个点的坐标为出发点ctx.lineTo(item.x, item.y); // 设置当前点为终点ctx.stroke();// 记录当前的点为下一个点的坐标的出发点坐标prev_point_x = item.x;prev_point_y = item.y;}})}// 定义需要绘制的点坐标var points = [{x: 20,y: 80,},{x: 40,y: 120,},{x: 100,y: 200,},{x: 150,y: 300,},{x: 250,y: 100,},{x: 300,y: 400,},{x: 350,y: 50,}];drawPoints(points);drawLine(points);}</script>
</head>
<body><canvas id="myCanvas" width="400" height="400"></canvas>
</body>
</html>

浏览器显示效果如下:

13423234-bf8c00763c6d10d0.png
13423234-0e3934319aa622f6.png

这篇关于Canvas 绘制坐标系中的点以及折线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092052

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一

使用matplotlib绘制散点图、柱状图和饼状图-学习篇

一、散点图 Python代码如下: num_points = 100x = np.random.rand(num_points) #x点位随机y = np.random.rand(num_points) #y点位随机colors = np.random.rand(num_points) #颜色随机sizes = 1000 * np.random.rand(num_points) # 大

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

Excel绘制CDF图

对如下20个原始数据绘制cdf图 1. 对数据进行排序,从小到大 2. 计算累积分布: 计算公式为: 然后对C3下拉,得到累积分布数据。 3. 选中B、C两列绘制散点图:

【python 图像绘制】图像绘制知识总结

颜色图谱 具体颜色描述autumn 红橙黄cool 青-洋红copper 黑-铜flag 红-白-蓝-黑gray 黑-白hot 黑-红-黄-白hsv hsv颜色空间, 红-黄-绿-青-蓝-洋红-红inferno 黑-红-黄jet 蓝-青-黄-红magma 黑-红-白pink 黑-粉-白plasma 绿-红-黄prism 红-黄-