|
Вопрос # 2 094/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Есть функция (см. приложение). Работает очень медленно - 43 такта. Надо упростить.
Приложение: Переключить в обычный режим- setka:=15;
- for x:=0 to Image1.Width do
- for y:=0 to image1.Height do
- if (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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|