Итак, у вас есть отрезок линии (AB), и я понял, что отрезок линии движется, и вы хотите знать, в какой точке отрезок линии столкнется с другим отрезком линии (вашим кораблем и т. Д.).
С математической точки зрения вам нужно проверить, пересекаются ли две линии (две линии всегда пересекаются, если они не параллельны), а затем проверить, находится ли точка, где они пересекаются, на вашем экране.Сначала вам нужно преобразовать отрезки в линейные уравнения, примерно так:
typedef struct {
GLfloat A;
GLfloat B;
GLfloat C;
} Line;
static inline Line LineMakeFromCoords(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {
return (Line) {y2-y1, x1-x2, (y2-y1)*x1+(x1-x2)*y1};
}
static inline Line LineMakeFromSegment(Segment segment) {
return LineMakeFromCoords(segment.P1.x,segment.P1.y,segment.P2.x,segment.P2.y);
}
Затем проверьте, пересекаются ли они
static inline Point2D IntersectLines(Line line1, Line line2) {
GLfloat det = line1.A*line2.B - line2.A*line1.B;
if(det == 0){
//Lines are parallel
return (Point2D) {0.0, 0.0}; // FIXME should return nil
}else{
return (Point2D) {(line2.B*line1.C - line1.B*line2.C)/det, (line1.A*line2.C - line2.A*line1.C)/det};
}
}
Point2D даст вам точку пересечения, конечно, выВам нужно проверить свой линейный сегмент на всех линейных сегментах корабля, что может занять немного времени, это были поля столкновения и т. д. введите картинку.
Математика - все в Википедии, проверьте там, если вам нужно большеinfo.
Редактировать:
Дополнение для последующего комментария:
То же, что и раньше, проверять ваш сегмент на столкновение со всеми четырьмя сегментамипрямоугольник, вы получите один из 3 случаев:
- На экране нет точки столкновения / столкновения (помните, что тесты столкновения направлены против линий, а не сегментов линий, и линии всегда будут пересекаться, если они не параллельны), насмешкаПропал игрок: -)
- Одно столкновение, нарисуйте / сделайте все, что вы хотите, сегмент, который вы запрашиваете, будет AC (точка столкновения C)
Два столкновения, проверьтеразмер каждого результирующего сегмента (A-C1) и (A-C2), используя что-то вроде приведенного ниже кода, и оставьте один с самым коротким размером.
static inline float SegmentSizeFromPoints(Vertice3D P1, Vertice3D P2) {
return sqrtf(powf((P1.x - P2.x),2.0) + pow((P1.y - P2.y),2.0));
}
Хитрый битпри работе со столкновениями выясняется, как минимизировать количество тестов, которые вы должны выполнить.