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

5cg8jx4n  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(374)

我已经绘制了一个正弦波在处理中把x数量的像素函数。乍一看就像一条连续的线:
正弦波看起来是连续的
但是当我增加波的振幅时,我注意到绘制的点展开了,看起来不再是连续的:
点分布处振幅增大的正弦波
我认为绘制更多的点或点之间的插值可以解决这个问题。我想知道什么是最有效的方法,使函数看起来连续的振幅或频率的任何增量。
如果有任何帮助,下面是正在处理的代码:

// 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;
  }
  }
}

谢谢!!

txu3uszq

txu3uszq1#

划一条线( 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;
}
c86crjj0

c86crjj02#

你可以使用 createShape() 处理提供的函数。to doc有一些很好的例子。
我们的想法是从 s = createShape() 在你开始循环之前 updateWave()draw() . 然后在 updateWave() 而不是创建一个 circle() 您将创建一个新的 s.vertex() 在形状上。
当你退出循环时,你可以调用 s.endShape() 然后你就可以打电话了 shape(s) 绘制由这些点创建的形状。

相关问题