使用 ECharts GL 實現交互式 3D 餅圖:技術解析與實踐

一、效果概覽

在這里插入圖片描述

本文基于 Vue 3 和 ECharts GL,實現了一個具有以下特性的 3D 餅圖:

  • 立體視覺效果:通過參數方程構建 3D 扇形與底座
  • 動態交互:支持點擊選中(位移效果)和懸停高亮(放大效果)
  • 混合渲染:結合 3D 曲面與 2D 餅圖標簽
  • 風格化設計:暗色背景搭配網格紋理,增強科技感

二、核心技術實現

1. 環境準備

import { ref, onMounted } from "vue";
import * as echarts from "echarts";
import "echarts-gl"; // 引入 3D 擴展

2. 參數方程生成器

核心函數 getParametricEquation 通過數學公式動態構建 3D 曲面:

function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {// 計算弧度范圍const startRadian = startRatio * Math.PI * 2;const endRadian = endRatio * Math.PI * 2;// 動態參數控制const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;const hoverRate = isHovered ? 1.5 : 1;return {u: { min: -Math.PI, max: Math.PI * 3 },v: { min: 0, max: Math.PI * 2 },x: (u, v) => offsetX + Math.cos(u) * (1 + Math.cos(v)*k) * hoverRate,y: (u, v) => offsetY + Math.sin(u) * (1 + Math.cos(v)*k) * hoverRate,z: (u, v) => (Math.sin(v) > 0 ? h*0.1 : -1)};
}
  • u/v:定義曲面參數范圍
  • hoverRate:懸停時放大系數(1.5倍)
  • offsetX/Y:選中時的位移偏移

3. 復合圖表配置

通過 getPie3D 生成多層結構:

function getPie3D(pieData, internalDiameterRatio) {const series = [];// 生成數據扇形pieData.forEach(item => {series.push({type: "surface",parametric: true,itemStyle: { color: item.itemStyle.color },parametricEquation: getParametricEquation(...)});});// 添加紅色底座series.push({parametricEquation: {x: (u, v) => Math.sin(v)*0.6*Math.sin(u),z: () => Math.cos(v) > 0 ? 0.8 : -0.2},itemStyle: { color: "#2c68ac" }});// 透明支撐環(用于鼠標事件)series.push({itemStyle: { opacity: 0 },parametricEquation: {...}});return { series, grid3D: {...}, tooltip: {...} };
}
  • 底座設計:通過兩個紅色圓柱增強立體層次感
  • 透明環:解決 3D 曲面鼠標事件穿透問題

4. 交互事件處理

// 點擊選中
myChart.on("click", (params) => {const target = option.series[params.seriesIndex];target.parametricEquation = getParametricEquation(..., true); // 觸發位移
});// 懸停高亮
myChart.on("mouseover", (params) => {option.series[params.seriesIndex].parametricEquation = getParametricEquation(..., hoverBarHeight); // 修改高度
});// 全局恢復
myChart.on("globalout", () => {series.forEach(item => item.parametricEquation.z = defaultBarHeight);
});

三、樣式優化技巧

1. 背景網格

