Я делаю платформерную игру на C ++, используя библиотеки SFML и Box2D.
У игрока есть пистолет, я пытаюсь осуществить стрельбу.
Box2D имеет функцию RayCast, которая нуждается в двух позициях для проверки пересечений между ними.
У меня есть положение игрока и положение мыши. В настоящее время грань между этими двумя не идеальна.
Мне нужна третья позиция, то есть позиция, где выстрел из пистолета закончится.
Расстояние между позицией игрока и третьей позицией всегда должно быть 1000.
Математика довольно проста. Рассмотрим следующую строку, A и B — ваши известные точки (A — источник сегмента, т. Е. Ваш игрок), а C — третья точка, которую вы ищете:
A-----------B------------C
(Xa,Ya) (Xb,Yb) (Xc,Yc)
Теперь расстояния:
AB = sqrt( (Xb - Xa)² + (Yb - Ya)² )
AC = 1000
Кросс-умножить, чтобы получить Xc:
AB -> Xb - Xa
AC -> Xc - Xa
Xc - Xa = AC * (Xb - Xa) / AB
Xc = Xa + (AC * (Xb - Xa) / AB)
Так же, Yc = Ya + (AC * (Yb - Ya) / AB)
Обратите внимание, что это также работает, если C находится между A и B, единственное (очевидное) ограничение — если A и B — одна и та же точка (AB = 0
, не передает информацию о направлении и справедливо дает деление на ноль).
Других решений пока нет …