svvВозможно, ошибаюсь, но у Павлидиса не нашел своей задачи.
На всякий случай, уточню: мне нужно не определить, принадлежит ли точка прямоугольнику или нет, а оптимизировать алгоритм поиска точек, принадлежащих ему. Т.е. не банально проверять всю плоскость (желтый цвет) на принадлежность каждой ее точки, а как-то уменьшить количество проверяемых точек, если это возможно
Пока же мне удалось уменьшить количество проверяемых точек так:
Код:
middleY := (topY + bottomY) div 2;
for y := topY to middleY do begin // проверка верхней половины сверху вниз
for x := topX downto leftX do
if PointInRect(x, y) then AddToPointsList(x, y) else Break;
for x := topX to rightX do
if PointInRect(x, y) then AddToPointsList(x, y) else Break;
end;
for y := bottomY downto middleY+1 do begin // проверка нижней половины снизу вверх
for x := bottomX downto leftX do
if PointInRect(x, y) then AddToPointsList(x, y) else Break;
for x := bottomX to rightX do
if PointInRect(x, y) then AddToPointsList(x, y) else Break;
end;
т.е. прямоугольник делится пополам по вертикали, затем сначала проверяется верхняя половина, начиная с верхней вершины влево-вправо и вниз, а потом нижняя - с нижней вершины влево-вправо и вверх.
Можно ли еще что-то сделать для оптимизации?