Задача вроде простая тем более что часть работы уже проведана при выборе фигуры ...
То есть сразу есть точка достоверно принадлежащая выбираемой фигуре (+ как, возможно помните, есть растровая маска фигуры )
Пока грубо сделал вот так (код вполне работает но увы недостаточно быстро) :
- Код: Выделить всё
// Номер команды по клику
// и поиск границ...
Function GetCMDOnClik(X,Y:Longint):Longint;
Var
B:TBitmap;
C,i,X1,Y1:longint;
R:Trect;
XF,YF:byte;
begin
..
Тут идет не относящийся делу код для определения принадлежности точки конкретной
фигуре...
...
if b.Canvas.Pixels[X,Y]<>$f2 then
begin
//Дополнительно определение границ
// текущей фигуры
{-------------------}
R.Left:=b.Width;R.Top:=b.Height;
r.Right:=0;r.Bottom:=0;
YF:=0;// чуть "оптимизации" уже добавил
// пустые линии не сканирует
// но вообще-то это наверное не верное решение
// потому что фигура вполне может иметь разрыв по вертикали
for Y1:=Y to b.Height-1 do begin
if YF <>0 then YF:=2;
for X1:=0 to b.Width-1 do
if b.Canvas.Pixels[X1,Y1]<>$f2 then
begin
YF:=1;
If Y1<R.Top then R.Top:=Y1;
If X1<R.Left then R.Left:=x1;
If X1>R.Right then R.Right:=x1;
If Y1>R.Bottom then R.Bottom:=Y1;
end;
If YF>1 then break;
end;
YF:=0;
for Y1:=Y downto 0 do begin
if YF <>0 then YF:=2;
for X1:=b.Width-1 downto 0 do
if b.Canvas.Pixels[X1,Y1]<>$f2 then
begin
YF:=1;
If Y1<R.Top then R.Top:=Y1;
If X1<R.Left then R.Left:=x1;
If X1>R.Right then R.Right:=x1;
//If Y1>R.Bottom then R.Bottom:=Y1;
end;
If YF>1 then break;
end;
CurRec:=R;
FCurRec:=True;
Result:=I;
break;
end;
И так первое: что напрашивается для дальнейшей оптимизации это отказ от доступа через канвас
( например можно организовать доступ через RawImage )
Но сомневаюсь что выигрыш в производительности будет значительным .
Второе: механика редактора в принципе позволяет упрятать поиск границ в отдельный поток и не ждать его завершения (если ничего не изменилось использовать данные если изменилось или бросить и запустить поиск по новой или игнорировать полученный результат )
Но мне интересует: нет ли чисто АЛГОРИТМИЧЕСКОЙ ОПТИМИЗАЦИИ подобного поиска ?