| 
| 
 | Вопрос # 2 094/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!Есть функция (см. приложение). Работает очень медленно - 43 такта. Надо упростить.
 Приложение:Переключить в обычный режим setka:=15;for x:=0 to Image1.Width dofor y:=0 to image1.Height doif (x mod setka=0) or (y mod setka=0) then image1.Canvas.Pixels[x,y]:=clGray;
|  |   Вопрос задал: Gooddy (статус: 3-ий класс)Вопрос отправлен: 17 ноября 2008, 17:23
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: ANBsoft Здравствуйте, Failure!Примерно так:
 setka:=15;
 for x:=0 to (Image1.Width div Setka) do
 for y:=0 to (image1.Height div Setka) do
 image1.Canvas.Pixels[x*Seta,y*Setka]:=clGray;
 
|  | Ответ отправил: ANBsoft (статус: Студент)Время отправки: 17 ноября 2008, 17:50
 Оценка за ответ: 5
 Комментарий к оценке: конечно быстро но рисуются не линии:) |  Ответ #2. Отвечает эксперт: min@y™ Ну нафига так усложнять?Если нужна сетка из точек, зачем же перебирать все координаты Canvas?
 Не проще ли написать вот так?
 
 procedure TForm1.ButtonClick(Sender: TObject);
const
  GridStep = 15;
var
  X, Y: Integer;
begin
  Image.Canvas.FillRect(Image.Canvas.ClipRect);
 
  X:= GridStep - 1;
  Y:= GridStep - 1;
 
  while True do
    begin
      Image.Canvas.Pixels[X, Y]:= clGray;
      Inc(X, GridStep);
 
      if (X >= Image.Width) and (Y >= Image.Height)
        then Break;
 
      if X >= Image.Width
        then begin
               X:= GridStep - 1;
               Inc(Y, GridStep);
             end;
    end;
end;Проверено, работает.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 17 ноября 2008, 18:14
 Оценка за ответ: 5
 Комментарий к оценке: спасибо |  
 Мини-форум вопросаВсего сообщений: 27; последнее сообщение — 17 ноября 2008, 21:32; участников в обсуждении: 4. Страницы: [1] [2] [Следующая »]  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:23 [#1]:Не упростить а оптимизировать   Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:25 [#2]:использовал LineTo, но он рисует чёрным   Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:29 [#3]:setka:=15; image1.Canvas.Pen.Color:=clGray;
 
 for x:=0 to (Image1.Width div setka) do
 for y:=0 to (image1.Height div setka) do
 begin
 image1.Canvas.MoveTo(x*setka,0);
 image1.Canvas.LineTo(x*setka,Image1.Width);
 image1.Canvas.MoveTo(0,y*setka);
 image1.Canvas.LineTo(Image1.Height,y*setka);
 end;
 
 добился этого - 16 тактов
 Чисти код! Чисти код! Чисти код! |  
|   | seryoga (статус: 1-ый класс), 17 ноября 2008, 17:29 [#4]:ну для начала wid:=Image1.Width;
 hei:= image1.Height;
 setka:=15;
 for x:=0 to Wid do
 for y:=0 to Hei do
 if (x mod setka=0) or (y mod setka=0) then image1.Canvas.Pixels[x,y]:=clGray;
 |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:31 [#5]:если Image1.Width div setka забить в переменную и использовать её то выигрыш ещё 8 тактов. Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:31 [#6]:высота=ширина просто Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:32 [#7]:забив Image1.Width ещё 2 такта. Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:35 [#8]:это всё в image1.Visible:=false\true - теперь 3 такта. Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:35 [#9]:думаю больше не надо но если есть что оптимизировать говорите Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:36 [#10]:оказывается надо вопрос тут задать и самому на него ответить   Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:45 [#11]:как округлить до десятков т.е. из 152 получить 150? x-(x mod 10) не пашет
   Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:51 [#12]:всё пашет просто было маленькое усложнения и я испаганил выражение   Чисти код! Чисти код! Чисти код! |  
|   | seryoga (статус: 1-ый класс), 17 ноября 2008, 17:52 [#13]:причем значения Image1.Width div Setka и image1.Height div Setka предварительно сохранить |  
|   | Вадим К (статус: Академик), 17 ноября 2008, 17:57 [#14]:А откуда взято 43 такта??? в данном контексте о этом говорить просто неприлично. И самым большим тормозом здесь есть присваивание вида
 image1.Canvas.Pixels[x,y]:=clGray;
 присваивания цвета пикселю - ужасно медленная процедура. К тому же Вы решили прямо рисовать по имейджу. А правильней рисовать в памяти всё, а потом одной строкой перенести на форму.
 И если уже хочеться по пикселям - то ScanLine, но он здесь будет тормозом.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | ANBsoft (статус: Студент), 17 ноября 2008, 17:59 [#15]:Точнее немного не так - так сетка из точек. А из линий так:
 setka:=15;
 image2.Canvas.Pen.Color:=clGray;
 for x:=0 to Image2.Width div Setka do begin
 image2.Canvas.MoveTo(X*Setka,0);
 image2.Canvas.LineTo(X*Setka,Image2.Height);
 end;
 for y:=0 to Image2.Height div Setka do begin
 image2.Canvas.MoveTo(0,Y*Setka);
 image2.Canvas.LineTo(Image2.Width,Y*Setka);
 end;
 |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:01 [#16]:я уже писал в минифоруме я начал юзать Lineto! сначала 16 тактов, затем опустил до 3. и то наверно из за имейджа. вместо рисовки в памяти я скрываю имейдж и под конец показываю. проще. тем более думаю создание в памяти канвы и копирование на имагу будет медленнее в данном случае.
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:02 [#17]:посмотрите первую странницу там моя текущая функция: setka:=15;
 
 ts:=Image1.Width div setka;
 ts2:=Image1.Width;
 
 image1.Canvas.Pen.Color:=clGray;
 for x:=0 to (ts) do
 for y:=0 to (ts) do
 begin
 image1.Canvas.MoveTo(x*setka,0);
 image1.Canvas.LineTo(x*setka,ts2);
 image1.Canvas.MoveTo(0,y*setka);
 image1.Canvas.LineTo(ts2,y*setka);
 end;
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:04 [#18]:Бубырь Александр Николаевич спасибо. так быстрее чем у меня   Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:07 [#19]:есть ещё одна похожая. новый вопрос или тут писать? Чисти код! Чисти код! Чисти код! |  
|   | Вадим К (статус: Академик), 17 ноября 2008, 18:20 [#20]:я спрашиваю, откуда такты беруться, как меряем Галочка "подтверждения прочтения" - вселенское зло. |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |