Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 094

/ вопрос решён /

Приветствую, уважаемые эксперты!
Есть функция (см. приложение). Работает очень медленно - 43 такта. Надо упростить.

Приложение:
  1. setka:=15;
  2. for x:=0 to Image1.Width do
  3. for y:=0 to image1.Height do
  4. if (x mod setka=0) or (y mod setka=0) then image1.Canvas.Pixels[x,y]:=clGray;


Gooddy Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:23 [#1]:

Не упростить а оптимизировать:)
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:25 [#2]:

использовал LineTo, но он рисует чёрным:(
Чисти код! Чисти код! Чисти код!
Gooddy

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

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

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:31 [#5]:

если Image1.Width div setka забить в переменную и использовать её то выигрыш ещё 8 тактов.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:31 [#6]:

высота=ширина просто
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:32 [#7]:

забив Image1.Width ещё 2 такта.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:35 [#8]:

это всё в image1.Visible:=false\true - теперь 3 такта.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:35 [#9]:

думаю больше не надо но если есть что оптимизировать говорите
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:36 [#10]:

оказывается надо вопрос тут задать и самому на него ответить:)
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:45 [#11]:

как округлить до десятков т.е. из 152 получить 150?
x-(x mod 10) не пашет:(
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 17:51 [#12]:

всё пашет просто было маленькое усложнения и я испаганил выражение:)
Чисти код! Чисти код! Чисти код!
seryoga

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

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

Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:01 [#16]:

я уже писал в минифоруме я начал юзать Lineto! сначала 16 тактов, затем опустил до 3. и то наверно из за имейджа.
вместо рисовки в памяти я скрываю имейдж и под конец показываю. проще. тем более думаю создание в памяти канвы и копирование на имагу будет медленнее в данном случае.
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:04 [#18]:

Бубырь Александр Николаевич спасибо. так быстрее чем у меня :)
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 17 ноября 2008, 18:07 [#19]:

есть ещё одна похожая. новый вопрос или тут писать?
Чисти код! Чисти код! Чисти код!
Вадим К

Вадим К (статус: Академик), 17 ноября 2008, 18:20 [#20]:

я спрашиваю, откуда такты беруться, как меряем
Галочка "подтверждения прочтения" - вселенское зло.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.02 сек.