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

Processing (Java): How to make a plotted sine function look continuous instead of separate dots when the amplitude of the function increases

我在 Processing 中绘制了一个正弦波,方法是在函数中放置 x 个像素。乍一看像一条连续的线:

Sine wave looks continuous

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

Sine wave with increased amplitude where the points are spread

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

如果有任何帮助,这里是处理中的代码:

// 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()) between 2 consecutive points rather than single dots (circle()). The thickness of a line can be set by 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() 而不是创建 circle() 中,您将在形状中创建一个新的 s.vertex()

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