绘制Canvas坐标系

2024-06-21 06:52
文章标签 canvas 坐标系 绘制

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

知识要点

canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸。左上角坐标为x=0,y=0的点称作原点。在默认坐标系中,每一个点的坐标都是直接映射到一个CSS像素上。

代码

对于canvas的初学者,我们可以在绘制坐标系来辅助canvas设计,以下是一段示例代码:

HTML

<div id="coordinates">X: 0, Y: 0</div>
<canvas id="canvas" width="800" height="600" style="border:1px solid #000;"></canvas>

JavaScript

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const coordinatesDiv = document.getElementById('coordinates');// 绘制箭头
function drawArrow(fromX, fromY, toX, toY, label) {const headlen = 10; // 箭头长度const angle = Math.atan2(toY - fromY, toX - fromX);ctx.beginPath();ctx.moveTo(fromX, fromY);ctx.lineTo(toX, toY);ctx.lineTo(toX - headlen * Math.cos(angle - Math.PI / 6), toY - headlen * Math.sin(angle - Math.PI / 6));ctx.moveTo(toX, toY);ctx.lineTo(toX - headlen * Math.cos(angle + Math.PI / 6), toY - headlen * Math.sin(angle + Math.PI / 6));ctx.stroke();ctx.font = "16px Arial";ctx.fillText(label, toX + (label === 'X' ? -20 : 10), toY + (label === 'Y' ? -10 : 20));
}// 绘制坐标轴
function drawAxes() {const width = canvas.width;const height = canvas.height;// X轴ctx.beginPath();ctx.moveTo(0, 0);ctx.lineTo(width, 0);ctx.strokeStyle = 'black';ctx.lineWidth = 2;ctx.stroke();drawArrow(0, 0, width, 0, 'X');// Y轴ctx.beginPath();ctx.moveTo(0, 0);ctx.lineTo(0, height);ctx.strokeStyle = 'black';ctx.lineWidth = 2;ctx.stroke();drawArrow(0, 0, 0, height, 'Y');
}// 绘制坐标刻度
function drawTicks() {const width = canvas.width;const height = canvas.height;// X轴刻度for (let i = 0; i < width; i += 50) {ctx.beginPath();ctx.moveTo(i, -5);ctx.lineTo(i, 5);ctx.strokeStyle = 'black';ctx.lineWidth = 1;ctx.fillText(i, i - 8, 20); // X轴刻度数值ctx.stroke();}// Y轴刻度for (let i = 0; i < height; i += 50) {ctx.beginPath();ctx.moveTo(- 5, i);ctx.lineTo(+ 5, i);ctx.strokeStyle = 'black';ctx.lineWidth = 1;ctx.fillText(i, 8, i + 8); // Y轴刻度数值ctx.stroke();}
}// 绘制坐标系
function drawCoordinateSystem() {drawAxes();drawTicks();
}drawCoordinateSystem();// 更新坐标显示
function updateCoordinatesDisplay(x, y) {coordinatesDiv.textContent = `X: ${x}, Y: ${y}`;
}// 处理鼠标移动事件
canvas.addEventListener('mousemove', (event) => {const rect = canvas.getBoundingClientRect();const x = event.clientX - rect.left;const y = event.clientY - rect.top;updateCoordinatesDisplay(x, y);
});// 以下代码是实例,你可以写自己的代码
function drawHouse() {// Set line widthctx.lineWidth = 10;// Wallctx.strokeRect(75, 140, 150, 110);// Doorctx.fillRect(130, 190, 45, 65);// Roofctx.beginPath();ctx.moveTo(50, 140);ctx.lineTo(150, 60);ctx.lineTo(250, 140);ctx.closePath();ctx.stroke();
}
drawHouse()

完整的示例请查看Codepen

效果

在这里插入图片描述

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



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

相关文章

以canvas方式绘制粒子背景效果,感觉还可以

这个是看到项目中别人写好的,感觉这种写法效果还可以,就存留记录下 就是这种的背景效果。如果想改背景颜色可以通过canvas.js文件中的fillStyle值改。 附上demo下载地址。 https://download.csdn.net/download/u012138137/11249872

