Как оптимизировать определение границ произвольной фигуры ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 17:04:22

pupsik писал(а):и произойдёт чудо оптимизации... У меня ваш код сработал в пределах 0,4. zub - 0,05. Так что: угу... на порядок оптимизировали.

Нет, подставить можно любые значения. Если вы вставляете сканлайн в цикл, то тогда вычисляйте и получение координат из метафайла в цикле. Соответственно, мой код будет 0.4 на миллион итераций, а код zub тогда будет примерно 0.7 на миллион итераций. А иначе естественно, он там не выполняет изъятие данных о линии из метафайла, а Вы добавили сложнейший сканлайн в цикл, поэтом и разница столь большой у Вас получилась.

Вот эти данные пусть программисты получат из метафайла и посмотрим, сколько на это времени уйдёт на миллион изъятий:
Код: Выделить всё
  p1.x:=0;p1.y:=0;
  p2.x:=9999;p2.y:=9999;



pupsik писал(а):Советуют применять во время сканирование Begin...EndUpdate.

Это ничего не изменит, т.к. я вообще могу этот сканлайн выкинуть, он дикими программистами придуман, чтобы тормозить быстродействующий код художников. И буду брать точку из даты, тогда код zub на два порядка будет медленнее работать. Так что даже не мечтайте. В этой части, программистам - художников не обогнать. Если мне потребуется, я ещё могу скорость поднять, а программисты как плелись черепахами, :roll: так черепахами плестись и будут со своей математикой :wink: .

Но опять-таки, это касается исключительно ситуации с задачей топик-стартера, т.к. при других обстоятельствах, код zub-а обгонит по быстродействию.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение pupsik » 10.02.2017 17:28:04

vitaly_l вы не поняли... У вас подсчёт времени не верен. Т.е. начало замера необходимо установить до сканирования... Иначе: вы замеряете время цикла, а никоим образом алгоритм. Т.о. ваша оптимизация - бред из-за не корректного учёта времени.
У zub время до алгоритма. Я не пишу: верен или нет любой из алгоритмов. Я просто уточняю: вы случайно, или умышлено, подводите к желаемому вам результату.

По поводу кода... Хм.. и как вы докажите что точка находится на линии?
То что она нарисовАна и её видно - это не считается (компу фиолетово что вы там ищите и нарисовали) :mrgreen:

п.с.
Это ничего не изменит
ну да, ну да... Быстрый доступ к пикселю. Математика с геометрией - в топку. Да здравствует "квадрат малевича"!!!
Большего бреда не читал.
это касается исключительно ситуации с задачей топик-стартера
это не касаемо данной задачи. Точнее: ваш код отдаленно касается её.
Последний раз редактировалось pupsik 10.02.2017 17:29:09, всего редактировалось 1 раз.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 10.02.2017 17:28:53

vitaly_l
Блин самое интересное пропустил, последний пост писал с андроида((
Как многие уже тут подметили - ты мухлюешь.
1 - линия короткая
2 - замер нечесный
3 - время замера не учитывает отрисовку.
Готов тебе это простить (только по пункту 1 в голове у себя отложи что это очень важное ограничение). но давай чуток усложним тестик
Код: Выделить всё
program Project1;
uses
  sysutils;
const
  eps=1e-14;
type
  GDBvertex2DI=record
    x,y:integer;
  end;
function distance2line(var q:GDBvertex2DI;var p1,p2:GDBvertex2DI): double;
var t,w,p2x_p1x,p2y_p1y,qx_p1x,qy_p1y,qy_p2y,qx_p2x: double;
begin
  p2x_p1x:=p2.x-p1.x;
  p2y_p1y:=p2.y-p1.y;
  qx_p1x:=q.x-p1.x;
  qx_p2x:=q.x-p2.x;
  qy_p1y:=q.y-p1.y;
  qy_p2y:=q.y-p2.y;
  if((qx_p1x)*(p2x_p1x)+(qy_p1y)*(p2y_p1y))*((qx_p2x)*(p2x_p1x)+(qy_p2y)*(p2y_p1y))>-eps then
  begin
    t:= sqr(qx_p1x)+sqr(qy_p1y);
    w:= sqr(qx_p2x)+sqr(qy_p2y);
    if w<t then t:= w;
  end else
    t:= sqr((qx_p1x)*(p2y_p1y)-(qy_p1y)*(p2x_p1x))/(sqr(p2x_p1x)+sqr(p2y_p1y));
  result:= sqrt(t);
end;
var
  q,p1,p2:GDBvertex2DI;
  dist:double;
  myTime:TDateTime;
  ts:string;
  i:integer;
begin
  q.x:=100;q.y:=100;
  p1.x:=0;p1.y:=0;
  p2.x:=1000000;p2.y:=1000000;

  myTime:=now;
  for i:=0 to 1000000 do
  begin
    q.x:=i;q.y:=i;
    dist:=distance2line(q,p1,p2);
  end;
  str((now-myTime)*10e4:2:3,ts);
  if abs(dist)<eps then
    writeln('Point on line')
  else
    writeln('Point not on line');
  writeln(ts+'sec.');
  readln;
end.

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

Прикинь, у меня попрежнему 0.016 а у тебя?)))

