Войти
ПрограммированиеФорум2D графика и изометрия

Circle and Wall

#0
14:59, 14 сен. 2014

Привет народ! Вопрос: как зная координаты центра окружности (x,y), радиус (r) и координаты начала и конца прямой (x1, y1) (x2, y2) реализовать алгоритм отскока окружности от прямой при соударении?


#1
15:07, 14 сен. 2014

Как один из вариантов. У окружности есть вектор движения. По двум точка можно построить уравнение прямой и получить нормальный вектор этой прямой.
Проверяешь если от центра окружности(x, y) до прямой расстояние <= r то ты делаешь reflect вектора движения окружности относительно нормали прямой.
Нормаль можно получить еще след. образом  v = (x2  - x1, y2 - y1). n1 = (-Vy, Vx) или n2 = (Vy, -Vx) смотря куда именно должна быть направлена нормаль.

#2
23:35, 14 сен. 2014

Так пойдет?

bool CD_CircleAndWall(const vec2d&pos,vec2d&v,const real&r,const vec2d&a,const vec2d&b){
  if(abs((pos-a).Rot(b-a).y)>r)return false;
  if((pos-a).Rot(b-a).x<0)return false;
  if((pos-a).Rot(b-a).x>(b-a).Mag())return false;
  if(Sign(v.Rot(b-a).y)==Sign((pos-a).Rot(b-a).y))return false;
  v=vec2d(v.Rot(b-a).x,-v.Rot(b-a).y).UnRot(b-a);return true;
}

circleandwall | Circle and Wall
Скачать: DemoCircleAndWall
Сделано на QapLite

#3
1:35, 15 сен. 2014

KVADRO
Adler
Спасибо, за ответы. Пробую перепилить пример программы.

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.