Problem drawling points around rotating plane in Processing?

Ietpt123 :

I'm prototyping a script to plot equally spaced points around a rotating plane and Processing is producing unexpected results?


This is my code:

int WHITE = 255;
int BLACK = 0;

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

void draw() {
    background(WHITE);
    translate(width/2, height/2); // move origin to center of window

    // center ellipse
    noStroke();
    fill(255, 0, 0);
    ellipse(0, 0, 10, 10); // center point, red

    // satellite ellipses
    fill(BLACK);
    int points = 4;
    for (int i = 0; i < points; i++) {
        rotate(i * (TWO_PI / points));
        ellipse(0, 100, 10, 10); // after plane rotation, plot point of size(10, 10), 100 points above y axis
    }
}

When points = 4 I get the output I would expect, but when points = 5 // also when points = 3 or > 4, I get an output that is missing plotted points but still spaced correctly.

Why is this happening?

Mike 'Pomax' Kamermans :

You're rotating too much: you don't want to rotate by i * angle at every iteration, because if we do we end up rotating so much that points end up overlapping. For example, with the code as is, with 3 points we want to place them at 0, 120, and 240 degrees (or, 120, 240, 360). But that's not what happens:

  • when i=0 we rotate by 0 degrees. So far so good.
  • when i=1 we rotate by 120 degrees on top of 0. Still good.
  • when i=2 we rotate by 240 degrees on top of 120. That's 120 degrees too far!

That's clearly not what we want, so just rotate by the fixed angle TAU / points and things'll work as expected:

for (int i = 0; i < points; i++) {
  rotate(TAU / points);
  ellipse(0, 100, 10, 10);
}

Alternatively, keep the incrementing angle, but then place the points without using rotate(), by using trigonometry to compute the placement:

float x = 0, y = 100, nx, ny, angle;
for (int i = 0; i < points; i++) {
  angle = i * TAU / points;
  nx = x * cos(a) - y * sin(a);
  ny = x * sin(a) + y * cos(a); 
  ellipse(nx, ny, 10, 10);
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=142465&siteId=1