Столкновение двух форм - PullRequest
1 голос
/ 21 июня 2020

Я работал над анимацией при обработке. Но у меня есть вопрос по приведенному ниже коду:

Итак, вы можете видеть на выходе, мяч летит повсюду в окне. Я хочу сделать преграду для мяча. Мяч может пройти из middle, но если он попадает в линию, он летит куда-то со скоростью (int)random(1, 3).

Как это сделать? Вот изображение того, чего я хотел бы достичь:

Ответы [ 3 ]

3 голосов
/ 21 июня 2020

Один из способов сделать это - проверить на предмет столкновения, когда мяч проходит через середину, особенно когда скорость мяча заставит y пройти от height / 2.

Что-то вроде этого :

if (((y < height/2 && y+dirY > height/2) || (y > height/2 && y+dirY < height/2)) && (x < width/2-middle || x > width/2+middle)){
   dirY = (int) random (1,3);
   dirX = (int) random (1,3);
}

(Более подходящим решением было бы создать столкновение, когда край шара пересекает барьер, но я оставлю это на ваше усмотрение)

2 голосов
/ 21 июня 2020

Я не буду писать код, но расскажу, как его вычислить, это не так уж и сложно.

Взятый круг, мы знаем центр и радиус.

На взятой линии мы знаем начальную и конечную точки.

  1. Линия пересекает круг, если расстояние от них center до startpoint или endpoint меньше radius (например, находится внутри круга)
  2. Линия пересекает круг, если startpoint X находится слева от центра (sX endpoint X справа (eX> cX), а расстояние между ними Y и center Y меньше radius (cY - sY

Обратите внимание, что это действительно применимо только в вашем простом случае с горизонтальной линией. Обычно лучше работать с вычислениями векторов, например, для определения расстояния от центра до линии. Это позволит вам работать с диагональными линиями и т. Д. c.

1 голос
/ 21 июня 2020

Для вашей игрушечной модели самый простой способ справиться со столкновениями - это рассмотреть зону столкновения. Итак,

  1. Establi sh зона столкновения ограничивает x1, x2, y1, y2. Когда центр мяча входит в эту зону, применяются правила столкновения.
  2. Учитывайте эластичность c столкновения: ваш мяч сталкивается только с горизонтальной линией, поэтому может быть затронута только вертикальная составляющая скорости, и это никогда не теряет скорость.
  3. Рассмотрите возможность тестирования вашей игрушечной модели с хорошим набором начальных условий, чтобы вы могли обнаружить любые артефакты из-за малости вашей модели, значений, которые вы используете, и так далее. (Я изменил начальное положение мяча на случайное начальное положение, запустил модель несколько раз, чтобы увидеть, как она ведет себя при разных начальных условиях).
int dirX = (int)random(1, 3);
int dirY = (int)random(1, 3);
//int x = 20, y = 20;
int middle = 20;

int x = (int)random(20, 180);
int y = (int)random(20, 80);
int x1, x2, y1, y2;

void setup() {
  size(200,200);
  // collision zone limits
  x1 = (width/2 - middle) + 20/2 - 1; // 89
  x2 = (width/2 + middle) - 20/2 + 1; // 111
  y1 = height/2 - 20/2 + 1; // 91
  y2 = height/2 + 20/2 - 1; // 109
}

void draw() {
  background(255);
  ellipse(x, y, 20, 20);
  line(0, height/ 2, width/2 - middle, height/2); // (0, 100, 80, 100)
  line(width/2 + middle, height/2, width, height/2); // (120, 100, 200, 100)
  
  x += dirX;
  y += dirY;

  if (x > width || x < 0)
    dirX *= -1;
  if (y > height || y < 0)
    dirY *= -1;

  if ((x < x1 && y > y1 && y < height/2 && dirY > 0) || // upper left and going down
      (x < x1 && y > height/2 && y < y2 && dirY < 0) || // lower left and going up
      (x > x2 && y > y1 && y < height/2 && dirY > 0) || // upper right and going down
      (x > x2 && y > height/2 && y < y2 && dirY < 0))   // lower right and going up
    dirY *= -1;
}

Для более сложной модели, вы можете рассмотреть более сложные ситуации, такие как, например, обратное столкновение из-за концов линий, столкновение контура шара с линиями и т. д. c.

...