XMG 绘制形状

1. 除非是绘制曲线直接使用原生的。如果绘制形状直接使用UIBezerPath  2. 命名原则,类方法以类名开头 UIBezierPath bezierPathWithRect 3.圆角半径 画圆的大小 以每个顶点为圆心。给定的半径为半径画一个1/4圆。把周边的给切掉 4.只有封闭的形状调用这个方法才有用 [path fill] 5. stroke 描边一下

OSG数学基础:坐标系变换

三维实体对象需要经过一系列的坐标变换才能正确、真实地显示在屏幕上。在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的。坐标系变换通常包括:世界坐标系-物体坐标系变换、物体坐标系-世界坐标系变换和世界坐标系-屏幕坐标系变换(一个二维平面坐标系,即显示器平面,是非常标准的笛卡尔坐标系的第一象限区域)。 世界坐标系-物体坐标系变换 它描述的问题主要是关于物体本身的

CesiumJS【Basic】- #008 通过canvas绘制billboard

文章目录 通过canvas绘制billboard1 目标2 实现 通过canvas绘制billboard 1 目标 通过canvas绘制billboard 2 实现 /** @Author: alan.lau* @Date: 2024-06-16 11:15:48* @LastEditTime: 2024-06-16 11:43:02* @LastEditors: al

Android自定义系列——4.Canvas操作

1.画布操作 为什么要有画布操作? 画布操作可以帮助我们用更加容易理解的方式制作图形。 ⑴位移(translate) translate是坐标系的移动,可以为图形绘制选择一个合适的坐标系。 请注意,位移是基于当前位置移动,而不是每次基于屏幕左上角的(0,0)点移动,如下: // 省略了创建画笔的代码// 在坐标原点绘制一个黑色圆形mPaint.setColor(Color.BLACK);ca

使用AGG里面的clip_box函数裁剪画布, 绘制裁剪后的图形

// 矩形裁剪图片, 透明void agg_testImageClipbox_rgba32(unsigned char* buffer, unsigned int width, unsigned int height){// ========= 创建渲染缓冲区 =========agg::rendering_buffer rbuf;// BMP是上下倒置的,为了和GDI习惯相同,最后一个参数是

Canvas绘制图片和区域

如何使用Canvas在图片上绘制区域? 一. 首先,我们需要初始化三个canvas画布(初始化Canvas)   initCanvas() {// 初始化canvas画布let canvasWrap = document.getElementsByClassName("canvas-wrap");this.wrapWidth = canvasWrap[0].clientWidth;thi

「JCVI教程」如何绘制CNS级别的共线性图(中)

在「JCVI教程」编码序列或蛋白序列运行共线性分析流程(上)还是有一个尴尬的事情,就是只用到两个物种,不能展示出JCVI画图的方便之处,因此这里参考https://github.com/tanghaibao/jcvi/wiki/MCscan-(Python-version)的分析,只不过画图部分拓展下思路。 首先要运行如下代码获取目的数据 python -m jcvi.apps.fetch p

「JCVI教程」如何绘制CNS级别的共线性图(上)

本教程借鉴https://github.com/tanghaibao/jcvi/wiki/MCscan-(Python-version). 我们先从http://plants.ensembl.org/index.html选择两个物种做分析, 这里选择的就是前两个物种,也就是拟南芥和水稻(得亏没有小麦和玉米) 选择物种 我们下载它的GFF文件,cdna序列和蛋白序列 #A

「JCVI教程」如何基于物种的CDS的blast结果绘制点图(dotplot)

这是唐海宝老师GitHub上的JCVI工具的非官方说明书。 该工具集的功能非常多,但是教程资料目前看起来并不多,因此为了能让更多人用上那么好用的工具,我就一边探索,一边写教程 这一篇文章教大家如何利用JCVI里面的工具绘制点图,展现两个物种之间的共线性关系。 在分析之前,你需要从PhytozomeV11 下载A.thaliana和Alyrata的CDS序列,保证文件夹里有如下内容 Al