>>Вот эти данные пусть программисты получат из метафайла и посмотрим, сколько на это времени уйдёт на миллион изъятий:
ты фантазию выключай, всё в условиях. линия, тест точек на принадлежность этой линии
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение pupsik » 10.02.2017 17:33:47

Соответственно, мой код будет 0.4 на миллион итераций
опять же к баранам... Ваш код будет ещё медленнее работать.
Ну..у и плюс вам необходимо подправить мелочи. А то уж слишком умён лазарь. Не чистая проверка получается.
- догадайтесь: зачем я это написал? Где в вашем коде "грязь", окромя времени?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 17:49:18

zub писал(а):1 - линия короткая
2 - замер нечесный
3 - время замера не учитывает отрисовку.

Не лги! Всё там честно.

Код: Выделить всё
q.x:=i;
q.y:=i;

Это опять нечестная туфта, вот только так можно получить честный тест:
Нижеприведённые данные получи из метафайла и потом только сможешь САМ убедиться что, ты сильно неправ.
Код: Выделить всё
  p1.x:=0;
  p1.y:=0;
  p2.x:=9999;
  p2.y:=9999;

Смотри, всего лишь, четыре цифры для одной линии, на которых ты явно мухлюешь и берёшь их из воздуха,
получи эти четыре цифры, из метафайла в цикле :roll: и увидим кто из нас двоих мухлюет :wink: .

А когда ты поймёшь, что у других фигур, координат - намного больше :wink: :mrgreen: то может быть, если тебе повезёт :wink: , то осознаешь,
что твой код будет работать на несколько секунд дольше, в то время как скорость моего кода не изменится...


pupsik писал(а):Где в вашем коде "грязь", окромя времени?

Ну говорите уже, я не телепат. Там всё что угодно может быть, я с радостью впитаю новую информацию. Что там не так?
Последний раз редактировалось vitaly_l 10.02.2017 17:58:16, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 10.02.2017 17:57:28

vitaly_l писал(а):Нижеприведённые данные получи из метафайла и потом только сможешь САМ убедиться что, ты сильно неправ.


не понял... а при чем тут метафайл? Как я понимаю, по метафайлу отрисовали картинку (причем, где-то там далеко до начала работы функции), а потом он уже не нужен -- дальше работа идет с канвасом/контекстом напрямую.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 10.02.2017 17:58:30

Что я беру из воздуха?
Мы мереем время определения лежит ли точка на прямой, без разницы откуда мы берем точки, нас интересует время!

