计算机图形学中的三角函数

269 阅读4分钟

一、引言

三角函数在计算机图形学中扮演着至关重要的角色,它广泛应用于旋转、缩放、投影等各种图形变换中。理解和掌握三角函数是学习计算机图形学的基础。

二、基本三角函数

1. 正弦函数(Sine)

正弦函数是三角函数中最基本的函数之一,在 JavaScript 中,我们可以使用Math.sin()方法来计算正弦值。下面是一个简单的示例,展示了如何使用 JavaScript 计算一个角度的正弦值:

// 计算30度的正弦值
let angleInDegrees = 30;
// 将角度转换为弧度,因为JavaScript中的三角函数接受弧度值
let angleInRadians = angleInDegrees * (Math.PI / 180);
let sinValue = Math.sin(angleInRadians);
console.log("30度的正弦值是:" + sinValue);

2. 余弦函数(Cosine)

余弦函数也是常用的三角函数,在 JavaScript 中用Math.cos()计算。示例如下:

// 计算60度的余弦值
let angle = 60;
let radian = angle * (Math.PI / 180);
let cosValue = Math.cos(radian);
console.log("60度的余弦值是:" + cosValue);

3. 正切函数(Tangent)

正切函数在 JavaScript 中通过Math.tan()来计算。示例:

// 计算45度的正切值
let degree = 45;
let rad = degree * (Math.PI / 180);
let tanValue = Math.tan(rad);
console.log("45度的正切值是:" + tanValue);

三、三角函数在图形旋转中的应用

1. 二维平面上的旋转

在二维平面中,我们可以利用三角函数来实现图形的旋转。下面是一个使用 JavaScript 和 Canvas API 实现简单图形旋转的示例:

// 获取Canvas元素和绘图上下文
let canvas = document.getElementById('myCanvas');
let ctx = canvas.getContext('2d');
// 设置Canvas尺寸
canvas.width = 400;
canvas.height = 400;
// 旋转角度(弧度)
let rotationAngle = 0;
function draw() {
    // 清除Canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 保存当前上下文状态
    ctx.save();
    
    // 将原点移动到Canvas中心
    ctx.translate(canvas.width / 2, canvas.height / 2);
    
    // 旋转上下文
    ctx.rotate(rotationAngle);
    
    // 绘制一个矩形
    ctx.fillStyle = 'blue';
    ctx.fillRect(-50, -30, 100, 60);
    
    // 恢复上下文状态
    ctx.restore();
    
    // 更新旋转角度
    rotationAngle += 0.01;
    
    // 请求下一帧动画
    requestAnimationFrame(draw);
}
// 开始动画
draw();

2. 三维空间中的旋转

在三维空间中,图形的旋转更为复杂,通常需要使用矩阵变换。下面是一个简单的三维旋转示例:

// 三维向量旋转函数
function rotateX(vector, angle) {
    let y = vector[1] * Math.cos(angle) - vector[2] * Math.sin(angle);
    let z = vector[1] * Math.sin(angle) + vector[2] * Math.cos(angle);
    return [vector[0], y, z];
}
function rotateY(vector, angle) {
    let x = vector[0] * Math.cos(angle) + vector[2] * Math.sin(angle);
    let z = -vector[0] * Math.sin(angle) + vector[2] * Math.cos(angle);
    return [x, vector[1], z];
}
function rotateZ(vector, angle) {
    let x = vector[0] * Math.cos(angle) - vector[1] * Math.sin(angle);
    let y = vector[0] * Math.sin(angle) + vector[1] * Math.cos(angle);
    return [x, y, vector[2]];
}
// 使用示例
let point = [10, 5, 3];
let rotatedPoint = rotateX(point, Math.PI / 4);
console.log("绕X轴旋转45度后的点坐标:", rotatedPoint);

四、三角函数在波浪效果中的应用

1. 简单波浪动画

我们可以使用正弦函数创建波浪效果。下面是一个使用 Canvas 绘制波浪动画的示例:

// 获取Canvas元素和绘图上下文
let canvas = document.getElementById('waveCanvas');
let ctx = canvas.getContext('2d');
// 设置Canvas尺寸
canvas.width = 600;
canvas.height = 300;
// 波浪参数
let amplitude = 50; // 振幅
let frequency = 0.02; // 频率
let speed = 0.1; // 速度
let offset = 0; // 偏移量
function drawWave() {
    // 清除Canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 设置波浪颜色
    ctx.beginPath();
    ctx.moveTo(0, canvas.height / 2);
    
    // 绘制波浪曲线
    for (let x = 0; x < canvas.width; x++) {
        let y = Math.sin((x * frequency) + offset) * amplitude;
        ctx.lineTo(x, canvas.height / 2 + y);
    }
    
    // 完成波浪形状
    ctx.lineTo(canvas.width, canvas.height);
    ctx.lineTo(0, canvas.height);
    ctx.closePath();
    
    // 设置渐变填充
    let gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
    gradient.addColorStop(0, 'rgba(0, 150, 255, 0.7)');
    gradient.addColorStop(1, 'rgba(0, 150, 255, 0.2)');
    ctx.fillStyle = gradient;
    ctx.fill();
    
    // 更新偏移量
    offset += speed;
    
    // 请求下一帧动画
    requestAnimationFrame(drawWave);
}
// 开始动画
drawWave();

五、三角函数在圆形运动中的应用

1. 圆周运动示例

利用三角函数可以实现物体绕圆形路径运动的效果。以下是一个示例:

// 获取Canvas元素和绘图上下文
let canvas = document.getElementById('circleCanvas');
let ctx = canvas.getContext('2d');
// 设置Canvas尺寸
canvas.width = 500;
canvas.height = 500;
// 圆的参数
let centerX = canvas.width / 2;
let centerY = canvas.height / 2;
let radius = 150;
let angle = 0;
let speed = 0.02;
function drawCircleMotion() {
    // 清除Canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 计算物体在圆周上的位置
    let x = centerX + Math.cos(angle) * radius;
    let y = centerY + Math.sin(angle) * radius;
    
    // 绘制圆轨道
    ctx.beginPath();
    ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);
    ctx.strokeStyle = 'rgba(0, 0, 0, 0.3)';
    ctx.lineWidth = 2;
    ctx.stroke();
    
    // 绘制运动物体
    ctx.beginPath();
    ctx.arc(x, y, 20, 0, Math.PI * 2);
    ctx.fillStyle = 'red';
    ctx.fill();
    
    // 更新角度
    angle += speed;
    
    // 请求下一帧动画
    requestAnimationFrame(drawCircleMotion);
}
// 开始动画
drawCircleMotion();

六、总结

三角函数在计算机图形学中有着广泛的应用,无论是简单的二维图形变换,还是复杂的三维场景渲染,三角函数都是不可或缺的工具。通过本文的介绍和示例代码,你应该对三角函数在计算机图形学中的应用有了基本的了解。在实际开发中,你可以根据具体需求灵活运用这些知识,创造出更加丰富多彩的图形效果。