HTML5 Canvas 繪制圓弧效果

在這里插入圖片描述

HTML5 Canvas 繪制圓弧效果

以下是一個使用HTML5 Canvas繪制圓弧的完整示例,你可以直接在瀏覽器中運行看到效果:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>圓弧繪制示例</title><style>body {font-family: Arial, sans-serif;display: flex;flex-direction: column;align-items: center;padding: 20px;}canvas {border: 1px solid #ccc;margin: 20px 0;box-shadow: 0 0 10px rgba(0,0,0,0.1);}.controls {margin: 20px 0;padding: 15px;background: #f5f5f5;border-radius: 5px;width: 600px;}.control-group {margin: 10px 0;}label {display: inline-block;width: 120px;}button {padding: 8px 15px;background: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;margin-right: 10px;}button:hover {background: #45a049;}</style>
</head>
<body><h1>HTML5 Canvas 圓弧繪制</h1><div class="controls"><div class="control-group"><label for="startAngle">起始角度:</label><input type="range" id="startAngle" min="0" max="360" value="0" step="1"><span id="startAngleValue"></span></div><div class="control-group"><label for="endAngle">結束角度:</label><input type="range" id="endAngle" min="0" max="360" value="90" step="1"><span id="endAngleValue">90°</span></div><div class="control-group"><label for="radius">半徑:</label><input type="range" id="radius" min="50" max="200" value="100" step="5"><span id="radiusValue">100</span></div><div class="control-group"><label for="lineWidth">線寬:</label><input type="range" id="lineWidth" min="1" max="20" value="3" step="1"><span id="lineWidthValue">3</span></div><div class="control-group"><label for="lineColor">線條顏色:</label><input type="color" id="lineColor" value="#3498db"></div><div class="control-group"><label for="counterClockwise">繪制方向:</label><input type="checkbox" id="counterClockwise"><span>逆時針</span></div><button id="drawBtn">繪制圓弧</button><button id="clearBtn">清除畫布</button></div><canvas id="arcCanvas" width="600" height="400"></canvas><script>const canvas = document.getElementById('arcCanvas');const ctx = canvas.getContext('2d');const centerX = canvas.width / 2;const centerY = canvas.height / 2;// 更新顯示值document.getElementById('startAngle').addEventListener('input', function() {document.getElementById('startAngleValue').textContent = this.value + '°';});document.getElementById('endAngle').addEventListener('input', function() {document.getElementById('endAngleValue').textContent = this.value + '°';});document.getElementById('radius').addEventListener('input', function() {document.getElementById('radiusValue').textContent = this.value;});document.getElementById('lineWidth').addEventListener('input', function() {document.getElementById('lineWidthValue').textContent = this.value;});// 繪制函數function drawArc() {const startAngle = document.getElementById('startAngle').value * Math.PI / 180;const endAngle = document.getElementById('endAngle').value * Math.PI / 180;const radius = document.getElementById('radius').value;const lineWidth = document.getElementById('lineWidth').value;const lineColor = document.getElementById('lineColor').value;const counterClockwise = document.getElementById('counterClockwise').checked;// 清除之前的繪圖ctx.clearRect(0, 0, canvas.width, canvas.height);// 繪制坐標軸ctx.beginPath();ctx.strokeStyle = '#ccc';ctx.lineWidth = 1;ctx.moveTo(centerX, 0);ctx.lineTo(centerX, canvas.height);ctx.moveTo(0, centerY);ctx.lineTo(canvas.width, centerY);ctx.stroke();// 繪制圓弧ctx.beginPath();ctx.strokeStyle = lineColor;ctx.lineWidth = lineWidth;ctx.arc(centerX, centerY, radius, startAngle, endAngle, counterClockwise);ctx.stroke();// 繪制圓心ctx.beginPath();ctx.fillStyle = '#e74c3c';ctx.arc(centerX, centerY, 5, 0, Math.PI * 2);ctx.fill();// 繪制角度標記drawAngleMarker(startAngle, radius, '#2ecc71');drawAngleMarker(endAngle, radius, '#e67e22');}// 繪制角度標記function drawAngleMarker(angle, radius, color) {const markerRadius = radius + 20;const x = centerX + Math.cos(angle) * markerRadius;const y = centerY + Math.sin(angle) * markerRadius;ctx.beginPath();ctx.strokeStyle = color;ctx.lineWidth = 2;ctx.moveTo(centerX + Math.cos(angle) * (radius - 10), centerY + Math.sin(angle) * (radius - 10));ctx.lineTo(x, y);ctx.stroke();ctx.beginPath();ctx.fillStyle = color;ctx.arc(x, y, 5, 0, Math.PI * 2);ctx.fill();}// 清除畫布function clearCanvas() {ctx.clearRect(0, 0, canvas.width, canvas.height);}// 綁定按鈕事件document.getElementById('drawBtn').addEventListener('click', drawArc);document.getElementById('clearBtn').addEventListener('click', clearCanvas);// 初始繪制drawArc();</script>
</body>
</html>

功能說明

這個HTML示例提供了以下功能:

  1. 可交互的圓弧繪制

    • 可以調整起始角度(0-360度)
    • 可以調整結束角度(0-360度)
    • 可以調整圓弧半徑(50-200像素)
  2. 樣式自定義

    • 可調整線條寬度(1-20像素)
    • 可選擇線條顏色
    • 可選擇繪制方向(順時針/逆時針)
  3. 視覺效果

    • 顯示坐標軸作為參考
    • 標記圓心位置
    • 標記起始和結束角度位置
    • 實時更新參數顯示

核心繪制代碼解析

關鍵繪制代碼是使用Canvas的arc()方法:

ctx.arc(centerX, centerY, radius, startAngle, endAngle, counterClockwise);

參數說明:

  • centerX, centerY: 圓心坐標
  • radius: 圓弧半徑
  • startAngle: 起始角度(弧度)
  • endAngle: 結束角度(弧度)
  • counterClockwise: 布爾值,true表示逆時針繪制,false表示順時針繪制

如何擴展

你可以根據需要擴展這個示例:

  1. 添加填充圓弧的功能
  2. 實現圓弧動畫效果
  3. 添加更多樣式選項(虛線、漸變等)
  4. 保存繪制的圖像到本地

這個示例可以直接復制到HTML文件中運行,無需任何額外依賴。

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

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

相關文章

智能Agent場景實戰指南 Day 18:Agent決策樹與規劃能力

【智能Agent場景實戰指南 Day 18】Agent決策樹與規劃能力 開篇 歡迎來到"智能Agent場景實戰指南"系列的第18天&#xff01;今天我們將深入探討智能Agent的核心能力之一&#xff1a;決策樹與規劃能力。在現代業務場景中&#xff0c;Agent需要具備類似人類的決策能力…

AI 編程工具 Trae 重要的升級。。。

大家好&#xff0c;我是櫻木。 今天打開 Trae &#xff0c;已經看到它進行圖標升級&#xff0c;之前的圖標&#xff0c;國際和國內版本長得非常像&#xff0c;現在做了很明顯的區分&#xff0c;這點給 Trae 團隊點個贊。 自從 Claude 使出了壓力以來&#xff0c;Cursor 鎖區&…

排序算法,咕咕咕

1.選擇排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

數據庫查詢系統——pyqt+python實現Excel內查課

一、引言 數據庫查詢系統處處存在&#xff0c;在教育信息化背景下&#xff0c;數據庫查詢技術更已深度融入教務管理場景。本系統采用輕量化架構&#xff0c;結合Excel課表&#xff0c;通過PythonPyQt5實現跨平臺桌面應用&#xff0c;以實現簡單查課效果。 二、GUI界面設計 使用…

base64魔改算法 | jsvmp日志分析并還原

前言 上一篇我們講了標準 base64 算法還原&#xff0c;為了進一步學習 base64 算法特點&#xff0c;本文將結合 jsvmp 日志&#xff0c;實戰還原出 base64 魔改算法。 為了方便大家學習&#xff0c;我將入參和上篇文章一樣&#xff0c;入參為 Hello, World!。 插樁 在js代碼中&…

vue3筆記(2)自用

目錄 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念與用法 1. 安裝與初始化 2. 創建 Store 3. 在組件中使用 Store 4. 高級用法 5、storeToRefs 二、Pinia 與 Vuex 的主要區別 三、為什么選擇 Pinia&#xff1f; 三、定義全局指令 1.封裝通用 DOM 操作&#…

大模型面試回答,介紹項目

1. 模型準備與轉換&#xff08;PC端/服務器&#xff09;你先在PC上下載或訓練好大語言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型轉換成瑞芯微NPU能用的專用格式&#xff08;.rkllm&#xff09;&#xff0c;并可選擇量化優化。把轉換好的模型文件拷…

Oracle 19.20未知BUG導致oraagent進程內存泄漏

故障現象查詢操作系統進程的使用排序&#xff0c;這里看到oraagent的物理內存達到16G&#xff0c;遠遠超過正常環境&#xff08;正常環境在19.20大概就是100M多一點&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

嘗試幾道算法題,提升python編程思維

一、跳躍游戲題目描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。示例&#xff1a;輸入&#xff1a;nums [2,3,1,1,4] → 輸出&#xff1a;True輸入…

【菜狗處理臟數據】對很多個不同時間序列數據的文件聚類—20250722

目錄 具體做法 可視化方法1&#xff1a;PCA降維 可視化方法2、TSNE降維可視化&#xff08;非線性降維&#xff0c;更適合聚類&#xff09; 可視化方法3、輪廓系數評判好壞 每個文件有很多行列的信息&#xff0c;每列是一個駕駛相關的數據&#xff0c;需要對這些文件進行聚類…

Qwen-MT:翻得快,譯得巧

我們再向大家介紹一位新朋友&#xff1a;機器翻譯模型Qwen-MT。開發者朋友們可通過Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;來直接體驗它又快又準的翻譯技能。 本次更新基于強大的 Qwen3 模型&#xff0c;進一步使用超大規模多語言和翻譯數據對模型進行訓練…

在 OceanBase 中,使用 TO_CHAR 函數 直接轉換日期格式,簡潔高效的解決方案

SQL語句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;關鍵說明&#xff1a;核心函數&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 將字符串轉為日期類型TO_CHAR(..., YYYY-MM-DD) → 格式化為 2015-03-30處理中文月份&a…

pnpm運行electronic項目報錯,npm運行正常。electronic項目打包為exe報錯

pnpm運行electronic項目報錯 使用 pnpm 運行 electronic 項目報錯&#xff0c;npm 運行正常&#xff0c;報錯內容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8?? 高級特性—— 列表生成式

文章目錄&#x1f9e0; 總結1. 基本語法2. 加篩選條件&#x1f501; 雙層循環&#xff08;全排列&#xff09;&#x1f4c2; 遍歷目錄&#x1f511; 遍歷字典&#x1f521; 轉小寫3. if 和 if...else 的區別4. 練習題&#x1f9e0; 總結 特性用法示例基礎語法[x for x in iter…

DocC的簡單使用

DocC的簡單使用 在寫3GShare中&#xff0c;由于剛開始使用MVC模式來寫東西&#xff0c;對很多東西都不是很熟&#xff0c;經常寫著寫著就忘了自己在寫什么&#xff0c;所以學了一下DocC來加快開發進度 什么是DocC 簡單來說&#xff0c;DocC就是更高級的注釋&#xff0c;雖然…

深入理解C語言快速排序與自省排序(Introsort)

排序算法是計算機科學中最基礎也是最重要的知識之一。快速排序&#xff08;Quicksort&#xff09;因其平均時間復雜度為 O(n log n) 而廣受歡迎&#xff0c;但在最壞情況下會退化到 O(n)。為了克服這一缺點&#xff0c;自省排序&#xff08;Introsort&#xff09; 應運而生&…

C#編程基礎:運算符與結構詳解

目錄 一.關系運算符 常見關系運算符 二.邏輯運算符 常見邏輯運算符 1. 邏輯與&#xff08;&& 或 and&#xff09; 2. 邏輯或&#xff08;|| 或 or&#xff09; 3. 邏輯非&#xff08;! 或 not&#xff09; 運算符優先級 三.if語句 1.c#程序的三大結構 1.順序…

嵌入式學習-土堆目標檢測(3)-day27

再學一個labelme在labelstudio環境中再pip install labelme安裝好后直接輸入 labelme之后點擊保存&#xff0c;選擇保存文件地址還有一個就是將labelme的格式轉化為yolo格式還是在labelstudio這個環境里面安裝pip install labelme2yolo

Qt OpenGL 集成:開發 3D 圖形應用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使開發者能夠在 Qt 應用中高效開發 3D 圖形應用。通過 Qt 的 OpenGL 模塊&#xff0c;可簡化 OpenGL 上下文管理、窗口渲染和跨平臺適配&#xff0c;同時結合現代 OpenGL 特性&#xff08;如著色器、頂點緩沖、紋理等&#xff09;實…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞評論查詢功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞評論查詢功能實現 視頻在線地址&#…