Все имеющие глаза уже увидели, а не только я говорю что ты нагло мухлюешь.
>>А когда ты поймёшь, что у других фигур, координат - намного больше :wink: :mrgreen: то может быть, если тебе повезёт :wink: , то осознаешь,
Изначально ты небыл похож на дурачка, просто на художника, а сейчас похож на дурачка((

Добавлено спустя 20 минут 31 секунду:
Re: Как оптимизировать определение границ произвольной фигуры ?
А вот тебе шестерня как ты просил
Изображение
Выделение, редактирование, точки из файла... и никапли растра
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 18:33:39

zub писал(а):без разницы откуда мы берем точки, нас интересует время!

В задаче топик-стартера, чётко и ясно прописано, что есть много картинок и нужно поймать клик на них. Остальное туфта.

zub писал(а):Изначально ты небыл похож на дурачка, просто на художника, а сейчас похож на дурачка

Ну это безусловно - самый весомый аргумент из всех... Хотя я Вас немного понимаю, т.к. Вы сейчас в положении ТС, когда Вы говорили ему: "смотри даже художники с тобой несогласны", только топик стартер, на Вас - не обижался, а Вы видимо расстроились. Я не хотел, Вас обидеть, просто играл. И код-то, кстати - реально работает быстрее, но скорость Вашего кода можно сравнять, если приложить ум, только смысла в этом нет. Всем удачи, а то время уходит, а толку ноль.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение pupsik » 10.02.2017 18:36:54

Ну говорите уже, я не телепат.
ну да... вы художник :mrgreen:
Наводящие вопросы:
1. Что произойдет с PLine после PLine := bmp.ScanLine[q.y];?
2. Почему время, после повторного нажатия, уменьшается из 0,4 в 0,01? А вот в варианте zub стабильное (временные минимальные отклонения не считаются, они малы).
3. То что вы нашли точку не значит что сделали согласно условия:
просто тест точка на линии или нет
. Т.е. надо доказать что точка на линии, а не просто точка...

п.с.
zub шестерёнка не считается. У вас другая основа нежели у алекса... И тем более: надо всю шестерёнку в квадрат выделить :lol:

Не лги! Всё там честно.
ну я как то могу понять "квадрат малевича". Хотя сознание говорит - мутные времена у Малевича были. Но что бы "толкнуть" такое...
А вот вас... очень сложно понять.
Повторюсь: нет в вашем коде и части условий задачи.

И код-то, кстати - реально работает быстрее
песец мохнатый... Ну нашли вы точку. А доказать что она на линии?????
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 18:38:01

zub писал(а):Выделение, редактирование, точки из файла... и никапли растра

Это ничего не значит. С растром, будет тот же самый результат по времени.
Разницы - просто не будет видно, т.к. слишком мало вычислений.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 10.02.2017 18:43:42

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

Добавлено спустя 1 минуту 5 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
>> С растром, будет тот же самый результат по времени.
не будет. не доходит - я не виноват, чесно пытался
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 18:56:02

zub писал(а):не будет. не доходит - я не виноват, чесно пытался

Если смотреть конкретно Вашу задачу, для чертежей, то она явно немного отлична от задачи топик-стартера, т.к. там Метафайлы (картинки масштабируются), а у Вас отдельные линии ПЕРЕМЕЩАЮТСЯ/РЕДАКТИРУЮТСЯ. И если бы я решал Вашу задачу, то возможно взял бы Ваш код, т.к. меньше геморроя. Однако, если вернуться к "любимым" растрам, то при решении Вашей задачи "о чертежах" с помощью растров, точка сверяется на НЕВИДИМОМ, втором аналоге канваса, и там линии рисуются в три раза толще, чтобы проще было в них мышкой попасть. А дальше разделяете их по цвету и вуаля, каждый клик по линии выделяет нужную линию и идентифицирует по цвету, а когда водите над ней мышкой, мышка меняет курсор, Ну а когда двигаете точку, то перерисовываете невидимую подложку в этой части. И мгновенные вычисления, растрами как на ладони :wink: .

Добавлено спустя 24 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
pupsik писал(а):Ну нашли вы точку. А доказать что она на линии?????

Если точка найдена, значит она уже на линии, т.к. кроме линии в задаче ничего больше нет.
Последний раз редактировалось vitaly_l 10.02.2017 19:01:43, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 10.02.2017 18:57:55

zub писал(а):тебя тыкают носом в конкретные места, задают конкретные вопросы - ты включаешь дурачка


Имхо, он над нами издевается. Слишком успешно косит.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 10.02.2017 19:01:31

>>Если смотреть конкретно Вашу задачу, для чертежей, то она явно немного отлична
Задача совершенно одинаковая - обработка графической информации - визуализация-редактирование
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение vitaly_l » 10.02.2017 19:02:57

zub писал(а):Задача совершенно одинаковая - обработка графической информации - визуализация-редактирование

Не у Вас задача немного посложнее.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru