返回
HARMONOGRAPHS:用代码绘制动态曲线
前端
2023-12-31 01:00:17
曲线艺术编程的协奏曲:谐波图形的魅力
在曲线艺术编程的第五乐章中,我们踏入了一个令人着迷的领域——谐波图形。它不是一种曲线,而是一种将(模拟)利萨茹曲线变为现实的装置。我们所指的装置,是一个物理世界的设备,一个让曲线在我们的指尖起舞的工具。
谐波图形的原理:共振之舞
谐波图形利用两个正交振荡器(以不同的频率振动)的共振原理。这些振荡器控制一个笔或光源,该笔或光源在平面或曲面上移动,留下一个动态曲线轨迹。当这两个振荡器的频率发生谐振时,就会产生引人入胜的几何图案。
实现谐波图形:代码的画笔
要创建自己的谐波图形,我们可以借助编程的力量。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;
}
通过这些代码示例,我们可以创建自己的谐波图形,探索不同的参数组合,并欣赏动态曲线之美。代码赋予我们创造性的自由,让我们在数学和艺术的交汇处创作出独特的几何杰作。
结语:谐波图形的无限可能
谐波图形为我们提供了一种迷人的方式来探索曲线、振荡和共振的世界。通过编程的媒介,我们可以释放这种装置的全部潜力,创造出引人入胜的视觉体验。无论是用于艺术表达、科学研究还是教育目的,谐波图形都是一个无穷无尽的可能性和想象力的来源。