返回

HARMONOGRAPHS:用代码绘制动态曲线

前端

曲线艺术编程的协奏曲:谐波图形的魅力

在曲线艺术编程的第五乐章中,我们踏入了一个令人着迷的领域——谐波图形。它不是一种曲线,而是一种将(模拟)利萨茹曲线变为现实的装置。我们所指的装置,是一个物理世界的设备,一个让曲线在我们的指尖起舞的工具。

谐波图形的原理:共振之舞

谐波图形利用两个正交振荡器(以不同的频率振动)的共振原理。这些振荡器控制一个笔或光源,该笔或光源在平面或曲面上移动,留下一个动态曲线轨迹。当这两个振荡器的频率发生谐振时,就会产生引人入胜的几何图案。

实现谐波图形:代码的画笔

要创建自己的谐波图形,我们可以借助编程的力量。Python、Javascript 和 C++ 等语言为我们提供了必要的工具,让我们能够模拟谐波图形的物理行为。通过调整振荡器的频率、相位和幅度,我们可以生成各种各样的曲线,从简单的正弦波到复杂的利萨茹图形。

代码示例:绘制自己的曲线协奏曲

  • Python:
import numpy as np
import matplotlib.pyplot as plt

# 创建谐波图形
def create_harmonograph(freq1, freq2, phase1, phase2, amplitude1, amplitude2):
    # 创建时间序列
    t = np.linspace(0, 10, 1000)

    # 计算 x 和 y 坐标
    x = amplitude1 * np.sin(2 * np.pi * freq1 * t + phase1)
    y = amplitude2 * np.sin(2 * np.pi * freq2 * t + phase2)

    # 绘制曲线
    plt.plot(x, y)
    plt.show()

# 参数设置
freq1 = 2
freq2 = 3
phase1 = 0
phase2 = np.pi/2
amplitude1 = 1
amplitude2 = 1

# 创建谐波图形
create_harmonograph(freq1, freq2, phase1, phase2, amplitude1, amplitude2)
  • Javascript:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

// 创建谐波图形
function createHarmonograph(freq1, freq2, phase1, phase2, amplitude1, amplitude2) {
    // 创建时间序列
    const t = [];
    for (let i = 0; i < 1000; i++) {
        t.push(i / 100);
    }

    // 计算 x 和 y 坐标
    const x = [];
    const y = [];
    for (let i = 0; i < 1000; i++) {
        x.push(amplitude1 * Math.sin(2 * Math.PI * freq1 * t[i] + phase1));
        y.push(amplitude2 * Math.sin(2 * Math.PI * freq2 * t[i] + phase2));
    }

    // 绘制曲线
    ctx.beginPath();
    ctx.moveTo(x[0], y[0]);
    for (let i = 1; i < 1000; i++) {
        ctx.lineTo(x[i], y[i]);
    }
    ctx.stroke();
}

// 参数设置
const freq1 = 2;
const freq2 = 3;
const phase1 = 0;
const phase2 = Math.PI / 2;
const amplitude1 = 1;
const amplitude2 = 1;

// 创建谐波图形
createHarmonograph(freq1, freq2, phase1, phase2, amplitude1, amplitude2);
  • C++:
#include <iostream>
#include <cmath>
#include <vector>

// 创建谐波图形
void createHarmonograph(double freq1, double freq2, double phase1, double phase2, double amplitude1, double amplitude2) {
    // 创建时间序列
    std::vector<double> t;
    for (int i = 0; i < 1000; i++) {
        t.push_back(i / 100.0);
    }

    // 计算 x 和 y 坐标
    std::vector<double> x;
    std::vector<double> y;
    for (int i = 0; i < 1000; i++) {
        x.push_back(amplitude1 * sin(2 * M_PI * freq1 * t[i] + phase1));
        y.push_back(amplitude2 * sin(2 * M_PI * freq2 * t[i] + phase2));
    }

    // 输出数据
    for (int i = 0; i < 1000; i++) {
        std::cout << x[i] << "," << y[i] << std::endl;
    }
}

// 主函数
int main() {
    // 参数设置
    double freq1 = 2;
    double freq2 = 3;
    double phase1 = 0;
    double phase2 = M_PI / 2;
    double amplitude1 = 1;
    double amplitude2 = 1;

    // 创建谐波图形
    createHarmonograph(freq1, freq2, phase1, phase2, amplitude1, amplitude2);

    return 0;
}

通过这些代码示例,我们可以创建自己的谐波图形,探索不同的参数组合,并欣赏动态曲线之美。代码赋予我们创造性的自由,让我们在数学和艺术的交汇处创作出独特的几何杰作。

结语:谐波图形的无限可能

谐波图形为我们提供了一种迷人的方式来探索曲线、振荡和共振的世界。通过编程的媒介,我们可以释放这种装置的全部潜力,创造出引人入胜的视觉体验。无论是用于艺术表达、科学研究还是教育目的,谐波图形都是一个无穷无尽的可能性和想象力的来源。