.chart-container::before {background-image: linear-gradient(#0e2a47 1px, transparent 1px),linear-gradient(90deg, #0e2a47 1px, transparent 1px);background-size: 20px 20px;
}

2. 標簽融合

{type: "pie",label: {formatter: "{b}\n{@percent}%",position: "outside",opacity: 0 // 通過 2D 餅圖實現標簽},itemStyle: { opacity: 0 } // 隱藏 2D 圖形
}

四、最佳實踐建議

  1. 性能優化

    • 調整 u/v.step 值平衡渲染質量與性能
    • 禁用非必要特效(如 postEffect)
  2. 擴展方向

    • 增加 autoRotate 實現自動旋轉
    • 結合 dataset 實現動態數據更新
  3. 調試技巧

    • 臨時設置 wireframe: { show: true } 觀察曲面結構
    • 使用 viewControl 調整初始視角

五、完整代碼

<template><div class="chart-container"><div ref="chartRef" class="chart"></div></div>
</template><script setup>
import { ref, onMounted } from "vue";
import * as echarts from "echarts";
import "echarts-gl";const chartRef = ref(null);
// 默認柱狀圖高度
const defaultBarHeight = 30;
// 鼠標滑過高度
const hoverBarHeight = 40;onMounted(() => {const chartDom = chartRef.value;const myChart = echarts.init(chartDom);/*** 生成3D扇形的曲面參數方程* @param {number} startRatio - 起始比例 (0~1)* @param {number} endRatio - 結束比例 (0~1)* @param {boolean} isSelected - 是否選中狀態* @param {boolean} isHovered - 是否懸停狀態* @param {number} k - 輔助參數,控制扇形厚度* @param {number} h - 柱狀圖高度* @returns {Object} 曲面參數方程,包含u/v范圍和x/y/z坐標函數*/function getParametricEquation(startRatio,endRatio,isSelected,isHovered,k,h) {// 計算中間比例和弧度值// 將比例(0~1)轉換為弧度值(0~2π),用于三角函數計算let midRatio = (startRatio + endRatio) / 2;let startRadian = startRatio * Math.PI * 2; // 起始弧度let endRadian = endRatio * Math.PI * 2;    // 結束弧度let midRadian = midRatio * Math.PI * 2;    // 中間弧度// 如果只有一個扇形,則不實現選中效果。if (startRatio === 0 && endRatio === 1) {isSelected = false;}// 通過扇形內徑/外徑的值,換算出輔助參數 k(默認值 1/3)k = typeof k !== "undefined" ? k : 1 / 3;// 計算選中效果分別在 x/y 軸方向上的位移// 使用三角函數計算位移方向,0.1為位移幅度系數// 未選中狀態位移為0,選中狀態根據中間弧度計算位移方向let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;// 計算高亮效果的放大比例// hoverRate=0.5表示懸停時放大50%,通過參數方程中的乘法實現let hoverRate = 0.5;// 返回曲面參數方程return {u: {min: -Math.PI,max: Math.PI * 3,step: Math.PI / 32,},v: {min: 0,max: Math.PI * 2,step: Math.PI / 20,},// x坐標函數:根據u/v參數計算曲面x坐標// 公式分解:// 1. Math.cos(u) - 基礎圓形路徑// 2. (1 + Math.cos(v) * k) - 控制扇形厚度// 3. hoverRate - 懸停放大系數// 4. offsetX - 選中位移x: function (u, v) {if (u < startRadian) {return (offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate);}if (u > endRadian) {return (offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate);}return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;},y: function (u, v) {if (u < startRadian) {return (offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate);}if (u > endRadian) {return (offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate);}return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;},z: function (u, v) {if (u < -Math.PI * 0.5) {return Math.sin(u);}if (u > Math.PI * 2.5) {return Math.sin(u) * h * 0.1;}return (Math.sin(v) > 0 ? 1 * h * 0.1 : -1) + 1;},};}/*** 生成3D餅圖的完整配置項* @param {Array} pieData - 餅圖數據數組* @param {number} internalDiameterRatio - 內徑/外徑比例* @returns {Object} ECharts配置項,包含series和legend等*/function getPie3D(pieData, internalDiameterRatio) {let series = [];let sumValue = 0;let startValue = 0;let endValue = 0;let legendData = [];let k =typeof internalDiameterRatio !== "undefined"? (1 - internalDiameterRatio) / (1 + internalDiameterRatio): 1 / 3;// 為每一個餅圖數據,生成一個 series-surface 配置for (let i = 0; i < pieData.length; i++) {sumValue += pieData[i].value;let seriesItem = {name:typeof pieData[i].name === "undefined"? `series${i}`: pieData[i].name,type: "surface",parametric: true,wireframe: {show: false,},pieData: pieData[i],pieStatus: {selected: false,hovered: false,k: k,},};if (typeof pieData[i].itemStyle != "undefined") {let itemStyle = {};typeof pieData[i].itemStyle.color != "undefined"? (itemStyle.color = pieData[i].itemStyle.color): null;typeof pieData[i].itemStyle.opacity != "undefined"? (itemStyle.opacity = pieData[i].itemStyle.opacity): null;seriesItem.itemStyle = itemStyle;}series.push(seriesItem);}// 使用上一次遍歷時,計算出的數據和 sumValue,調用 getParametricEquation 函數,// 向每個 series-surface 傳入不同的參數方程 series-surface.parametricEquation,也就是實現每一個扇形。for (let i = 0; i < series.length; i++) {endValue = startValue + series[i].pieData.value;series[i].pieData.startRatio = startValue / sumValue;series[i].pieData.endRatio = endValue / sumValue;series[i].parametricEquation = getParametricEquation(series[i].pieData.startRatio,series[i].pieData.endRatio,false,false,k,defaultBarHeight);startValue = endValue;legendData.push(series[i].name);}// 添加兩個紅色圓柱底座series.push({name: "base1",type: "surface",parametric: true,silent: true,wireframe: {show: false,},itemStyle: {color: "#2c68ac",opacity: 1},parametricEquation: {u: {min: 0,max: Math.PI * 2,step: Math.PI / 40,},v: {min: 0,max: Math.PI,step: Math.PI / 40,},x: function (u, v) {return Math.sin(v) * 0.6 * Math.sin(u) + Math.sin(u) * 0.6;},y: function (u, v) {return Math.sin(v) * 0.6 * Math.cos(u) + Math.cos(u) * 0.6;},z: function (u, v) {return Math.cos(v) > 0 ? 0.8 : -0.2;},},});series.push({name: "base2",type: "surface",parametric: true,silent: true,wireframe: {show: false,},itemStyle: {color: "#1b4475",opacity: 1},parametricEquation: {u: {min: 0,max: Math.PI * 2,step: Math.PI / 40,},v: {min: 0,max: Math.PI,step: Math.PI / 40,},x: function (u, v) {return Math.sin(v) * 0.7 * Math.sin(u) + Math.sin(u) * 0.7;},y: function (u, v) {return Math.sin(v) * 0.7 * Math.cos(u) + Math.cos(u) * 0.7;},z: function (u, v) {return -1;},},});// 補充一個透明的圓環,用于支撐高亮功能的近似實現。series.push({name: "mouseoutSeries",type: "surface",parametric: true,wireframe: {show: false,},itemStyle: {opacity: 0,},parametricEquation: {u: {min: 0,max: Math.PI * 2,step: Math.PI / 20,},v: {min: 0,max: Math.PI,step: Math.PI / 20,},x: function (u, v) {return Math.sin(v) * Math.sin(u) + Math.sin(u);},y: function (u, v) {return Math.sin(v) * Math.cos(u) + Math.cos(u);},z: function (u, v) {return Math.cos(v) > 0 ? 0.1 : -0.1;},},});// 準備待返回的配置項,把準備好的 legendData、series 傳入。let option = {//animation: false,legend: {data: legendData,orient: "vertical",right: "5%",top: "center",itemGap: 20,textStyle: {color: "#fff",fontSize: 14,// fontWeight: 'bold', // 增加字體加粗},},tooltip: {formatter: (params) => {if (params.seriesName !== "mouseoutSeries") {const value =option.series[params.seriesIndex]?.pieData?.value || "";return `${params.seriesName}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>${value}`;}},},xAxis3D: {min: -1,max: 1,},yAxis3D: {min: -1,max: 1,},zAxis3D: {min: -1,max: 1,},grid3D: {show: false,boxHeight: 10,viewControl: {alpha: 45,distance: 250,rotateSensitivity: 0,zoomSensitivity: 0,panSensitivity: 0,autoRotate: false,},},series: series,};return option;}let data = [{value: 60,name: "通過",itemStyle: { color: "#82C3FF" },},{value: 6,name: "不通過",itemStyle: { color: "#FFB042" },},{value: 18,name: "待審核",itemStyle: { color: "#61D6E2" },},];// 傳入數據生成 optionlet option = getPie3D(data, 0);// 監聽鼠標事件,實現餅圖選中效果(單選),近似實現高亮(放大)效果。let selectedIndex = "";let hoveredIndex = "";// 監聽點擊事件,實現選中效果(單選)// 原理:通過修改參數方程中的offsetX/Y實現扇形位移效果myChart.on("click", function (params) {// 目標對象const target = option.series[params.seriesIndex] || {};// 從 option.series 中讀取重新渲染扇形所需的參數,將是否選中取反。let isSelected = !target?.pieStatus?.selected;let isHovered = target?.pieStatus?.hovered;let k = target?.pieStatus?.k;let startRatio = target?.pieData?.startRatio;let endRatio = target?.pieData?.endRatio;const pieData = option.series[selectedIndex]?.pieData || {};// 如果之前選中過其他扇形,將其取消選中(對 option 更新)if (selectedIndex !== "" && selectedIndex !== params.seriesIndex) {option.series[selectedIndex].parametricEquation = getParametricEquation(pieData.startRatio,pieData.endRatio,false,false,k,defaultBarHeight);option.series[selectedIndex].pieStatus.selected = false;}// 對當前點擊的扇形,執行選中/取消選中操作(對 option 更新)option.series[params.seriesIndex].parametricEquation =getParametricEquation(startRatio,endRatio,isSelected,isHovered,k,defaultBarHeight);option.series[params.seriesIndex].pieStatus.selected = isSelected;// 如果本次是選中操作,記錄上次選中的扇形對應的系列號 seriesIndexisSelected ? (selectedIndex = params.seriesIndex) : null;// 使用更新后的 option,渲染圖表myChart.setOption(option);});// 監聽 mouseover,近似實現高亮(放大)效果// 原理:通過修改參數方程中的hoverRate實現放大效果myChart.on("mouseover", function (params) {// 準備重新渲染扇形所需的參數let isSelected;let startRatio;let endRatio;let k;let isHoveredNew = false;// 如果觸發 mouseover 的扇形當前已高亮,則不做操作if (hoveredIndex === params.seriesIndex) {return;// 否則進行高亮及必要的取消高亮操作} else {// 如果當前有高亮的扇形,取消其高亮狀態(對 option 更新)if (hoveredIndex !== "") {const hoverTarget = option.series[hoveredIndex] || {};// 從 option.series 中讀取重新渲染扇形所需的參數,將是否高亮設置為 false。isSelected = hoverTarget?.pieStatus?.selected;isHoveredNew = false;startRatio = hoverTarget?.pieData?.startRatio;endRatio = hoverTarget?.pieData?.endRatio;k = hoverTarget?.pieStatus.k;// 對當前點擊的扇形,執行取消高亮操作(對 option 更新)option.series[hoveredIndex].parametricEquation = getParametricEquation(startRatio,endRatio,isSelected,isHoveredNew,k,defaultBarHeight);option.series[hoveredIndex].pieStatus.hovered = isHoveredNew;// 將此前記錄的上次選中的扇形對應的系列號 seriesIndex 清空hoveredIndex = "";}// 如果觸發 mouseover 的扇形不是透明圓環,將其高亮(對 option 更新)if (params.seriesName !== "mouseoutSeries") {const seriesSeries = option.series[params.seriesIndex] || {};// 從 option.series 中讀取重新渲染扇形所需的參數,將是否高亮設置為 true。isSelected = seriesSeries?.pieStatus?.selected;isHoveredNew = true;startRatio = seriesSeries?.pieData?.startRatio;endRatio = seriesSeries?.pieData?.endRatio;k = seriesSeries?.pieStatus?.k;// 對當前點擊的扇形,執行高亮操作(對 option 更新)option.series[params.seriesIndex].parametricEquation =getParametricEquation(startRatio,endRatio,isSelected,isHoveredNew,k,hoverBarHeight);if (option.series[params.seriesIndex]?.pieStatus) {option.series[params.seriesIndex].pieStatus.hovered = isHoveredNew;} else {option.series[params.seriesIndex].pieStatus = {hovered: isHoveredNew,};}// 記錄上次高亮的扇形對應的系列號 seriesIndexhoveredIndex = params.seriesIndex;}// 使用更新后的 option,渲染圖表myChart.setOption(option);}});// 修正取消高亮失敗的 bugmyChart.on("globalout", function () {let isHoveredNew = false;let k;if (hoveredIndex !== "") {const curSeries = option.series[hoveredIndex] || {};// 從 option.series 中讀取重新渲染扇形所需的參數,將是否高亮設置為 true。let isSelected = curSeries.pieStatus?.selected;k = curSeries?.pieStatus?.k;let startRatio = curSeries?.pieData?.startRatio;let endRatio = curSeries?.pieData?.endRatio;// 對當前點擊的扇形,執行取消高亮操作(對 option 更新)option.series[hoveredIndex].parametricEquation = getParametricEquation(startRatio,endRatio,isSelected,isHoveredNew,k,defaultBarHeight);option.series[hoveredIndex].pieStatus.hovered = isHoveredNew;// 將此前記錄的上次選中的扇形對應的系列號 seriesIndex 清空hoveredIndex = "";}// 使用更新后的 option,渲染圖表myChart.setOption(option);});option.series.push({name: "pie2d",type: "pie",labelLine: {length: 40,length2: 120,lineStyle: {width: 2,},},label: {opacity: 1,show: true,position: "outside",fontSize: 16,itemStyle: {color: "#fff",fontSize: 14,fontWeight: "bold",fontFamily: "Arial, sans-serif",},textStyle: {color: "#fff",lineHeight: 30,rich: {top: {verticalAlign: "middle",padding: [0, 0, 0, 0],},bottom: {verticalAlign: "middle",padding: [0, 0, 0, 0],},},},formatter: (params) => {return `${params.name}\n${params.percent}%`;},},startAngle: -66, //起始角度,支持范圍[0, 360]。clockwise: false, //餅圖的扇區是否是順時針排布。上述這兩項配置主要是為了對齊3d的樣式radius: ["40%", "36%"],// center: ['55%', '48%'], //指示線的位置data: data,itemStyle: {opacity: 0,},});myChart.setOption(option);// 組件卸載時清除事件監聽return () => {window.removeEventListener("resize", resizeChart);myChart.dispose();};
});
</script><style scoped>
.chart-container {width: 100%;height: 100vh;background-color: #001529;display: flex;justify-content: center;align-items: center;position: relative;
}.chart {width: 800px;height: 600px;
}/* 添加網格背景 */
.chart-container::before {content: "";position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-image: linear-gradient(#0e2a47 1px, transparent 1px),linear-gradient(90deg, #0e2a47 1px, transparent 1px);background-size: 20px 20px;opacity: 0.3;z-index: 0;
}.chart {z-index: 1;
}
</style>

通過本文方案,開發者可快速構建具有強交互性的 3D 數據可視化組件。關鍵點在于參數方程的靈活運用與事件系統的深度集成,這種模式可擴展至其他 3D 圖表類型(如柱狀圖、散點圖)的開發。

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

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

相關文章

Transformer Decoder-Only 參數量計算

Transformer 的 Decoder-Only 架構&#xff08;如 GPT 系列模型&#xff09;是當前大語言模型的主流架構&#xff0c;其參數量主要由以下幾個部分組成&#xff1a; 嵌入層&#xff08;Embedding Layer&#xff09;自注意力層&#xff08;Self-Attention Layers&#xff09;前饋…

(自用)Java學習-5.8(總結,springboot)

一、MySQL 數據庫 表關系 一對一、一對多、多對多關系設計外鍵約束與級聯操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查詢 基礎查詢&#xff1a;SELECT * FROM table WHERE...聚合函數&#xff1a;COUNT()…

【日擼 Java 三百行】Day 11(順序表(一))

目錄 Day 11&#xff1a;順序表&#xff08;一&#xff09; 一、關于順序表 二、關于面向對象 三、代碼模塊分析 1. 順序表的屬性 2. 順序表的方法 四、代碼及測試 拓展&#xff1a; 小結 Day 11&#xff1a;順序表&#xff08;一&#xff09; Task&#xff1a; 在《數…

Spring Boot動態配置修改全攻略

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 無需重啟應用&#xff0c;實時更新配置的終極指南 在微服務架構中&#xff0c;動態配置管理是提高系統靈活性的關鍵技術。本文將通過4種主流方案&#xff0c…

精益數據分析(55/126):雙邊市場模式的挑戰、策略與創業階段關聯

精益數據分析&#xff08;55/126&#xff09;&#xff1a;雙邊市場模式的挑戰、策略與創業階段關聯 在創業和數據分析的學習旅程中&#xff0c;我們持續探索不同商業模式的奧秘。今天&#xff0c;依舊懷揣著與大家共同進步的想法&#xff0c;深入研讀《精益數據分析》&#xf…

linux內核pinctrl/gpio子系統驅動筆記

目錄 一、簡單介紹二、主要源碼文件和目錄gpio子系統pinctrl子系統兩個子系統之間的關系設備樹例子 三、主要的數據結構gpio子系統pinctrl子系統 四、驅動初始化流程五、難點說明 一、簡單介紹 GPIO子系統: Linux GPIO子系統是Linux內核中負責處理GPIO&#xff08;通用輸入輸出…

Vue 2 項目中配置 Tailwind CSS、Font Awesome和daisyUI

Vue 2 項目中配置 Tailwind CSS 和 安裝 daisyUI 首先重點注意&#xff0c;Vue2中安裝Tailwind和daisyui一定要注意版本。 最佳版本 使用 Vue 2 TailwindCSS v2 DaisyUI v1 的兼容版本 "tailwindcss": "npm:tailwindcss/postcss7-compat^2.2.17", &q…

5.11 - 5.12 JDBC+Mybatis+StringBoot項目配置文件

JDBC&#xff1a; 預編譯SQL優點&#xff1a;安全&#xff0c;性能更高。 在cmd里面輸入java-jar就可以運行jar包。 Mybatis&#xff1a; 持久層框架。用于簡化JDBC的開發。 數據庫連接池里面放置的是一個一個Connection連接對象。&#xff08;連接池中的連接可以復用&#…

探索科技的前沿動態:科技愛好者周刊

探索科技的前沿動態:科技愛好者周刊 在信息爆炸的時代,我們每時每刻都被新技術、新理念包圍。而如何在這紛繁復雜的信息中找到對自己有價值的內容,成了一大挑戰。今天,我們要介紹的是一個寶貴的資源——科技愛好者周刊,它致力于為科技愛好者提供優質的科技資訊,每周五發…

Vue3 官方宣布淘汰 Axios,擁抱Alova.js

過去十年,Axios 憑借其簡潔的API設計和瀏覽器/Node.js雙環境支持,成為前端開發者的首選請求庫。但隨著現代前端框架的演進和工程化需求的升級,Alova.js 以更輕量、更智能、更符合現代開發范式的姿態登場。 一、Axios的痛點 1,冗余的適配邏輯,比如Axios的通用配置(但實際…

Spring AI 與 Groq 的深度集成:解鎖高效 AI 推理新體驗

Spring AI 與 Groq 的深度集成&#xff1a;解鎖高效 AI 推理新體驗 前言 在人工智能飛速發展的當下&#xff0c;AI 推理的效率和性能成為開發者關注的焦點。Groq 作為一款基于 LPU? 的超快速 AI 推理引擎&#xff0c;憑借其強大的性能&#xff0c;能夠支持各類 AI 模型&…

風車OVF鏡像:解放AI開發限制的Ubuntu精簡系統

風車OVF鏡像&#xff1a;解放AI開發限制的Ubuntu精簡系統 AI白嫖續杯一站式-風車ovf AI白嫖續杯一站式解決-風車ovf 前言 作為一名AI開發者&#xff0c;我經常在Windows和Linux環境之間切換開發。然而&#xff0c;Windows平臺上的各種免費版限制逐漸成為我工作效率的瓶頸。在尋…

第十部分:文件與動靜態庫

目錄 1、文件系統 1.1、磁盤 1.2、文件系統 1.3、文件的增刪查改 2、軟硬鏈接 2.1、軟鏈接 2.2、硬鏈接 3、物理內存與文件 4、動靜態庫 4.1、靜態庫 4.1.1、靜態庫的制作 4.1.2、靜態庫的使用 4.2、動態庫 4.2.1、動態庫的制作 4.2.2、動態庫的使用 4.3、動靜…

android14優化ntp時間同步

簡介 網絡時間協議NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP協議族里面的一個應用層協議&#xff0c;用來使客戶端和服務器之間進行時鐘同步&#xff0c;提供高精準度的時間校正。 當機器的ntp時間同步出現問題時&#xff0c;可以從ntp配置方面進行優化&…

ZYNQ筆記(二十):Clocking Wizard 動態配置

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任務&#xff1a;ZYNQ PS端 通過 AXI4Lite 接口配置 Clocking Wizard IP核輸出時鐘頻率 目錄 一、介紹 二、寄存器定義 三、配置 四、PS端代碼 一、介紹 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…

服務器帶寬基礎知識

服務器帶寬基礎知識詳解 一、帶寬的定義與基本概念 服務器帶寬&#xff08;Bandwidth&#xff09;是指服務器與互聯網之間在單位時間內傳輸數據的能力&#xff0c;通常以 Mbps&#xff08;兆比特每秒&#xff09; 或 Gbps&#xff08;吉比特每秒&#xff09; 為單位衡量。它決…

OpenCV CUDA 模塊中在 GPU 上對圖像或矩陣進行 翻轉(鏡像)操作的一個函數 flip()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模塊中的一個函數&#xff0c;用于在 GPU 上對圖像或矩陣進行 翻轉&#xff08;鏡像&#xff09;操作。它類似…

shell腳本實現docker運行鏡像掛載

根據本文腳本展示內容可以實現多種容器掛載 演示nginx掛載 創建掛載目錄 mkdir -p /data/nginx/{conf,html,logs} 參數含義&#xff1a; docker run -d --name 給運行的鏡像取名 -v /宿主機/目錄:/容器內/目錄 鏡像名 示例&#xff1a; docker啟動nginx&#xff08;當…

WiseAD:基于視覺-語言模型的知識增強型端到端自動駕駛——論文閱讀

《WiseAD: Knowledge Augmented End-to-End Autonomous Driving with Vision-Language Model》2024年12月發表&#xff0c;來自新加坡國立和浙大的論文。 在快速發展的視覺語言模型&#xff08;VLM&#xff09;中&#xff0c;一般人類知識和令人印象深刻的邏輯推理能力的出現&a…

NestJS 知識框架

一、核心概念 1. 架構基礎 基于 Express/Fastify 的 Node.js 框架 采用模塊化設計 使用 TypeScript 構建&#xff08;也支持 JavaScript&#xff09; 借鑒 Angular 的設計理念 2. 主要組件 模塊 (Module): 應用的基本組織單元 控制器 (Controller): 處理 HTTP 請求 服務…