在本文中,我們將學習如何使用 Canvas 瀏覽器 API 和 HTML 元素,使用 JavaScript 繪製經過多個點的平滑曲線。
在網路上視覺化資料或建立互動式圖形時,透過多個點繪製平滑曲線可以大大增強資訊的美觀性和可讀性。讓我們透過一些範例來了解如何實現這一點。
在此範例中,我們將利用由一組控制點定義的 Brazier 曲線的概念來繪製穿過它們的平滑曲線。我們將使用 canvas HTML 元素及其上下文 API 預定義點,透過這些點繪製平滑曲線。
<html lang="en"> <head> <title> How to Draw Smooth Curve Through Multiple Points using JavaScript? </title> <style> canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="myCanvas" width="500" height="300"></canvas> <script> const canvas = document.getElementById("myCanvas"); const context = canvas.getContext("2d"); const points = [ { x: 50, y: 100 }, { x: 150, y: 200 }, { x: 250, y: 50 }, { x: 350, y: 150 }, { x: 450, y: 100 }, ]; function drawSmoothCurve(points) { context.beginPath(); context.moveTo(points[0].x, points[0].y); for (let i = 1; i < points.length - 1; i++) { const xc = (points[i].x + points[i + 1].x) / 2; const yc = (points[i].y + points[i + 1].y) / 2; context.quadraticCurveTo(points[i].x, points[i].y, xc, yc); } // Connect the last two points with a straight line context.lineTo(points[points.length - 1].x, points[points.length - 1].y); context.stroke(); } drawSmoothCurve(points); </script> </body> </html>
在本範例中,我們將遵循上述程式碼結構,使用 Bézier 曲線和 Catmull-Rom 樣條方法透過多個點繪製一條平滑曲線。
<html lang="en"> <head> <title>How to Draw Smooth Curve Through Multiple Points using JavaScript?</title> <style> canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="myCanvas" width="500" height="300"></canvas> <script> const canvas = document.getElementById("myCanvas"); const context = canvas.getContext("2d"); const points = [ { x: 50, y: 100 }, { x: 150, y: 200 }, { x: 250, y: 50 }, { x: 350, y: 150 }, { x: 450, y: 100 }, ]; function drawSmoothCurve(points) { context.beginPath(); context.moveTo(points[0].x, points[0].y); // Example 1: Bézier Curves // context.quadraticCurveTo(cp1x, cp1y, x, y); // context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); for (let i = 1; i < points.length - 1; i++) { const xc = (points[i].x + points[i + 1].x) / 2; const yc = (points[i].y + points[i + 1].y) / 2; context.quadraticCurveTo(points[i].x, points[i].y, xc, yc); } // Connect the last two points with a straight line context.lineTo(points[points.length - 1].x, points[points.length - 1].y); context.stroke(); } drawSmoothCurve(points); // Example 2: Catmull-Rom Splines function catmullRomSpline(points, context) { context.beginPath(); context.moveTo(points[0].x, points[0].y); for (let i = 1; i < points.length - 2; i++) { const p0 = points[i - 1]; const p1 = points[i]; const p2 = points[i + 1]; const p3 = points[i + 2]; const t = 0.5; const x1 = (-t * p0.x + (2 - t) * p1.x + (t - 2) * p2.x + t * p3.x) / 2; const y1 = (-t * p0.y + (2 - t) * p1.y + (t - 2) * p2.y + t * p3.y) / 2; const x2 = ((2 * t - 3) * p0.x + (3 - 4 * t) * p1.x + (1 + 2 * t) * p2.x + (-t) * p3.x) / 2; const y2 = ((2 * t - 3) * p0.y + (3 - 4 * t) * p1.y + (1 + 2 * t) * p2.y + (-t) * p3.y) / 2; const x3 = (t * p1.x + (2 - t) * p2.x) / 2; const y3 = (t * p1.y + (2 - t) * p2.y) / 2; context.bezierCurveTo(x1, y1, x2, y2, x3, y3); } context.lineTo(points[points.length - 2].x, points[points.length - 2].y); context.lineTo(points[points.length - 1].x, points[points.length - 1].y); context.stroke(); } catmullRomSpline(points, context); </script> </body> </html>
總之,使用 JavaScript 透過多個點繪製平滑曲線可以大幅增強基於 Web 的圖形和資料視覺化的視覺美感和可讀性。透過利用 Bezier 曲線和 Catmull-Rom 樣條曲線的強大功能,我們學習如何在 canvas HTML 元素及其上下文 API 的幫助下使用 JavaScript 透過多個點繪製平滑曲線。
以上是如何使用 JavaScript 透過多個點繪製平滑曲線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!