Для вашей игрушечной модели самый простой способ справиться со столкновениями - это рассмотреть зону столкновения. Итак,
- Establi sh зона столкновения ограничивает x1, x2, y1, y2. Когда центр мяча входит в эту зону, применяются правила столкновения.
- Учитывайте эластичность c столкновения: ваш мяч сталкивается только с горизонтальной линией, поэтому может быть затронута только вертикальная составляющая скорости, и это никогда не теряет скорость.
- Рассмотрите возможность тестирования вашей игрушечной модели с хорошим набором начальных условий, чтобы вы могли обнаружить любые артефакты из-за малости вашей модели, значений, которые вы используете, и так далее. (Я изменил начальное положение мяча на случайное начальное положение, запустил модель несколько раз, чтобы увидеть, как она ведет себя при разных начальных условиях).
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.