![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм заливки [D7]
hgd © (2006-07-10 19:59:00)Подскажите, алгоритм для заливки области с пороговым значением слоя. Как в Photoshop-е выделение волшебной палочкой!
grouzd)ev (2006-07-11 20:49:00) [1]http://algolist.manual.ru/maths/graphs/shortpath/или "волновой алгоритм" в поисковике
ну а рекурсию проходят еще в школе =)
---
... we are walking on a thin line and you better avoid the risk ...
hgd (2006-07-11 20:30:00) [2]А пример есть или его суть?
grouzd)ev (2006-07-11 19:09:00) [3]думаю обычный волновой. хотя можно не парится и сделать за 3 минуты через рекурсию =) впрочем, может я ошибаюсь
---
... we are walking on a thin line and you better avoid the risk ...
hgd (2006-07-11 16:20:00) [4]А что это за алгоритм flood fill?
miek (2006-07-11 08:04:00) [5]Обычный алгоритм flood fill, только с проверкой каждого пиксела не на цвет, а на пороговое правило...
antonn (2006-07-11 05:31:00) [6]связная - это как в пайнте заливка?
hgd (2006-07-10 21:47:00) [7]Ну имеется ввиду пороговое значение заливки, как в Photoshop. Например нажимаем на пиксель X,Y и затем закрашивается связная область от X,Y по заданному порогу.
antonn (2006-07-10 20:44:00) [8]что такое пороговое значение?
по каналам (Lr,Lg,Lb - каналы RGB, _b - куда заливать, ниже уровня или выше):
procedure PrepareBitmapLevel(_B_out:Tbitmap; Lr,Lg,Lb:byte; _b:boolean);
const Pixels = MaxInt div SizeOf(TRGBTriple);
type PRGBArray = ^TRGBArray;
TRGBArray = array[0..Pixels-1] of TRGBTriple;
var x, y: Integer; RowOut: PRGBArray;
begin
_B_out.PixelFormat:=pf24bit;
for y:=0 to _B_out.Height-1 do begin
RowOut:= _B_out.ScanLine[y];
for x:=0 to _B_out.Width-1 do begin
if (RowOut[x].rgbtRed>Lr)and(RowOut[x].rgbtGreen>Lg)and(RowOut[x].rgbtBlue>Lb)and(_ b) then begin
RowOut[x].rgbtRed:=255;
RowOut[x].rgbtGreen:=255;
RowOut[x].rgbtBlue:=255;
end else
if (RowOut[x].rgbtRed<Lr)and(RowOut[x].rgbtGreen<Lg)and(RowOut[x].rgbtBlue<Lb)and not(_b) then begin
RowOut[x].rgbtRed:=255;
RowOut[x].rgbtGreen:=255;
RowOut[x].rgbtBlue:=255;
end;
end;
end
end;