(处理)为什么 `curveVertex` 会跳点?
(processing) why is `curveVertex` skipping points?
我正在使用处理 3.5.3,我正在使用 beginShape
、curveVertex
、endShape
绘制曲线。我的 window 是 1200 像素宽,我正在绘制一系列具有均匀 spaced x 值的点。 x值之间space为1200/2000,小于一个像素。我知道,这是对 curveVertex
的严重滥用,但它确实有效。每一帧都需要整整十秒来渲染(因为我使用的数学,而不是因为处理),我将每一帧保存为 .png
.
问题是我在应该有曲线的地方得到了这些直的补丁。看起来大段的 x 值被跳过了。我知道它会跳过多个顶点,因为直的补丁跨越多个 x 像素,最坏的情况下可能是五十个左右。大多数帧都很好,但会有一帧缺少大量补丁。知道是什么原因造成的吗?
编辑:这是显示问题的代码和一些框架。最相关的部分在 draw()
.
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);
}
}
这是一个特别糟糕的框架:
我将您的代码转换为 PShape,然后遍历 PShape 的顶点以确定顶点本身是否存在(并且没有连接起来),或者它们是否完全缺失:
绿色顶点 -- 它们在截面中缺失。
PShape 中的 curveVertex()
仅适用于 P2D
渲染器模式。有趣的是,在这种模式下(与默认 JAVA2D
渲染器相反)以前的直线部分不存在...
...这让我查看了赋予顶点的值:我尝试将它们限制在屏幕的尺寸范围内:
通过改变这个:
curveVertex(x * width, (1 - y) * height);
进入这个:
curveVertex(constrain(x * width, 0, width), constrain((1 - y) * height, 0, height));
现在我们开始了解发生了什么:
约束 @ r = 3.7055:
不受约束 @ r = 3.7055:
判决
方程式为某些坐标点提供了非常大的值,Processing 或曲线算法本身正在跳过它们。一旦将值限制到更合理的水平,直线部分就会消失,每个点都会连接起来。
我正在使用处理 3.5.3,我正在使用 beginShape
、curveVertex
、endShape
绘制曲线。我的 window 是 1200 像素宽,我正在绘制一系列具有均匀 spaced x 值的点。 x值之间space为1200/2000,小于一个像素。我知道,这是对 curveVertex
的严重滥用,但它确实有效。每一帧都需要整整十秒来渲染(因为我使用的数学,而不是因为处理),我将每一帧保存为 .png
.
问题是我在应该有曲线的地方得到了这些直的补丁。看起来大段的 x 值被跳过了。我知道它会跳过多个顶点,因为直的补丁跨越多个 x 像素,最坏的情况下可能是五十个左右。大多数帧都很好,但会有一帧缺少大量补丁。知道是什么原因造成的吗?
编辑:这是显示问题的代码和一些框架。最相关的部分在 draw()
.
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);
}
}
这是一个特别糟糕的框架:
我将您的代码转换为 PShape,然后遍历 PShape 的顶点以确定顶点本身是否存在(并且没有连接起来),或者它们是否完全缺失:
curveVertex()
仅适用于 P2D
渲染器模式。有趣的是,在这种模式下(与默认 JAVA2D
渲染器相反)以前的直线部分不存在...
...这让我查看了赋予顶点的值:我尝试将它们限制在屏幕的尺寸范围内:
通过改变这个:
curveVertex(x * width, (1 - y) * height);
进入这个:
curveVertex(constrain(x * width, 0, width), constrain((1 - y) * height, 0, height));
现在我们开始了解发生了什么:
约束 @ r = 3.7055:
不受约束 @ r = 3.7055:
判决
方程式为某些坐标点提供了非常大的值,Processing 或曲线算法本身正在跳过它们。一旦将值限制到更合理的水平,直线部分就会消失,每个点都会连接起来。