本机和在线草图之间的不同处理渲染

Different Processing rendering between native and online sketch

当 运行 这个示例直接使用 Processing 和 Processing.js 在浏览器中使用时,我得到不同的结果。为什么?

我对我的结果很满意,想在打开的 Processing 上分享它,但渲染完全不同,我不明白为什么。下面是一个最小的工作示例。

/* Program that rotates a triange and draws an ellipse when the third vertex is on top of the screen*/

float y = 3*height/2;
float x = 3*width/2;

float previous_1 = 0.0;
float previous_2 = 0.0;
float current;
float angle = 0.0;


void setup() {
  size(1100, 500);
}

void draw() {

  fill(0, 30);

  // rotate triangle
  angle = angle - 0.02;
  translate(x, y); 
  rotate(angle); 

  // display triangle
  triangle(-50, -50, -30, 30, -90, -60);

  // detect whether third vertex is on top by comparing its 3 successive positions
  current = screenY(-90, -60); // current position of the third vertex

  if (previous_1 < previous_2 && previous_1 < current) {
    // draw ellipse at the extrema position
    fill(128, 9, 9);
    ellipse(-90, -60, 7, 10); 
  }

  // update the 2 previous positions of the third vertex
  previous_2 = previous_1;
  previous_1 = current;
}

问题出在screenY函数上。在本地和在线打印处理草图中的 current 变量。在 OpenProcessing 中,变量 current 快速增长到数千以上,而它在本地保持在 0 到 ~260 之间。

似乎 OpenProcessing 在这个函数中有一个错误。

然而,要解决此问题,我建议您在圆的顶部绘制三角形时以不同的方式注册,例如使用角度变量:

// Calculate angle and modulo it by 2 * PI
angle = (angle - 0.02) % (2 * PI);

// If the sketch has made a full revolution
if (previous_1 < previous_2 && previous_1 < angle) {
    // draw ellipse at the extrema position
    fill(128, 9, 9);
    ellipse(-90, -60, 7, 10); 
}

// update the 2 previous angles of the third vertex
previous_2 = previous_1;
previous_1 = angle;

但是,由于三角形的绘制方式,椭圆的角度约为 PI / 3。要解决此问题,一种选择是将屏幕旋转 angle + PI / 3,如下所示:

rotate(angle + PI / 3);

您可能需要多尝试一下角度偏移,才能在圆的顶部完美绘制椭圆。

为了在线获得与通过 运行 本地处理获得的相同结果,您需要在调用 size

时将渲染模式指定为 3d

例如:

void setup() {
  size(1100, 500, P3D);
}

您还需要在调用 screenY()

时指定 z 坐标
current = screenY(-90, -60, 0);

通过这两项更改,您在线获得的结果应该与本地获得的结果相同 运行。

在线:

Triangle Ellipse Example

本地: