Я хочу написать функцию смещения для проверки того, что движущийся объект касается других подвижных и неподвижных объектов в пространстве.
Чтобы проверить это, мне нужно посмотреть, пересекаются ли их ограничивающие стороны.
Я бы хотел проверить, касаются ли два подвижных объекта так:
Стол автомобильный
- id: целое число (первичный autoinc)
- прямоугольник: Линия
- ...
Расположение таблицы
- id: целое число (первичное значение autoinc)
- car_id: целое число
- car_date: date
- car_pos: точка
- ...
FUNCTION MyDB.OffsetRect(pLineString GEOMETRY, pOffset POINT)
RETURNS geometry
BEGIN<br>
declare Result LineString;<br>
declare P1 Point;<br>
declare P2 point;<br>
declare P3 point;<br>
declare P4 point;<br>
set Result = ENVELOPE(pLineString); /<em>Make sure we are dealing with a rect</em>/<br>
set P1 = POINTN(Result,1);<br>
set p1 = Point(X(p1)+X(pOffset),Y(p1)+Y(pOffset));<br>
set P2 = POINTN(Result,2);<br>
set p2 = Point(X(p2)+X(pOffset),Y(p2)+Y(pOffset));<br>
set P3 = POINTN(Result,3);<br>
set p3 = Point(X(p3)+X(pOffset),Y(p3)+Y(pOffset));<br>
set P4 = POINTN(Result,4);<br>
set p4 = Point(X(p4)+X(pOffset),Y(p4)+Y(pOffset));<br>
set Result = LineString(p1,p2,p3,p4);<br>
RETURN Result;<br>
END
Но я застрял в том, какой запрос использовать, чтобы увидеть, пересекаются ли две машины во времени.
что-то вроде.
SELECT location.id, location2.id FROM location
INNER JOIN car ON (car.id = location.car_id)
INNER JOIN location location2 ON (location.id <> location2.id)
INNER JOIN car car2 ON (car2.id = location2.car_id AND car.id <> car2.id)
WHERE location.car_date BETWEEN date_sub(now(),INTERVAL 1 DAY) AND date_add(now(),INTERVAL 1 DAY)
AND location2.car_date BETWEEN date_sub(now(),INTERVAL 1 DAY) and date_add(now(),INTERVAL 1 DAY)
AND MBRIntersects(OffsetRect(car.rect,location.car_pos),OffsetRect(car2.rect,location2.car_pos));
Однако это не работает, что не так?