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

Posted

技术标签:

【中文标题】处理(Java):当函数的幅度增加时,如何使绘制的正弦函数看起来是连续的而不是单独的点【英文标题】:Processing (Java): How to make a plotted sine function look continuous instead of separate dots when the amplitude of the function increases 【发布时间】:2021-03-03 19:44:10 【问题描述】:

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

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;
  
  

谢谢!!

【问题讨论】:

你可以在前一点和当前点之间画一条线。 【参考方案1】:

在 2 个连续点之间画一条线 (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;

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于处理(Java):当函数的幅度增加时,如何使绘制的正弦函数看起来是连续的而不是单独的点的主要内容,如果未能解决你的问题,请参考以下文章

matlab绘制图像的幅度谱 相位谱

当 NPC 向左或向右走时,如何使动画匹配?

FFT后如何得到幅度和对应的频率

如何使用 python 绘制整个音频文件的频谱或频率与幅度的关系?

R语言绘制物种累计曲线

matlab绘制正弦函数幅度调制初步Inner matrix dimensions must agree错误