分享畫布繪制矩形

簡介

實現功能,在畫布上繪制矩形,移動矩形。

2b8e2dd8156e4e09ab856385ec93dbbc.png

在線演示

繪制矩形

實現代碼

<!DOCTYPE html><html><head>
<title>繪制矩形</title>
</head><body><div style="margin: 10px"><input type="color" />
</div><div style="background: #ccc;margin: 10px"><canvas></canvas>
</div><script>//獲取調色板const colorPicker=document.querySelector('input')//獲取畫布const cvs=document.querySelector('canvas')//獲取畫布上下文const ctx=cvs.getContext('2d')init()//初始化畫布function init(){const w = window.innerWidth-50,h=window.innerHeight-80//dpr保證高清屏繪制的清晰度cvs.width=w*window.devicePixelRatiocvs.height=h*window.devicePixelRatiocvs.style.width=w+'px'cvs.style.height=h+'px'}//存儲圖形數組const shapes = []//矩形類class Rectangle{constructor(color,startX,startY){//矩形顏色this.color = color//矩形起始坐標this.startX = startXthis.startY = startY//矩形結束坐標this.endX = startXthis.endY = startY}//get為訪問器屬性//矩形左上角坐標get minX(){return Math.min(this.startX,this.endX)}get minY(){return Math.min(this.startY,this.endY)}//矩形右下角坐標get maxX(){return Math.max(this.startX,this.endX)}get maxY(){return Math.max(this.startY,this.endY)}//繪制矩形draw(){//開啟路徑ctx.beginPath()//移動到左上角ctx.moveTo(this.minX*window.devicePixelRatio,this.minY*window.devicePixelRatio)//繪制直線到左上角ctx.lineTo(this.minX*window.devicePixelRatio,this.minY*window.devicePixelRatio)//繪制直線到右上角ctx.lineTo(this.maxX*window.devicePixelRatio,this.minY*window.devicePixelRatio)//繪制直線到右下角ctx.lineTo(this.maxX*window.devicePixelRatio,this.maxY*window.devicePixelRatio)//繪制直線到左下角ctx.lineTo(this.minX*window.devicePixelRatio,this.maxY*window.devicePixelRatio)//繪制直線到左上角ctx.lineTo(this.minX*window.devicePixelRatio,this.minY*window.devicePixelRatio)ctx.save()//設置填充顏色ctx.fillStyle=this.colorctx.fill()ctx.strokeStyle='#fff'ctx.lineGap='square'ctx.lineWidth=3*window.devicePixelRatioctx.stroke()ctx.restore()}}cvs.onmousedown = (e)=>{//畫布左上角坐標const bouding = cvs.getBoundingClientRect()const rect=new Rectangle(colorPicker.value,e.offsetX,e.offsetY)const shape=getShape(e.offsetX,e.offsetY)if(shape){//拖動const {startX,startY,endX,endY}=shape//鼠標的坐標const mouseX=e.offsetXconst mouseY=e.offsetYwindow.onmousemove=(e)=>{const disX=e.clientX-bouding.left-mouseXconst disY=e.clientY-bouding.top-mouseYshape.startX=startX+disXshape.startY=startY+disYshape.endX=endX+disXshape.endY=endY+disY}}else{//新增繪制矩形shapes.push(rect)window.onmousemove=(e)=>{rect.endX=e.clientX-bouding.leftrect.endY=e.clientY-bouding.top}}window.onmouseup=()=>{window.onmousemove=nullwindow.onmouseup=null}}function getShape(x,y){//畫布的繪制順序倒著來循環,for(let i=shapes.length-1;i>=0;i--){if(x>=shapes[i].minX&&x<=shapes[i].maxX&&y>=shapes[i].minY&&y<=shapes[i].maxY){return shapes[i]}}
}function draw(){//每一幀注冊繪制方法requestAnimationFrame(draw)//清空畫布ctx.clearRect(0,0,cvs.width,cvs.height)for(const shape of shapes){shape.draw()}}draw()function emptyCanvas(){shapes = []
}
function undo(){shapes.pop()
}</script></body></html>

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38227.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FastDFS部署

版本介紹 安裝fastdfs共需要倆個安裝包 fastdfs-5.05.tar.gz libfastcommon-1.0.7.tar.gz編譯安裝 libfastcommon tar -xvf libfastcommon-1.0.7.tar.gz cd libfastcommon-1.0.7 make.sh make.sh install 3. 設置軟鏈接 libfastcommon.so默認安裝到了/usr/lib64/libfastcommon.…

探索AI視覺革新:深入目標檢測算法

一、目標檢測算法概述 1. 什么是目標檢測&#xff1f; 目標檢測是計算機視覺任務的一部分&#xff0c;其目標是在圖像或視頻中識別和定位特定物體的位置和類別。與簡單的圖像分類任務不同&#xff0c;目標檢測要求算法能夠準確地標記出圖像中每個物體的位置&#xff0c;通常用…

5-linux文件路徑與文件目錄系統

目錄 ①文件路徑 目錄跳轉 絕對路徑與相對路徑 ②文件目錄系統 目錄系統組成 目錄命名規則 命令補充 ls命令補充 file filename查看文件類型 less查看文本文件 ①文件路徑 目錄跳轉 pwd:查看當前工作目錄。 cd:改變目錄。 ls:列出目錄內容。 [root########## ~]# …

某易六月實習筆試

第一題 下面代碼需要更改的地方已指出。 解題思路 模擬題&#xff0c;用雙指針記錄雙方當前式神&#xff0c;再記錄一下當前誰先手&#xff0c;直到有一方指針越界。 把下面代碼now1變為now(now1)%2就行。 第二題 解題思路 01背包變種&#xff0c;只是背包的容量變為多個維度…

CLAY或許是今年最值得期待的3D生成模型,號稱質量最好+布線最好+支持的輸入模態最多+支持材質生成。

CLAY是一種大規模可控生成模型,用于創建高質量的3D資產,它結合了多分辨率變分自編碼器和簡化的潛在擴散變壓器,通過多種輸入形式生成詳細的3D幾何結構和物理渲染材質。 CLAY或許是今年最值得期待的3D生成模型,號稱質量最好+布線最好+支持的輸入模態最多+支持材質生成。 相…

vue2+three.js實現火焰效果

// 火焰getFireMaterial() {const vertex ${ShaderChunk.logdepthbuf_pars_vertex} bool isPerspectiveMatrix(mat4) {return true; } varying vec4 m_pos; varying vec2 vUv; varying vec3 _flame; uniform float uTime; vec2 hash( vec2 p ){p vec2( dot(p,vec2(150.1,350…

EDA期末復習——基礎知識

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

The dependencies of some of the beans in the application context form a cycle

The dependencies of some of the beans in the application context form a cycle: 出現這種問題&#xff0c;如果你用其他方法怎么都處理不掉&#xff0c;可以使用最后的方法&#xff1a; 解決方案&#xff1a; 在配置文件增添一行配置即可&#xff1a; properties 配置文件 …

Spring Boot中的版本兼容性處理

Spring Boot中的版本兼容性處理 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來聊聊Spring Boot中的版本兼容性處理。Spring Boot的版本更新頻繁&…

Redis的使用

1 Redis屬于非關系型數據庫&#xff1a; 優勢&#xff1a;讀的速度快110000次/s 寫的速度81000次/s 支持持久化存儲 2 Redis的相關執行命令&#xff1a; 2-1 打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis 運行&#xff1a; redis-server.exe redis.windows.conf …

SaaS 出海:Databend Cloud 的定位與實踐

提到 “SaaS 出海”這個詞大家肯定并不陌生&#xff0c;SaaS 企業將業務拓展到海外市場已經成為許多 SaaS 公司的重要戰略方向。隨著企業對于靈活性、可擴展性以及成本效益需求的不斷增長&#xff0c; SaaS 模式提供了理想的解決方案。對于尋求出海機會的 SaaS 企業來說&#x…

神州信息與國科量子聯合進軍量子網絡應用服務市場(中國軍民兩用通信技術展覽會)

量子通信&#xff0c;智聯未來 —— 神州信息與國科量子共啟安全通信新紀元 在信息技術飛速發展的今天&#xff0c;信息安全已成為全球關注的焦點。神州數碼信息服務股份有限公司&#xff08;神州信息&#xff09;與國科量子通信網絡有限公司&#xff08;國科量子&#xff09;…

【地理庫 Turf.js】

非常全面的地理庫 &#xff0c; 這里枚舉一些比較常用&#xff0c;重點的功能&#xff0c; 重點功能 提供地理相關的類&#xff1a;包括點&#xff0c;線&#xff0c;面等類。 測量功能&#xff1a;點到線段的距離&#xff0c;點和線的關系等。 判斷功能&#xff1a; 點是否在…

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;這里這個漏洞相對來說審計起來不是特別難&#xff0c;但是對于初學者還是有點挑戰性的&#xff0c;從zkaq web課過來的小伙伴想挑戰一下自己代碼審計能力的話&#xff0c;可以直接跳到最后下載源碼&#xff0c;聶風…

Python基礎小知識問答系列-隨機數相關

1. 問題&#xff1a; 如何生成x-y之間的隨機整數&#xff1f; 如何生成0-1之間的隨機浮點數&#xff1f; 如何生成x-y之間的隨機浮點數&#xff1f; 如何從列表中隨機獲取一個元素&#xff1f; 如何從列表中隨機獲取多個元素&#xff1f; 如…

代碼隨想錄訓練營第二十四天 78子集 90子集II

第一題&#xff1a; 原題鏈接&#xff1a;78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 本題很簡單&#xff0c;就是在每次遍歷的地方都要搜集結果。 終止條件&#xff1a;當前要收集的起始位置已經大于等于數組的大小的時候證明已經搜集到完成了。 …

Foxit Reader(福昕閱讀器)詳細安裝和使用教程

第一部分&#xff1a;Foxit Reader簡介和基本信息 1.1 什么是Foxit Reader&#xff1f; Foxit Reader&#xff08;福昕閱讀器&#xff09;是一款功能強大的PDF閱讀和編輯軟件&#xff0c;以其快速、輕巧和豐富的功能而聞名。它不僅支持常規的PDF閱讀功能&#xff0c;還提供了…

LeetCode刷題之HOT100之最大正方形

今天下起了暴雨&#xff0c;本以為下午就可以結束的答辯又因為老師開會被推遲。研三的學長走了后我們開始了0元購&#xff0c;收獲頗豐哈哈&#xff0c;做個題 1、題目描述 2、算法分析 給定一個矩形&#xff0c;要求最大正方形。第一次見這種題目哈 2024 6/30 嘿嘿&#xff…

實體零售連鎖企業如何通過物流接口實現數智化轉型升級?

在電子商務浪潮的持續沖擊下&#xff0c;傳統的實體零售行業面臨著巨大的挑戰。為了在線上線下融合的新零售時代保持競爭力&#xff0c;眾多實體零售企業積極尋求數字化轉型的突破。 某中國零售連鎖百強企業近年來致力于打造自有品牌的線上銷售體系&#xff0c;自2021年8月起接…

深入解析 gRPC 的重連機制

目錄 什么是 gRPC 重連機制 gRPC 重連策略 gRPC 重連參數 gRPC 重連機制原理 重連機制的注意事項 小結 gRPC 的重連機制是確保客戶端在連接斷開后能夠自動重新連接到服務器的一種機制&#xff0c;對于分布式系統和微服務架構中的高可用性和容錯性至關重要。 什么是 gRPC…