Processing (处理)为什么“curveVertex”会跳过点?

Processing (处理)为什么“curveVertex”会跳过点?,processing,curve,Processing,Curve,我正在使用processing 3.5.3,我正在使用beginShape,curveVertex,endShape绘制曲线。我的窗口有1200像素宽,我正在绘制一系列具有等间距x值的点。x值之间的间距为1200/2000,小于一个像素。我知道,这是对curveVertex的严重误用,但它确实有效。每一帧都需要整整十秒钟的时间来渲染(因为我使用的是数学,而不是处理),我将每一帧保存为.png 问题是我得到的这些直线补丁应该有曲线。看起来x值的大范围延伸被跳过了。我知道它是多个顶点被跳过的,因为直

我正在使用processing 3.5.3,我正在使用
beginShape
curveVertex
endShape
绘制曲线。我的窗口有1200像素宽,我正在绘制一系列具有等间距x值的点。x值之间的间距为1200/2000,小于一个像素。我知道,这是对
curveVertex
的严重误用,但它确实有效。每一帧都需要整整十秒钟的时间来渲染(因为我使用的是数学,而不是处理),我将每一帧保存为
.png

问题是我得到的这些直线补丁应该有曲线。看起来x值的大范围延伸被跳过了。我知道它是多个顶点被跳过的,因为直线面片跨越多个x像素,最坏可能是50个像素。大多数帧都很好,但是会有一帧缺少大量补丁。你知道这是什么原因吗

编辑:下面是代码和一些显示问题的框架。最相关的部分在
draw()

float r;//重现参数
浮动dr;//每帧r的变化
int lod=2000;//曲线的详细程度
int k;//复发深度
浮动yscale=16;//按此因子缩小y轴
//从[0,1]转换为屏幕坐标
空心顶点(浮动x、浮动y){
curveVertex(x*宽度,(1-y)*高度);
}
无效设置(){
大小(1200、800);
背景(0);
中风(255);
noFill();
r=3.7;
k=30;
dr=0.0005;
}
作废提款(){
背景(0);
//制作动画
r+=dr;
如果(r>=4){
退出();
}
//绘制Xk的pdf
中风(255);
beginShape();
顶点(0,fn(0,k)/yscale);
对于(int i=0;i r/4){
返回0;
}
否则{
浮点数d=sqrt(1-4/r*x);
收益率(fn(0.5+0.5*d,n-1)+fn(0.5-0.5*d,n-1))/(r*d);
}
}
这是一个特别糟糕的画面:

我将您的代码转换为渲染到PShape,然后在PShape的顶点上迭代,以确定顶点本身是否存在(并且没有连接),或者它们是否完全缺失:

绿色的顶点--在剖面中缺少这些顶点

PShape中的
curveVertex()
仅在
P2D
渲染器模式下工作。有趣的是,在这种模式下(与默认的
JAVA2D
renderer相反),以前的直线部分不存在

…这让我看到了给定给顶点的值:我尝试将它们约束到屏幕的尺寸:

通过改变这一点:

curveVertex(x*宽度,(1-y)*高度)

为此:

curveVertex(约束(x*width,0,width),约束((1-y)*高度,0,高度))

现在我们开始了解发生了什么:

受约束@r=3.7055:

无约束@r=3.7055:

判决


该方程为某些坐标点提供了难以置信的大值,而处理,或曲线算法本身,正在跳过它们。一旦这些值被限制到一个更合理的水平,直线部分就会消失,每个点都会连接起来。

发布代码和图像输出。@Michycle发布,谢谢,我觉得有点愚蠢,我现在应该能够弄明白这一点了。谢谢你把所有的工作都放进去了。
float r; // parameter for recurence
float dr; // change in r per frame
int lod = 2000; // level of detail for curves
int k; // recurrence depth
float yscale = 16; // scale down the y-axis by this factor

// transforms from [0, 1] to screen coordinates
void vertex(float x, float y) {
  curveVertex(x * width, (1 - y) * height);
}

void setup() {
  size(1200, 800);
  background(0);
  stroke(255);
  noFill();
  r = 3.7;
  k = 30;
  dr = 0.0005;
}

void draw() {
  background(0);
  
  // animate r
  r += dr;
  if (r >= 4) {
    exit();
  }
  
  // draw the pdf of Xk
  stroke(255);
  beginShape();
  vertex(0, fn(0, k) / yscale);
  for (int i = 0; i <= lod; i++) {
    float x = i / (float)lod;
    vertex(x, fn(x, k) / yscale);
  }
  vertex(1, fn(1, k) / yscale);
  endShape();
  
  textSize(24);
  text(String.format("r = %.4f", r), 24, 24);
  
  saveFrame("output/frame_#####.png");
}

// pdf of Xn+1 = r*Xn*(1-Xn), where X0 is uniform
float fn(float x, int n) {
  if (n == 0) {
    return 1;
  }
  else if (x > r/4) {
    return 0;
  }
  else {
    float d = sqrt(1 - 4/r*x);
    return (fn(0.5 + 0.5*d, n-1) + fn(0.5 - 0.5*d, n-1)) / (r*d);
  }
}