проверка края для кругового движения - PullRequest
2 голосов
/ 04 июля 2019

Я хочу, чтобы моя точечная программа развернулась, когда они достигли края

, поэтому в основном я просто вычисляю x = width/2+cos(a)*20; y = height/2+sin(a)*20;, это делает круговое движение.так что я хочу сделать этот поворот, проверив край.я также уже убедился, что вы достигли условия if с помощью команды println

class particles {
float x, y, a, r, cosx, siny;
particles() {
x = width/2; y = height/2; a = 0; r = 20;
}
void display() {
ellipse(x, y, 20, 20);
}
void explode() {
a = a + 0.1;
cosx = cos(a)*r;
siny = sin(a)*r;
x = x + cosx;
y = y + siny;
}

void edge() {
if (x>width||x<0) cosx*=-1;
if (y>height||y<0) siny*=-1;
 }
}   
//setup() and draw() function

particles part;
void setup(){
size (600,400);
part = new particles();
}
void draw(){
background(40);
part.display();
part.explode();
part.edge();
}

, они просто игнорируют условие if

1 Ответ

3 голосов
/ 04 июля 2019

С вашей проверкой проблем нет, проблема в том, что, вероятно, в следующий раз после draw() вы игнорируете то, что сделали в ответ на проверку, сбрасывая значения cosx и siny.

Я рекомендую создать две новые переменные, dx и dy ("d" для "направления"), которые всегда будут либо +1 и -1, и изменят эти переменные вответ на ваш край проверки.Вот минимальный пример:

float a,x,y,cosx,siny;
float dx,dy;

void setup(){
  size(400,400);
  background(0);
  stroke(255);
  noFill();
  x = width/2; 
  y = height/2;
  dx = 1;
  dy = 1;
  a = 0;
}

void draw(){
  ellipse(x,y,10,10);
  cosx = dx*20*cos(a); 
  siny = dy*20*sin(a);
  a += 0.1;
  x += cosx; 
  y += siny;
  if (x > width || x < 0)
    dx = -1*dx;

  if (y > height || y < 0)
    dy = -1*dy;
}

Когда вы запустите этот код, вы увидите круги, отскакивающие от краев:

enter image description here

...