vue+微信小程序 五角星

在這里插入圖片描述
說明:這個是先畫出一個72度菱形,長中長線和短中長線按照一定比例,然后把菱形分層十份,最后再把菱形進行旋轉形成五角星,最后顯示標簽,因為一直對不上所以對標簽做了點操作

<template><view class="container"><canvas canvas-id="diamondCanvas" class="canvas":style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"></canvas></view>
</template><script lang="ts">
import { Vue, Component, Prop, Watch } from 'vue-property-decorator';interface DiamondItem {name: string;value: number;
}@Component
export default class DiamondCanvas extends Vue {private canvasWidth: number = 350;private canvasHeight: number = 350;private scale: number = 40;private longAxis: number = 3;private shortAxis: number = 1.5;private distance: number = 1;private colors: string[] = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF','#FF9F40', '#8AC249', '#EA5F89', '#0D98BA', '#D27D46'];// 新增:定義橙紅色邊框顏色private borderColor: string = '#FF6B35'; // 橙紅色private borderWidth: number = 3; // 線條粗細(默認3px,可按需調整)@Prop({type: Array,default: () => [{ name: '指標1', value: 5 },{ name: '指標2', value: 7 },{ name: '指標3', value: 6 },{ name: '指標4', value: 8 },{ name: '指標5', value: 4 }],validator: (items: DiamondItem[]) =>items.length === 5 && items.every(item =>item.value >= 0 && item.value <= 10 && Number.isInteger(item.value))}) readonly diamondData!: DiamondItem[];mounted() {this.drawDiamondsWithLabels();}@Watch('diamondData', { deep: true })onDiamondDataChange() {this.drawDiamondsWithLabels();}private drawDiamondsWithLabels() {const ctx = wx.createCanvasContext('diamondCanvas', this);ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);const centerX = this.canvasWidth / 2;const centerY = this.canvasHeight / 2;const pivotY = (this.longAxis / 2) * this.scale;const labelRadius = this.scale * 3.2;const initialRotation = -36 * Math.PI / 180;const angleInterval = 72 * Math.PI / 180;for (let i = 0; i < 5; i++) {const diamondAngle = initialRotation + (i * angleInterval);ctx.save();ctx.translate(centerX, centerY);ctx.rotate(diamondAngle);ctx.translate(0, pivotY);this.drawSingleDiamond(ctx, this.diamondData[i].value, this.colors[i]);ctx.restore();const prevIndex = (i - 1 + 5) % 5;const labelAngle = initialRotation + (prevIndex * angleInterval) + Math.PI;ctx.save();ctx.translate(centerX, centerY);const labelX = Math.cos(labelAngle) * labelRadius;const labelY = Math.sin(labelAngle) * labelRadius;ctx.setFontSize(12);ctx.setFillStyle('#333333');ctx.setTextAlign('center');ctx.setTextBaseline('middle');ctx.fillText(this.diamondData[i].name, labelX, labelY - 10);ctx.setFontSize(14);ctx.setFillStyle(this.colors[i]);ctx.fillText(this.diamondData[i].value.toString(), labelX, labelY + 10);ctx.restore();}ctx.draw();}private drawSingleDiamond(ctx: any, value: number, color: string) {const top = { x: 0, y: this.longAxis / 2 };const bottom = { x: 0, y: -this.longAxis / 2 };const right = { x: this.shortAxis / 2, y: top.y - this.distance };const left = { x: -this.shortAxis / 2, y: top.y - this.distance };// 繪制邊框 - 使用橙紅色ctx.beginPath();ctx.moveTo(top.x * this.scale, -top.y * this.scale);ctx.lineTo(right.x * this.scale, -right.y * this.scale);ctx.lineTo(bottom.x * this.scale, -bottom.y * this.scale);ctx.lineTo(left.x * this.scale, -left.y * this.scale);ctx.closePath();ctx.setStrokeStyle(this.borderColor); // 關鍵修改:使用橙紅色邊框ctx.setLineWidth(this.borderWidth); // 關鍵:設置線條粗細ctx.stroke();// 分段計算(保持不變)const h1 = top.y - right.y;const h2 = right.y - bottom.y;const totalSegments = 10;const ratio = h1 / (h1 + h2);const n1 = Math.max(1, Math.round(totalSegments * ratio));const n2 = totalSegments - n1;const segmentH1 = h1 / n1;const segmentH2 = h2 / n2;// 上半部分繪制(修正邊緣銜接)for (let i = 0; i < n1; i++) {// 關鍵修正:讓當前段的y2與下一段的y1完全一致(避免縫隙)const y1 = top.y - i * segmentH1;const y2 = top.y - (i + 1) * segmentH1; // 精確計算,無偏差const width1 = this.shortAxis * ((top.y - y1) / h1);const width2 = this.shortAxis * ((top.y - y2) / h1);const segmentColor = i < value ? color : '#FFFFFF';// 繪制時增加0.5px偏移,抵消抗鋸齒導致的白邊this.drawDiamondSegment(ctx, y1, y2, width1, width2, segmentColor);}// 下半部分繪制(修正邊緣銜接)for (let i = 0; i < n2; i++) {// 關鍵修正:讓當前段的y2與下一段的y1完全一致const y1 = right.y - i * segmentH2;const y2 = right.y - (i + 1) * segmentH2; // 精確計算,無偏差const width1 = this.shortAxis * ((y1 - bottom.y) / h2);const width2 = this.shortAxis * ((y2 - bottom.y) / h2);const segmentColor = (n1 + i) < value ? color : '#FFFFFF';// 繪制時增加0.5px偏移,抵消抗鋸齒導致的白邊this.drawDiamondSegment(ctx, y1, y2, width1, width2, segmentColor);}}// 繪制單個顏色塊(增加偏移抵消白邊)private drawDiamondSegment(ctx: any, y1: number, y2: number, width1: number, width2: number, color: string) {ctx.beginPath();// 關鍵修正:y坐標增加0.5px偏移,避免Canvas抗鋸齒產生的白邊const offset = 0.5;ctx.moveTo(-width1 / 2 * this.scale, -y1 * this.scale + offset);ctx.lineTo(width1 / 2 * this.scale, -y1 * this.scale + offset);ctx.lineTo(width2 / 2 * this.scale, -y2 * this.scale + offset);ctx.lineTo(-width2 / 2 * this.scale, -y2 * this.scale + offset);ctx.closePath();ctx.setFillStyle(color);ctx.fill();// 確保沒有隱藏的線條繪制(如果有stroke()會導致邊緣線,這里保持注釋)// ctx.stroke(); // 徹底移除線條繪制,避免產生邊界線}
}
</script><style scoped>
.container {display: flex;justify-content: center;align-items: center;width: 100%;height: 100vh;
}.canvas {border: 1px solid #eee;background-color: #f9f9f9;
}
</style>

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

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

