WebGL
WebGL 允许开发者从零开始使用代码创建图形,并将其集成到网页中。它直接与 HTML <canvas>
元素交互,允许作为网页画布的一部分使用 GPU 加速物理处理和图像处理及效果。
WebGL 支持开发从 2D 游戏到复杂的 3D 可视化应用程序的广泛范围的应用程序。同时,由于大多数现代浏览器都支持 WebGL,使得它成为开发者开发图形的首选工具。
示例
在下面的代码中,我们使用 <canvas>
元素创建了一个画布,并在 JavaScript 中通过 id 访问了它。接着,我们使用 getContext()
方法获取 WebGL 的上下文。如果浏览器不支持 WebGL,则 getContext()
方法返回未定义值。
在 initiateShader()
函数中,我们将着色器源代码编译成着色器,将这些着色器附加到一个程序中,然后链接该程序以便在 WebGL 上下文中使用。loadShader()
函数用于加载和编译着色器代码。
在 drawScene()
函数中,我们通过传递图形信息作为参数使用 useProgram()
方法绘制一个三角形到画布上。在输出中,你可以看到黑色画布上的红色三角形。
<html>
<body>
<h2>JavaScript - 图形 (WebGL)</h2>
<canvas id="webgl-canvas" width="600" height="400"></canvas>
<div id="error"></div>
<script>
var canvas = document.getElementById('webgl-canvas');
let errorDiv = document.getElementById('error');
var gl = canvas.getContext('webgl');
if (!gl) {
console.error('您的浏览器可能不支持 WebGL。');
}
var vsSource = `
attribute vec4 aVertexPosition;
void main(void) {
gl_Position = aVertexPosition;
}
`;
var fsSource = `
void main(void) {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
`;
function initShaderProgram(gl, vsSource, fsSource) {
const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert('无法初始化着色器程序: ' + gl.getProgramInfoLog(shaderProgram));
return null;
}
return shaderProgram;
}
function loadShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
errorDiv.innerHTML = '编译着色器时发生错误: ' + gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
return null;
}
return shader;
}
var shaderProgram = initShaderProgram(gl, vsSource, fsSource);
var programInfo = {
program: shaderProgram,
attribLocations: {
vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'),
},
};
var positions = [
0.0, 1.0,
-1.0, -1.0,
1.0, -1.0,
];
var positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
function drawScene(gl, programInfo, buffers) {
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(programInfo.program);
{
const numComponents = 2;
const type = gl.FLOAT;
const normalize = false;
const stride = 0;
const offset = 0;
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(
programInfo.attribLocations.vertexPosition,
numComponents,
type,
normalize,
stride,
offset);
gl.enableVertexAttribArray(
programInfo.attribLocations.vertexPosition);
}
gl.drawArrays(gl.TRIANGLES, 0, 3);
}
drawScene(gl, programInfo, positionBuffer);
</script>
</body>
</html>
P5.js
P5.js 同样是一个非常流行的图形库,用于通过编写代码创建各种形状。它还允许我们对这些形状进行动画处理,使其看起来更具视觉吸引力。然而,P5.js 不仅仅局限于形状,它还允许与音频、视频等进行交互。
示例
让我们通过下面的例子来理解 P5.js 的使用方法。
function setup() {
createCanvas(400, 400);
}
function draw() {
background(220);
fill(255, 0, 0);
noStroke();
ellipse(width / 2, height / 2, 100, 100);
}
这段代码将会创建一个 400x400 的画布,并在画布中央绘制一个红色的圆形。setup()
函数设置了画布的大小,而 draw()
函数则会在每次循环时调用,负责更新和绘制画布内容。在这个例子中,背景被设置为浅灰色,然后绘制一个没有边框的红色圆形。
JavaScript 图形库示例
P5.js
P5.js 是一个非常流行的图形库,用于通过编写代码创建各种形状。它还允许我们对这些形状进行动画处理,使其看起来更具视觉吸引力。然而,P5.js 不仅仅局限于形状,它还允许与音频、视频等进行交互。
示例
在下面的代码中,程序开始时有两个主要函数:setup()
和 draw()
。setup()
函数在程序启动时只运行一次,用于初始设置任务。draw()
函数则会连续执行其块内的代码行,直到程序停止或者调用了 noLoop()
,这使得它非常适合制作动画。
在 setup()
函数中,我们创建了一个画布并在其上绘制了圆圈。在 draw()
函数中,我们不断地通过重绘来改变圆圈的位置。下面代码的输出显示了一个移动的圆圈。
<html>
<head>
<title>p5.js 示例</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
</head>
<body>
<script>
let x, y;
let dx = 2;
let dy = -2;
let radius = 50;
function setup() {
createCanvas(windowWidth, windowHeight);
x = width / 2;
y = height / 2;
}
function draw() {
background(220);
fill(random(255), random(255), random(255));
ellipse(x, y, radius * 2);
x += dx;
y += dy;
if (x + radius > width || x - radius < 0) {
dx = -dx;
}
if (y + radius > height || y - radius < 0) {
dy = -dy;
}
}
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
}
</script>
</body>
</html>
Plotly.js
Plotly.js 是一个 JavaScript 库,允许开发者轻松创建各种高质量的图表和可视化。我们可以用它来绘制统计图表、3D 图表等。Plotly.js 库可以集成到多种编程语言和框架中。
示例
在下面的代码中,我们创建了 trace1
对象,其中包含 x、y 和 type 属性。之后,我们使用 newPlot()
方法根据给定的数据点创建了一条折线图。
<html>
<body>
<h2>JavaScript - 图形</h2>
<div id="plotlyChart" style="width:600px;height:400px;"></div>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<script>
var trace1 = {
x: [1, 2, 3, 4],
y: [10, 15, 13, 17],
type: 'scatter'
};
var data = [trace1];
Plotly.newPlot('plotlyChart', data);
</script>
</body>
</html>
Chart.js
Chart.js 也是一个 JavaScript 库,允许开发者绘制各种类型的图表。它支持六种图表类型:线图、柱状图、雷达图、饼图、极地区域图。
示例
在下面的代码中,我们使用了 Chart.js 库中的 Chart()
构造函数来创建一个新的柱状图。
<html>
<body>
<h2>JavaScript - 图形</h2>
<canvas id="chartjsBarChart" width="600" height="400"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
var ctx = document.getElementById('chartjsBarChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple'],
datasets: [{
label: '# of Votes',
data: [1, 6, 3, 5, 2],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>
Google Charts
Google Charts 库也提供了各种类型的图表,包括但不限于以下几种:
然而,还有更多的 JavaScript 库如 D3.js 可以用来绘制各种图形。