处理(Java):当函数的振幅增加时,如何使绘制的正弦函数看起来连续,而不是单独的点



我在Processing中通过在函数中放入x个像素量绘制了一个正弦波。乍一看,它像一条连续的线:

正弦波看起来是连续的

但当我增加波的振幅时,我注意到绘制的点分散开来,看起来不再连续:

振幅增加的正弦波,点在上展开

我认为绘制更多的点或在点之间进行插值可能会解决这个问题。我想知道,对于振幅或频率的任何增量,使函数看起来连续的最有效方法是什么。

如果它在任何方面都有帮助,下面是Processing:中的代码

// sine variables
float x, y, y2, offset,r = 0;
float ex = 0, ey = 0; 

void setup() {
size(800, 800);
frameRate(60);
}

void draw() {
// sine
checkMouse();
amp = amp+ex;
background(0);
y2 = y;
stroke(255);
for (int i = 5; i < 6;i++) {
updateWave(i);
}
}
void updateWave(float i) {
for (int x = 1; x < width; x+=1) {
y = sin(radians(-x*abs(ex)+r))*ey*i;
circle(x, y+height/2,2);
}
r = millis()/8;
}
void checkMouse() {
if (mousePressed){
ex = (mouseX - height/2)*0.01;
ey = pow((mouseY- height/2), 2)/1000;
} else {
if (ey < 1) {
ey = 0;
} else {
ey -= 1;
}
}
}

谢谢!!

在两个连续点之间画一条线(line()(,而不是单个点(circle()(。线的厚度可以通过strokeWeight():设置

void updateWave(float i) {
strokeWeight(2);
float prevY = 0.0;
for (int x = 0; x < width; x ++) {
float newY = sin(radians(-x*abs(ex)+r))*ey*i + height/2;
if (x > 0)
line(x-1, prevY, x, newY);
prevY = newY;
}
r = millis()/8;
}

您可以使用处理提供的createShape()函数,而不必创建一条线并记住前一点。To doc有一些很好的例子。

这个想法是在draw()中调用updateWave()的循环开始之前,先用s = createShape()开始你的形状。然后在updateWave()中,您将在形状中创建一个新的s.vertex(),而不是创建一个circle()

当您离开循环时,您可以调用s.endShape(),然后可以调用shape(s)来绘制由这些点创建的形状。

相关内容

最新更新