相關文章

Prometheus + Grafana 深度玩法:從零到智能化監控體系

0. 寫在前面&#xff1a;為什么你需要“神器”而非“常用命令老楊折騰監控系統可是有年頭了&#xff0c;最早還用過 Cacti、Zabbix&#xff0c;那會兒做個儀表盤都得像雕花一樣慢慢刻。后來 Prometheus 出來之后&#xff0c;我的第一反應是&#xff1a;這玩意兒的時間序列和標簽…

YOLO、DarkNet和深度學習如何讓自動駕駛看得清?

【導讀】 本文提出 DarkNet-YOLO 工業級實踐框架&#xff0c;通過引入 殘差優化結構 與 多尺度特征融合技術&#xff0c;在保持實時檢測精度同時顯著提升復雜場景適應性。 目錄 一、目標檢測的進化之路&#xff1a;從“兩步走”到“一眼定乾坤” YOLO的核心思想&#xff1a…

使用 HTML5 Canvas 打造炫酷的數字時鐘動畫

在 Web 開發中&#xff0c;HTML5 的 canvas 元素為我們帶來了強大的繪圖能力&#xff0c;結合 JavaScript&#xff0c;可以實現各種酷炫的效果。今天&#xff0c;我們將深入剖析一段經典的 彩色數字時鐘動畫 代碼&#xff0c;并理解它是如何通過物理模擬實現數字切換時的炫酷粒…

XCZU6CG-2FFVC900I Xilinx FPGA AMD ZynqUltraScale+ MPSoC

XCZU6CG-2FFVC900I Xilinx FPGA&#xff08; AMD&#xff09;Zynq UltraScale MPSoC 。在處理系統&#xff08;PS&#xff09;方面&#xff0c;XCZU6CG 系列通常集成了 ARM Cortex-A53 應用核與 Cortex-R5 實時核的組合&#xff08;典型為 A53 多核 R5 雙核組合&#xff09;&…

Navicat 詢問 AI | 優化 SQL 查詢

近期&#xff0c;我們發布了 Navicat 17.3 版本。這一版本實現了全方位升級&#xff0c;包括對 AI 功能大升級、支持達夢、金倉、瀚高、支持阿里通義千問等 AI 大模型&#xff0c;支持凝思 OS 以及多項 UI 改進。今天&#xff0c;我們將深入介紹 Navicat AI 功能之“詢問 AI ”…

4.6 Vue 3 中的模板引用 (Template Refs)

在 Vue 3 中&#xff0c;ref 是一個核心的響應式 API&#xff0c;但它在模板中還有另一個非常重要的用途&#xff1a;獲取對 DOM 元素或子組件實例的直接引用。這就是我們所說的“模板引用”。核心概念目的&#xff1a;讓你在父組件中能夠直接訪問并操作特定的 DOM 元素或子組件…

模式匹配自動機全面理論分析

模式匹配是什么 模式匹配是計算機科學中一個基礎且重要的問題&#xff0c;廣泛應用于文本編輯、信息檢索、網絡安全、生物信息學等多個領域。簡單來說&#xff0c;模式匹配就是在一個主文本中查找一個或多個特定模式串的出現位置。隨著計算機處理能力的提升和數據規模的擴大&am…

AI 搜索時代:引領變革,重塑您的 SEO 戰略

隨著谷歌轉向人工智能驅動的答案&#xff0c;使用以關鍵字和反向鏈接為中心的過時和傳統的 SEO 策略不再起到任何作用。 由于 Google AI Overviews 和零點擊搜索的興起&#xff0c;自然點擊量正在下降&#xff0c;用戶無需點擊任何網站即可直接在 Google 的搜索結果頁面上獲得答…

【網站深入seo方法】

目錄 ①對于更成熟的網站&#xff0c;簡單的index.html的入口文件的seo已經無法滿足&#xff0c;需要在商品詳情不同商品被搜索時賦予不同的title和description。 ②通過設置站點所有頁面都新增Canonical標簽&#xff0c;指定規范鏈接地址給谷歌并規避聯盟的重復內容頁面。 ③…

ROS move_base 混合功能導航 RealSense D435i + 3D 點云地圖 + 樓層切換 + 路徑錄制 + 路徑規劃

Mixed-Navigation 這個博客也是記錄我們的一個開源項目&#xff0c;其作用是混合功能導航。由于現有的 Fast-Lio-Localization 只實現了定位功能&#xff0c;但對于路徑規劃和樓層切換沒有具體實現&#xff0c;因此我們開出了這個倉庫作為參考。該倉庫的核心功能如下&#xff…

初識c語言————宏定義和調用

目錄&#xff1a;一.不帶參數的宏二.帶參數宏一.不帶參數的宏不帶參數的宏是指用#define指令定義的簡單文本替換規則&#xff0c;它沒有參數列表&#xff0c;直接替換標識符為相應的文本其一般形式為&#xff1a;#define 宏名 文本例如&#xff1a;#define pi 3.14這個代…

數據結構:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)

目錄 重要的術語澄清 完美二叉樹 (Perfect Binary Tree) 完全二叉樹 (Complete Binary Tree) 大比拼 (Comparison) 相互關系的第一性推導 我們來深入探討兩種在算法中非常重要的、具有特定“形狀”的二叉樹&#xff1a;滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Compl…

OpenJDK 17的C1和C2編譯器實現中,方法返回前插入安全點(Safepoint Poll)的機制

OpenJDK 17 JIT編譯器堆棧分析-CSDN博客 在OpenJDK 17的C1和C2編譯器實現中&#xff0c;方法返回前插入安全點&#xff08;Safepoint Poll&#xff09;的機制主要涉及以下關鍵步驟&#xff0c;結合源代碼進行分析&#xff1a; 1. 安全點輪詢樁&#xff08;Safepoint Poll Stu…

【論文筆記】STORYWRITER: A Multi-Agent Framework for Long Story Generation

論文信息 論文標題&#xff1a;StoryWriter: A Multi-Agent Framework for Long Story Generation 論文作者&#xff1a;Haotian Xia, Hao Peng et al. (Tsinghua University) 論文鏈接&#xff1a;https://arxiv.org/abs/2506.16445 代碼鏈接&#xff1a;https://github.com/…

Cohere 開發企業級大型語言模型(LLM)

Cohere 是一家專注于開發企業級大型語言模型&#xff08;LLM&#xff09;的公司。該公司推出了一系列名為 “Command” 的模型&#xff0c;其中最強大的 “Command A” 于今年三月首次亮相 Cohere 還提供嵌入模型&#xff0c;這是一種將文件轉化為神經網絡可以理解的緊湊數值形…

Rust Web框架Axum學習指南之入門初體驗

一、準備階段 確保已經安裝 rust&#xff0c;開發環境使用 vscode 或者 rustrover 都可以。接著就可以創建項目&#xff0c;通過編輯器創建或者命令行創建都可以&#xff1a; cargo new axum-admin二、添加依賴 添加依賴如下&#xff1a; [package] name "axum-admin&quo…

autofit.js: 自動調整HTML元素大小的JavaScript庫

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

RocketMQ 命名服務器(NameServer)詳解

&#x1f680; RocketMQ 命名服務器&#xff08;NameServer&#xff09;詳解 NameServer 是 RocketMQ 架構中的輕量級路由發現服務&#xff0c;它不參與消息的收發&#xff0c;但承擔著整個集群的“地址簿”和“導航系統”的關鍵角色。 理解 NameServer 的設計與工作原理&#…

代碼隨想錄算法訓練營四十三天|圖論part01

深度優先搜索&#xff08;dfs&#xff09;理論基礎 dfs就是可一個方向去搜直到盡頭再換方向&#xff0c;換方向的過程就涉及到了回溯。 代碼框架 因為dfs搜索可一個方向&#xff0c;并需要回溯&#xff0c;所以用遞歸的方式來實現是最方便的。 先來回顧一下回溯法的代碼框架…

飛算JavaAI金融風控場景實踐:從實時監測到智能決策的全鏈路安全防護

目錄一、金融風控核心場景的技術突破1.1 實時交易風險監測系統1.1.1 高并發交易數據處理1.2 智能反欺詐系統架構1.2.1 多維度欺詐風險識別1.3 動態風控規則引擎1.3.1 風控規則動態管理二、金融風控系統效能升級實踐2.1 風控模型迭代加速機制2.1.1 自動化特征工程結語&#xff1…