Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  23:59[Войти] | [Зарегистрироваться]
Ответ на вопрос № 76941

12-05-2010 01:52
Всем здраси.
Подскажите, как можно сделать быстрее.

Image1.Canvas.FloodFill(strtoint(x1),strtoint(y1),0,fsBorder);
a:=0;
For x:=0 to 225 do
  Begin
  For y:=0 to 225 do
    Begin
    if Image1.Canvas.Pixels[x,y] =clred then
      a:=a+1;
    end
  end;
r:=inttostr(a);
repeat
  if length(r)<7 then
  r:='0'+r;
until length(r)=7 ;
Richedit1.Lines.Add(r);

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

23-06-2010 01:14
Переделал код. Ввёл приделы для поиска. Но до конца доделать, лень.
Выкладываю, может каму пригодиться. Что-то типа программы распознания,изображения.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Image1: TImage;
    Image2: TImage;
    RichEdit1: TRichEdit;
    RichEdit2: TRichEdit;
    Timer1: TTimer;
    TabSheet2: TTabSheet;
    RichEdit3: TRichEdit;
    Image3: TImage;
    RichEdit4: TRichEdit;
    procedure risov(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  str,s:string;
  PZUv,r,s1,r1:string;//Вход нейронов
  a:array [-1..300,-1..300]of string;
  //b:array [1..500,1..7]of string;
  PZU:array[1..3,1..3] of string;//Вход нейронов
  OZU:array[0..500]of string;//Вход нейронов
  k:integer;
implementation

{$R *.dfm}


procedure TForm1.risov(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
n: string;
begin
if  GetAsyncKeyState(VK_SPACE           )<>0 then
begin
    x:=trunc(X/3);
    y:=trunc(y/3);
    image2.Canvas.Pixels[x,y]:=0;
    image1.Canvas.Ellipse(x*3+1,y*3+1,x*3-1,y*3-1);
//Нахождение кода-напавления вектора проходащего через две точки
    //Точка 01
    n:=a[x,y];
    if length(n)<4 then
    a[x,y]:='1000'
    else
    begin
      a[x,y][1]:= '1';
    end;
    //Точка 05
    n:=a[x-1,y];
    if length(n)<4 then
    a[x-1,y]:='0100'
    else
    begin
      a[x-1,y][2]:= '1';
    end;
    //Точка 10
    n:=a[x,y-1];
    if length(n)<4 then
    a[x,y-1]:='0010'
    else
    begin
      a[x,y-1][3]:= '1';
    end;
    //Точка 20
    n:=a[x-1,y-1];
    if length(n)<4 then
    a[x-1,y-1]:='0001'
    else
    begin
      a[x-1,y-1][4]:= '1';
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
richedit1.Clear;
richedit2.Clear;
richedit3.Clear;
richedit4.Clear;
s:='1';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
x,y:integer;
x1,y1:integer;
xmin,xmax,ymin,ymax:integer;
n,nn:string;
i,j,npp,m:integer;//Вход нейронов
begin
image3.Picture:=nil;
image1.Enabled:=false;
richedit1.Clear;
richedit2.Clear;
richedit3.Clear;
richedit4.Clear;
str:='';
xmin:=300;
xmax:=0;
ymin:=300;
ymax:=0;
n:='';
npp:=1;
for y1:=1 to 300 do
  for x1:=1 to 300 do
  if (length(a[x1,y1])=4)and (a[x1,y1]<>'1001')and (a[x1,y1]<>'0110')and (a[x1,y1]<>'1111')then
    begin
    x:=x1;
    y:=y1;
    image3.Canvas.MoveTo(x*3,y*3);
    repeat
    n:=a[x,y];
    if (n<>'0110')and (n<>'1001') then
      a[x,y]:=a[x,y]+'1';
      if (n<>'0110')and (n<>'1001') then //Отсикают деаганали
      begin
      if (n[4]='1')and (n[3]='0'then
      begin
        y:=y+1;
      end;
      if (n[2]='1')and (n[4]='0'then
      begin
        x:=x+1;
      end;
      if (n[1]='1')and (n[2]='0'then
      begin
        y:=y-1;
      end;
      if (n[3]='1')and (n[1]='0'then
      begin
        x:=x-1
      end;
      end//Отсикают деаганали
      else//Работа с диоганалями
      begin
      if n='0110' then //15
      begin
      if (nn[4]='1')and (nn[3]='0'then //20
      begin
        x:=x+1;
        n:='0100';
      end;
      if (nn[1]='1')and (nn[2]='0'then// 1
      begin
        x:=x-1;
        n:='0010';
      end;
      end;//Конец 15
      if n='1001' then //21
      begin
      if (nn[3]='1')and (nn[1]='0'then //10
      begin
        y:=y+1;
        n:='0001';
      end;
      if (nn[2]='1')and (nn[4]='0'then//5
      begin
        y:=y-1;
        n:='1000';
      end;
      end;//Конц 21
      end;//Конец работы с диоганалями
      image3.Canvas.LineTo(x*3,y*3);
      if x<xmin then
      xmin:=x;
      if x>xmax then
      xmax:=x;
      if y<ymin then
      ymin:=y;
      if y>ymax then
      ymax:=y;
    str:=str+inttostr(strtoint(n[1])+strtoint(n[2])+strtoint(n[3])+strtoint(n[4]));
    nn:=n;
    until (x1=x) and (y1=y);
    nn:='0';
    image3.Canvas.Pixels[x1*3,y1*3]:=clred;
    //RichEdit1.Lines.Add('1 '+str);
////////// Начало выходов нейронов ///////////
      repeat
      i:=pos('22',str);
      if i<>0then
      begin
        delete(str,i,1);
      end;
      until i=0;
      k:=1;
      r:=inttostr(trunc(10000/length(str))*length(str));
      repeat
      if length(r)<5then
        r:='0'+r;
      until length(r)=5;
      repeat
      if length(s)<5 then
        s:='0'+s;
      until length(s)=5;
////////////Запис в ПЗУв////////////////////
      repeat
      i:=strtoint(str[k]);
      if k<>length(str)then
        j:=strtoint(str[k+1])
      else
        j:=strtoint(str[1]);
      PZUv:=PZU[i,j];
      //RichEdit3.Lines.Add(inttostr(i)+' '+inttostr(j)+' '+ PZU[i,j]);///
////////////Запис в ПЗУв////////////////////
/////////////ПЗУ = ОЗУ /////////////////////
      for m:=1 to 499 do
      begin
        s1:=copy(OZU[m],1,5);
        if length(OZU[m])<10then
        break;
      if pos(s1,PZUv)<>0 then
        begin
        r1:=copy(OZU[m],7,5);
        delete(OZU[m],7,6);
        r1:=inttostr(strtoint(r1)+strtoint(copy(PZUv,pos(s,PZUv)+7,5)));
        delete (PZUv,1,12);
        if strtoint(r1)>99999 then
          r1:='99999';
        repeat
          if length(r1)<5then
          r1:='0'+r1;
        until length(r1)=5;
        OZU[m]:=OZU[m]+r1+' ';
        end;
      end;
/////////////ПЗУ = ОЗУ /////////////////////
////////////////ОЗУ НЕ= ПЗУ ////////////////
      for m:=1 to 499 do
      if length(OZU[m])<10 then
        if length(PZUv)>10 then
        begin
          OZU[m]:=copy(PZUv,1,12);
          delete (PZUv,1,12);
        end
        else
        break;
///////////////ОЗУ НЕ= ПЗУ ///////////////
      k:=k+1;
      until k >length(str); 
//////////////Запись входов нейронов//////////////////////
      OZU[0]:='';
      for m:=1 to 499 do
      if length(OZU[m])>10 then
        begin
        r1:= copy(OZU[m],7,5);
        if (strtoint(r1)<11000) and (strtoint(r1)>9900)then
          OZU[0]:=OZU[0]+OZU[m];
        OZU[m]:='';
        end
      else
        break; 
    ///////////Запись в пзу///////////
    if (strtoint(r)<11000) and (strtoint(r)>9900)then
      if pos(r,OZU[0])=0 then
      begin
        OZU[0]:=OZU[0]+s+' '+r+' ';
        k:=1;
        repeat
        i:=strtoint(str[k]);
        if k<>length(str)then
          j:=strtoint(str[k+1])
        else
          j:=strtoint(str[1]);
        r1:=inttostr(trunc(10000/length(str)));
        repeat
          if length(r1)<5then
          r1:='0'+r1;
        until length(r1)=5;
        if pos(r1,PZU[i,j])=0 then
          begin
          PZU[i,j]:=PZU[i,j]+s+' '+r1+' ';
          npp:=2;
          end;
        k:=k+1;
        until k >length(str);
      end;
    ///////////Запись в пзу///////////

///////////////Запись входов нейронов////////////////////
    if npp=2 then
    begin
      s:=inttostr(strtoint(s)+1);
      npp:=1;
    end;
    RichEdit2.Lines.Add(OZU[0]);/////////Результат/////

////////////конец выхода нейронов  ///////////////
    str:='';
    end;
for y1:=1 to 300 do
  for x1:=1 to 300 do
    if length(a[x1,y1])=5 then
    begin
    a[x1,y1]:=copy(a[x1,y1],1,4);
    end;
image1.Enabled:=true;
end;

end.

 

12-05-2010 07:16
Чуть быстрее если "попиксельную" обработку в Вашем алгоритме заменить на обработку линиями (ScanLine).
Смущает одно, если Вы планируете посчитать число смежных "точек" одного цвета, то Ваш алгоритм будет давать неверный результат если на изображении будут участки того же цвета (в приведенном участке кода - красные)

Правильнее, вероятно, "переписать" под свои нужды FloodFill добавив к "заливке" еще и подстчет "залитых точек" (пример  алгоритма  http://lmgtfy.com/?q=floodfill+algorithm )

12-05-2010 03:33
to Антон Григорьев
Если я правильно понял, происходит подсчет количества пикселей в области, ограниченной черной рамкой.

автору:
Посмотрите на функцию GetDIBits.
Она переносит пиксели в буфер, после чего с ними можно быстро работать.

12-05-2010 03:13
А как нарисовано то, что вы заполняете красным цветом? Может, проще создать регион и использовать функцию PtInRegion?

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования