Balancer: Все сообщения за 13 Марта 2005 года

 
ПнВтСрЧтПтСбВс
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Balancer

администратор
★★★★★
Ладно, уговорили :D Тем более, что я "B" зевнул :)

ABBA
AB0Cb
A30B
ACCA
ACb
BABA
BA3
BA3A
BBC
BEC
BECb
B3AC0C
B3BEC
B3BECb
B0BCE
B0EBAB
B03
EBCEEB
3ABECA
3ABECb
3AB0EBAB
3AB03
3ACEB
3AC0B
3AC0C
3EB
3EBC
30B
0BEC
0CA
C0BA
C0EB0E
C03BAB

...

Выброшены всякие малоизвестные, спорные и неинтересные слова :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Рома! Как не стыдно! :) Это же школьная задачка! Решается очень просто: последовательно суммируешь все углы [...] сумма углов будет 2пи, иначе 0. [»]

И это чёрный логик советует??? Да ужжж :D Только тригонометрии мне не хватало в линейных задачах :)

Да ещё eps вводить - вообще кошмар... :)

...

Кстати, как у этого метода с невыпуклыми областями?
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Посмотрел (точнее - пересмотрел, конечно, но последний раз видел много лет назад) сегодня первые две серии "Шерлока Холмса и Доктора Ватсона". В некотором соционическом офигении :D Насколько точно соответствует Ливанов и Холмс типажу Штирлица, Ватсон/Соломин - Достоевского, а все первые две серии - просто классика их дуализации. Офигение от того, насколько хорошо сыграно - без знания соционики, но словно с её учебников списано :D ТИМы, интертипные, даже просто квадренный дух. Ни тебе новых идей и веяний Альфы, ни рвачества Беты, ни стремления к материальным благам Гаммы... Типично Дельтийское житьё жизни. В общем - 5 баллов! :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Там вся тригонометрия - арккосинус

Неужели такие ЧЛ бывают? :D Да ещё от компьютеров?? :D

>Зато сам алгоритм на порядок проще и легче проверяется (даже чисто математически).

Да ну, и чем же он проще? Только тем, что строчек меньше? Так у меня 90% кода - объявления классов. Это ж дело потом расширяться будет сильно, факторизовать нужно изначально...
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
GOGI> Он пользователям ниже координатора не показывается [»]

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

Balancer

администратор
★★★★★
Нет, тригонометрию нам не нужно. До тех пор, пока плавучка не станет более экономной, чем целочисленка. А этого не случится никогда :D

Вообще, выбор более простого алгоритма (кстати, всё равно момент спорный. ИМХО, мой алгоритм нагляднее и проще - но это уже могут быть особенности информационного метаболизма :D) перед более эффективным почти всегда есть признак непрофессионализма :)

Может, ты и линии будешь по тригонометрии рисовать, а не по Брэзенхему? Или сортировать пузырьком? Или множители за пределы цикла не будешь выносить? :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Я не уверен, что acos тут будет выгоднее, но то что потери от него относительно невелики - это точно. На fpu первого пента acos - это где-то 100-300 тактов...

Угу. А у нас массив на 500Мб координатных данных. Хранить всё это в плавучке - это значит потратить уже не 500Мб, а гиг с четвертью. Значит - храним в целочисленке. Да и глупо хранить изначально целочисленные координаты в плавучке. Значит, при каждой проверке - эти целочисленные данные постоянно надо грузить в сопроцессор. Потом - выгружать. Это - море штрафов, паразитные ожидания... Да и сами вычисления. Пусть acos хоть за 10 тактов считается. Всё равно это на порядок с лишним медленнее сравнений/вычитаний. А с паразитными расходами - там и два порядка набежит. И вдвое более широкий поток данных.

Короче, чтобы посчтитать на коленке в матлабе - тригонометрия годится.

Но не для нагруженного сервера...

...

Зато, глядя на этот топик, я теперь понимаю, почему нынешний софт так тормозит :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Впрочем, с алгоритмом Балансера там тоже будет нехорошо... Да и в условии стоит "многоугольник". [»]

Мой алгоритм для окружностей тоже будет работать. Только такой объект нужно добавить :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
GOGI> У меня же написано, что я "Старожил" - где мой Остойник?!!! [»]

Группа: Пользователи :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Ну, что значит "море"? Сколько это численно?

CPU: Pentium III 600MHz EB

Время выполнения команд на GCC:
Целочисленка:
v=i-j; 12.48
v=i*j; 13.28

Плавучка:
fa=i; 12.48
fa=fb+fc; 14.96
fa=fb*fc; 11.68
fa=acos(i); 574.00

Ещё вопросы о порядках величин есть? :)

Татарин> Гм... Мне вот кажется, что про два порядка - это ты погорячился... Возьми эти слова обратно... а? :)

Считай сам :)

Татарин> Откуда более шерокий поток данных?

Это для варианта с хранением в плавучке. В противном случае - затраты на преобразования в обе стороны.

Татарин> Почему? :)

Потому что пишут решения очевидные, а не оптимальные :)

>Просто мне кажется, что плавающая точка тут не главный тормоз. [»]

Ну вот смотри ссылку выше :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Переведите кто-нить Зевсовский пример во что-то более низкоуровневое, а то я Матлаба не знаю, а лепить алгоритм с нуля ломает :) Измерим реальную скорость того и другого метода. Я бенч-оболочку уже слепил :) Целочисленный вариант проверяет у меня 10млн. точек на попадение в треугольник, занимающий 50% тестовой области за 6.8сек.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Чуть попозже. В чем пишем? Ява? [»]

Я уже перевёл. Реализовал подсчёт углов через atan2

Только пока всё ещё не работает. Постоянная путаница со знаками углов. На отладку Зевсовского алгоритма уже ушло в несколько раз больше времени, чем на всё написание моей программы :D Впрочем, как я уже писал - у меня она сразу заработала.

Так что - тоже показатель :)

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

Balancer

администратор
★★★★★
-exec-> 1.луч из точки пересекает вершину многоугольника
-exec-> 2.луч из точки лежит на стороне многоугольника
-exec-> которые потребуют тригонометрической обработки.
-exec-> :) [»]

Эти случаи у меня легко отлавливаются. А дальше - в моей задаче пофиг, так что я игнорирую. В некоторых случаях такая точка принадлежит множеству, в некоторых - нет. Как бы там ни было, в практической задаче это не важно :) Но при желании - такие проверки сделать легко. И это будут именно проверки, а не дополнительные вычисления :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Balancer>Целочисленный вариант проверяет у меня 10млн. точек на попадение в треугольник, занимающий 50% тестовой области за 6.8сек. [»]

Вот такой вариант (правда, сумма там выходит Pi, а не 2*Pi, но не принципиально - работает :D):
code java
  1.         public boolean isInside(int x, int y)
  2.         {
  3.                 double xx[] = new double[_points.size()+1];
  4.                 double yy[] = new double[_points.size()+1];
  5.  
  6.                 for(int i=0; i<_points.size(); i++)
  7.                 {
  8.                         xx[i] = _points.get(i).x - x;
  9.                         yy[i] = y - _points.get(i).y;
  10.                 }
  11.  
  12.                 xx[_points.size()] = xx[0];
  13.                 yy[_points.size()] = yy[0];
  14.  
  15.                 double r = 0;
  16.  
  17.                 for(int i=0; i<_points.size(); i++)
  18.                 {
  19.                         double rr = Math.atan2(yy[i],xx[i]) - Math.atan2(yy[i+1],xx[i+1]);
  20.                         if(Math.abs(rr) > Math.PI)
  21.                                 rr -= Math.PI*Math.signum(rr);
  22.                         r+=rr;
  23.                 }
  24.                 return Math.abs(r) > 0.00001;
  25.         }


работает в тех же условиях 28 секунд.

Не порядок, конечно, в конечной программе, но учитывая, что обе задачи не максимально оптимизированы, всё равно, четырёхкратный проигрышь по скорости - это сильно :)

При серьёзной оптимизации разрыв будет расти и, ИМХО, в итоге легко превысит десятикратную разницу.

Если ещё учитывать, сколько времени пришлось угрохать на отладку этого алгоритма... В общем, тригонометрия должна быть без тригонометрических функций там, где можно :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
чтобы не быть голословным.

-exec-> 1.луч из точки пересекает вершину многоугольника
int dx0 = (dy1 * (p1.x-p2.x))/(p1.y-p2.y);

если dx0 == 0, то луч пересекает первую точку, если dx0 == dx1, то вторую.

-exec-> 2.луч из точки лежит на стороне многоугольника

Дополнительная проверка в начале:
code java
  1. if(dy1==0 && dy2==0)
  2.     return Math.signum(dx1) != Math.signum(dx2);


В моём случае этот пример отсекается на первой проверке (if(Math.signum(dy1) == Math.signum(dy2))) и в этом случае точки считается не принадлежащей области.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Роман, так нечестно. "Невооруженным глазом" (С) видно, что один atan там лишний. Это - уже раза в полтора увеличит скорость.

Зато затраты на память. А выигрышь:
code java
  1.         public boolean isInside(int x, int y)
  2.         {
  3.                 double xx[] = new double[_points.size()+1];
  4.                 double yy[] = new double[_points.size()+1];
  5.                 double atan[] = new double[_points.size()+1];
  6.  
  7.                 for(int i=0; i<_points.size(); i++)
  8.                 {
  9.                         xx[i] = _points.get(i).x - x;
  10.                         yy[i] = y - _points.get(i).y;
  11.                         atan[i] = Math.atan2(yy[i],xx[i]);
  12.                 }
  13.  
  14.                 xx[_points.size()] = xx[0];
  15.                 yy[_points.size()] = yy[0];
  16.                 atan[_points.size()] = atan[0];
  17.  
  18.                 double r = 0;
  19.  
  20.                 for(int i=0; i<_points.size(); i++)
  21.                 {
  22.                         double rr = atan[i] - atan[i+1];
  23.                         if(Math.abs(rr) > Math.PI)
  24.                                 rr -= Math.PI*Math.signum(rr);
  25.  
  26.                         r+=rr;
  27.                 }
  28.                
  29.                 return Math.abs(r) > 0.00001;
  30.         }


Впрочем, ты прав. Выигрышь почти полуторакратный. 19 секунд.

Татарин> Короче, все ж будем считать "два порядка" - гиперболой. :)


Дальше »»»
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
hcube> То есть если у тебя тупой угол - то в контуре образуется дырка? [»]

Кхм. Какие дырки? Какой контур? Там тупой пересчёт суммы углов. Впрочем, я же говорил, что алгоритм с тригонометрическими функциями всегда сложнее, чем без них и способен постоянно порождать новые ошибки из-за неучитывания углов. Периодичность функций отрицательно сказывается на надёжности :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
hcube> То есть если у тебя тупой угол - то в контуре образуется дырка? [»]

Перечитал к чему это относилось :) Кажется, мы друг друга недопоняли. Про какие углы ты в моём варианте говоришь? Что ты понимаешь под "дыркой"?
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus>Даже наоборот, ближе к обиходному значению - слово "begin" человек и так сразу знает и воспринимает как целое, а не 5 символов

Мы рассматриваем удобство программирования для того, кто первый раз сел за компилятор или, всё же, для того, кто привык с программами работать? :)

Zeus> Насчет var - я все-таки сторонник жесткой декларации переменных строго в одном месте, а не разбросанно по тексту.

Только не в Паскале. Его синтаксис не стимулирует факторизацию и от этого порождается привычка "писать простынями". А это чудовищно затрудняет работу с переменными. Постоянно прыгать по тексту - увольте.

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

1. Вспомнить, какие имена ещё не заняты. Придумать уникальное имя, которое ещё не встречалось. Отлистать сколько-то текста к объявлениям. Прописать переменную. Вернуться к нужному куску.

2. Вспомнить уже объявленную переменную, вспомнить, не используется ли она к этому месту и задействовать ей.

1-й способ чудовищно неэффективен и программисты обычно стараются пользоваться вторым. Скажем, завёл один раз переменную I и используешь её потом всюду. А это порождает ошибки. Переменная может оказаться занятой.

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

ИМХО, второй способ порождает несравнимо меньше ошибок, которые способен зевнуть компилятор. Потенциальный минус только один - можно перекрыть доступ к одноимённой переменной более высокого уровня и зевнуть это. Но, во-первых, допустить такую ошибку НАМНОГО сложнее, чем задействовать уже занятую переменную в Паскале, во-вторых, например, в C# перекрытие переменных запрещено (что, врочем, мне лично очень не нравится :D)

>Второе - еще один источник досадных ошибок, пусть это и удобно "в краткосрочной перспективе". В лучшем случае это "лишь" усложняет компилятор, что тоже большой минус.

В наше время такими ошибками должен заниматься компилятор. А говорить о его "усложнении" - это вообще смешно :)

Zeus>Соглашусь. Но это не самоцель. Избыточная мощность синтаксиса - тоже источник ошибок, причем зачастую не отлавливаемых компилятором. Собственно, это - главная моя претензия. Нормальный язык, по моему пониманию, в первую очередь сам собой, своим синтаксисом не должен провоцировать ошибки. Это куда важнее, чем "мощность", краткость и т.п.

Самый нормальный язык в этом случае - Haskell. Вполне официально считается, что у него не только самый "помехозащищённый" синтаксис, но и огромное количество алгоритмических ошибок отображается в итоге в синтаксические.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Интересно, а поисковики к какой группе относятся? ;) [»]

К "Гостям". С некоторыми особенностями. Например, старые топики только на сутки поднимают из архива.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Dem_anywhere> Ну и ССЗБ. Сколько матрица в обычной оптической мыше? [»]

Э... 1. какая там матрица? Там же принцип иной.
2. А что, мышам уже нужно образы распознавать? :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> А ты уверен, что там нужен массив, а не пара временных переменых в стиле:

А как же в конце вернуться к первому значению? Завести ещё переменную, выставлять её вначале, а в цикл вводить лишнюю проверку? Так тормознее будет! :D А памяти на реальных объектах (несколько точек 3..6) сожрёт почти столько же.

Татарин> Понятно, что угол между нулевой и последней вершиной тоже надо учесть, но не суть... Массивы-то зачем?

Давай, напиши более оптимальный вариант, измерю скорость :)

Татарин> Откуда и получается, что теоретическую разницу в 50 раз (по тактам) в реале реализовать никак нельзя...

Можно. Но уже не на Java. И на оптимизацию столько времени уйдёт, что оно нафиг не нужно. Мне хватит и пятикратного выигрыша :)

Татарин> Тут получился... да. Я и не упирался рогом, что тригонометрия именно тут рулит. Но если бы целочисленных операций было б раз в шесть-семь поболее, то могло бы выйти и наоборот, согласись?

Если б да кабы... :) Да, на сложениях вычитаниях в сопре плавучка будет работать также, как целочисленка. Но тригонометрия - всегда тормоза. Независимо от. Собственно, я только на эту тему спорил. Ну и всегда будут тормоза при загрузке/выгрузки данных, хотя уже и заметно меньшие.

Рекурсивный Фибоначи (никакой тригонометрии, одни сложения и сравнения), 41-е число. Целочисленка - 2сек. double - 5.5сек. :)

Татарин> Ну, это уже натуральная издевка. :)

Нет. У меня задача практическая - реалтаймовый игровой сервер :)

Татарин> Я несколько раз видел, как люди оптимизируют и вылизывают тонкости в алгоритме, который сам по себе неоптимален. Короче, слету отказываться от ПТ нельзя, надо смотреть.

С этим не спорю. Ну так этот принцип ещё во времена ПМК во главу угла ставился. "Не экономьте одну команду. Экономьте сразу 50!".

Татарин> Я отдаю должное твоей интуиции в данном случае и все такое ;), но бывает и иначе.

Когда иначе, я обычно в спор не лезу :D Просто с плавучкой я начал работать ещё в досопроцессорные времена, много работал во времена i386 и долго следил, как оно менялось, вплоть до Pentium (1-й который). С тех пор, каюсь, всякие MMX/SSE/SSE2/3DNow не изучал, но судя по слухам, кардинально ситуация не менялась. Да и занимаются этим делом уже компиляторы. А как с ними - см. выше цифры :)

Татарин> Вопрос сугубо личный... Мне с тригонометрией написалось бы быстрее. Наверное. [»]

Ну, вон, Зевсу - тоже. М.б. тимное? :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
hcube> Поясняю про дырку...

Понял. Да, для полного решения тут нужно, во-первых, учёт делать уже, действительно, полноценный, во-вторых, нужны точные соглашения на счёт принадлежности точки и т.п.

Но мне проще. Задача практическая, а не теоретическая, вероятность такого попадания ничтожна, и, даже если оно когда-то случится, для задачи в целом ничего не изменится.

Ну отреспавнится раз в год паук однажды на дороге, а не в 10 метрах от неё... :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Это случилось еще на 1-м Пентиуме, если не на 486DX. Не с тригонометрическими функциями, конечно, но деление с плавающей точкой выполнялось быстрее, чем целочисленное.

По растактовке - да. С учётом времени загрузки - нет.

Вообще, см. реальные цифры выше. Если на банальном сложении с проверками в случае Фибоначи плавучка тормознее почти втрое, то что говорить о более сложных задачах?

Zeus> Это сморя в чем ;) Вот что точно - то, что твой алгоритм гораздо менее нагляден.

Да, наверное, это тимное. Мне гораздо проще оперировать с положениями объектов, чем с углами :)

Что радует - то, что и поцессору с такими вещами работать проще :D

Кстати, повторюсь:

Balancer>> Может, ты и линии будешь по тригонометрии рисовать, а не по Брэзенхему? Или сортировать пузырьком? Или множители за пределы цикла не будешь выносить? :D [»]
Zeus> Смотря какая стоит задача.

Задача - быстро нарисовать линию :)

Zeus> Рома, это всего лишь показатель твоего, хм, незнакомства с тригонометрией. У меня на отладку ушло 5 минут, заработало со 2-го раза. На написание - минут 10.

Написание в Матлабе? Или же на чём-нибудь уровнем пониже? :D

Zeus> Это смотря какая задача стоит. Ты не сказал, что тебе надо самый быстродействующий алгоритм. Я и предложил самый простой и надежный.

Кхм. Смотрим первое сообщение: "Как быстрее определить, принадлежит ли этому многоугольнику заданная точка (x,y)?"

Разве слово "быстрее" применительно к алгоритму допускает трактовки? :)

Zeus> Скорее всего будет наоборот. Потому что явно можно считать прямо сумму косинусов. Но мне лень думать, как ее разложить :) (То есть помню для двух углов, но выводить дальше неохота :))

Целочисленку тоже можно вылизать очень сильно. Загнать всё в целочисленные массивы, делать по ним один проход, минимизировать проверки...

Zeus> Глупости, сам алгоритм у меня несомненно проще

Проще - мой :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Татарин> Смотри:

Хм. Не работает :)
Из 10 млн. случайных точек в квадрате 9999983 принадлежат "диагональному" треугольнику :)

Ошибка именно алгоритмическая, как я погляжу (хотя в треугольниках без записи на бумажку я плаваю), ты не замыкаешь обход по треугольникам, не возвращаешься к первой проверяемой точки. См. в моём варианте Зевсовского алгоритма ещё раз :)

Татарин> Кстати говоря, тут тоже есть исключение, которое не обрабатывается: вершина имеет координату строго равную координате точки (тангенс уходит в бесконечность).

Функция atan2 особые случаи учитывает. Именно для того и вводилась. Когда dx=0, то она возвращает Pi/2 (или что там положно?) Если и dy=0, то, по идее, должна ислючение бросать. Но могли и не реализовать, правда.

Татарин> По условию - ява. :) Почему я и отнесся к заявлению о порядках ну о-очень настороженно. :)

Ладно, уговорил. На порядок я ошибся по старой памяти :)

Татарин> Оффтоп, конечно, но что за игра-то?

Lineage II Interlude (C6) /Бесплатный Lineage II Interlude (C6) сервер Balancer'а/ :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Вообще говоря, это лишь фича конкретных процессоров. Быстродействие алгоритма подсчитывается просто количеством операций.

Опять ЧЛ лезет в глобальные области. Только как-то неумело... :D

Zeus> Кстати говоря, для корректности ты должен проверять подсчет фиббоначи с int той же длины, что и double, т.е. int64.

Нет. Я не раз говорил об объёмах перекачиваемых данных. Это - тоже часть агоритма :)

Zeus> Да причем здесь именно углы и положения? Просто очевиднее, что сумма углов сразу дает нужный результат.

Мне - не очевидно. Зато все комбинации с отрезками я сразу вижу.

Zeus> Твоему процессору.

Ты знаешь массовые процессоры, у которых плавучка быстрее целочисленки? :)

Zeus> Быстро - начиная с момента выдачи задания или по быстродействию самого алгоритма? ;) Я именно на это намекал. Кроме того, иногда наглядность - самоцель (например, для обучения).

Понял. Для меня быстрее будет по обоим параметрам по брезенхему :) Потому что пропорции я принимаю ближе и помню лучше, чем синусы с косинусами :D

Zeus> Практически без разницы. Отладка была бы такой же, а написание, может, раза в полтора дольше.

Ну так напиши вариант на Java :)

Zeus> Проверки тебе добавлять, а не минимизировать надо. А все остальное к обоим относится.

Зачем? Моя задача решена. Какие ещё проверки? :)

Zeus> Т.е. поставленную задачу ты все-таки не решил ;) [»]

Задача стояла "для генерации распределения мобов по локациям на игровом сервере". Эта задача - решена :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
** Сообщение с ограниченным доступом **

Balancer

администратор
★★★★★
POIN'а восстановил.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
code java
  1. double fisrt_atan = Math.atan2(y - _points.get(i).y,_points.get(i).x - x);


Как я понимаю,
code java
  1.         double first_atan = Math.atan2(y - _points.get(0).y,_points.get(0).x - x);

?

Не работает. Ниодна точка теперь не попадает :)

Татарин> Не, с замыканием - там все ОК.

Давай, ищи ошибки дальше :)
Или, вон, Зевс пускай подключается. Как первый, предложивший эту идею :)

Татарин> А оно что, на яве писано?

Сервер. Не сама игра.
Впрочем, игры с Java в ядре тоже уже есть - тот же "Ил-2" :)

Татарин> Однако ж. :) [»]

Дык, проигрышь по скорости чистому С++ невелик (меньше, чем проигрышь плавучки целочисленке в наших тестах :D - на чистой математике проигрывает процентов 20 всего - Быстродействие языков тест2 ), зато больше возможностей, выше уровень языка, мощные библиотеки, сборка мусора...
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
digger> Тaкaя зaдaчa решaется функцией floodfill в грaфике. Прoвoдится гoризoнтaльнaя линия в oдну стoрoну. Если oнa пересекaет пoлигoн нечетнoе числo рaз, тo внутри, если четнoе, тo снaружи.Пересечение oтрезкa с гoризoнтaльным лучем - линейнoе урaвнение. [»]

Вот я так и сделал в итоге. И до сих пор идёт спор, какой вариант лучше :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Не UFO единым... :D

Кстати, если проблемы только в звуке (Adlib, SB/ISA и т.п.), то напомню топик Звук старых игр под WinNT/2K/XP! :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
** Сообщение с ограниченным доступом **

Balancer

администратор
★★★★★
Zeus> В каком смысле - факторизацию?

Разбиение на мелкие автономные модули

Zeus> Вот-вот. Сначала делают, потом думают. Я и говорю, подход... ну, примитивный.

Так в том-то и дело, что так пишутся 99% проектов :) И Си тут даёт меньше вероятность допустить ошибку, чем Паскаль :)

>Я в 90% случаев сразу продумываю алгоритм процедуры и декларирую ровно столько переменных, сколько надо

Это годится только для программ уровня решения квадратного уравнения :-P

>2-й способ, в прочем, использую, но только и исключительно в последовательных циклах единичной вложенности, причем только по for (вообще-то, использовать счетчик такого цикла после цикла считается дурным тоном, а в некоторых языках прямо запрещено).

Вот-вот, используешь. Ещё один шаг к ошибкам :)

Zeus> Вдобавок, трудности с введением лишней переменной даже полезны: заставляет подумать, а нужен ли вообще цикл, и почему о нем сразу не догадался, и т.п.

Это не та трудность, которая оптимизирует работу :) Вот, например, "настоящий редактор программиста должен быть лишён функции копирования текста" (© Чарльз Мур, кажется) - это да :)

>В конце концов, ничего страшного, промотаешь, поставишь декларацию

Угу. Очень весело, эффективно, продуктивно... :D А когда у тебя 10 исправления в пяти файлах в проекте из (пошёл считать) 50 файлов? :)

>зато в следующий раз думать лучше будешь, да и окупится оно при отладке.

Не окупится оно так :) Окупаемость при отладке - это минимизация ошибок при написании программы. Чем больше твой башка занята посторонними неудобствами, тем выше вероятность левых ошибок.

Zeus> Кроме того, при правильном подходе много мотать туда-сюда не надо, функции должны быть достаточно короткие.

Вот Паскаль, почему-то, такой подход не стимулирует :)

Zeus> То есть - заплатку. В этом весь стиль современного программирования.

Не заплатку, а локальную переменную. Ты ещё Форт вспомни, где их вообще, в принципе не было, одни глобальные. Одна из самых важных причин, по которым он и помер :)

Zeus> Совершенно справедливо запретили.

Нет. Ошибок алгоритмических явно оно не наплодит, но наплодит ошибок компиляции, затруднит работу и в итоге породит ошибки косвенные, связанные с лишней загрузкой программиста.

Zeus> Нисколько не смешно. Ошибки гораздо эффективнее исключаются на уровне мышления и написания, а не компилятора.

Ну да. Можно и на ассемблере писать без ошибок. Но почему-то не пишут :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Zeus> Имхо, неумело тут твоя БЛ как-то работает. Скорость алгоритмов всегда определялась количеством операций, причем тут вообще ЧЛ?

Нет, это ты за БЛ хватаешься в чисто ЧЛ-задачах :) Есть конкретная задача. Смотри первую страницу. Есть два алгоритма, удовлетворяющих потребностям задачи. Один работает в 4 раза быстрее. У какого алгоритма выше скорость? :)

А число операций - скорость операций может различаться на порядки... Это не оценка :)

>И это именно глобальный показатель, не привязанный к конкретным техническим особенностям.

Вот-вот. А задача стоит конкретная. И не нужно тут сферических коней в вакууме :)

Zeus> Тогда придется признать, что возможности целочисленного алгоритма меньше - он заткнется на значениях, которые еще доступны double

И что из этого? Если максимальные координаты по карте составляют лишь ~217, какие ещё "заткнётся" тут могут быть? :D

Zeus> Оффтопичный вопрос: ты хоть раз участвовал в олимпиадах по информатике? :) Вот там страсть как любят такие приколы. Вроде решишь задачу - а они зададут 20-значное число на тесте, и уж непременно выставят все "особенные" случаи. Все это приучает к корректности.

Ты не поверишь, но я именно с тестированием плотно знакомился, когда работал (пусть официально только админом) в российском подразделении Honeywell :D

А олимпиады - это фигня. Вот на собеседовании в контору, где делали Cybiko - вот там экзамен так экзамен был. Дикая смесь математики, разных платформ, языков... Единственное, на чём я выступил не блестяще - это была смесь комбинаторики с теорвером - по ней я всегда плавал :) Но что касалось оптимизации и предельных значений - это как раз был мой конёк :D

Zeus> Очень странно. Не могу даже объяснить ИМом :)

Ну, я не один тут, вон, этим страдаю :D

Zeus> Не все, коли пропустил столь элементарный случай. А когда дошло, просто махнул рукой - тоже типично современный подход.

Нет, ты не прав :) То, что случаи прохождения прямой через вершины нужно особо обрабатывать я заметил ещё до того, как сел думать над алгоритмом. Но изначально забил на него из-за практической его неважности. Когда тут "дошло" - это я просто понял во что конкретно выливается неучёт вершин. Но это ничего не изменило, кроме знания того, что точка может неправильно засчитаться. Так я это и раньше предполагал :)

>А еще ЧЛогиков ругаешь. Сам такой! :P

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

И уж тем более это было важно после, на процессах и аппаратах.

Так что, считай, что это впитано с молоком практики :)

Zeus> Зачем мне массовые? Мне хоть и приходилось работать на таком, но это в данном случае малосущественно, речь шла о показателе алгоритма, а не реализации.

Теоретик, блин. Опять сферические кони в вакууме. Мне что, в условия дописать "быстрый на Xeon 1800"? :)

Zeus> У меня ее нету. Точнее, машина есть, а среды нету. С командной строки пускать и тем более отлаживать - ну его нафик.

Кхм. У тебя что, FAR с Colorer'ом не установлен? Мне его по уши хватает, чтобы сейчас рулить проектом в 450 файлов, суммарным объёмом 2.5Мб :)

А уж для тестов - это вообще смешно, IDE требовать :)

И отладка - Java-VM при ошибке выдаёт подробнейшую диагностику, вплоть до номера строки файла с ошибкой и имени функции со всем стеком вызовов.

Расслабились, блин... Я последний раз IDE использовал... Даже уже и не помню когда. Когда там вышел C++ Builder 3.0? Вот как он вышел, так я IDE больше и не пользовался :)

>Тем более я сейчас не смогу скорость замерять - у меня комп постоянно занят рассчетами.

start /HIGH :)

Zeus> Не решена, коли валится на такой простой проверке. Решена лишь до уровня "и так сойдет!" - что еще хуже. Имхо, ненадежная программа хуже отсутствующей, при любых бенчмарках.

Хм. Задача решена с заданной точностью. Боюсь, в нашем институте тебе бы пришлось очень нелегко... :D

Zeus> P.S. А почему множественное цитирование перестало работать? [»]

Понятия не имею. Движок форума чёрным логиком писан, ИМХО :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Люди, прежде чем переносить мозг человека, сделайте хотя бы атономный боевой модуль. Не важно, авиационный или танковый :) чтобы с задачами распознавания, целеположения, тактики... В природе такие схемы от тысяч нейронов уже работают... А вот в технике пока даже такого достичь не могут.

А уже потом будете про триллионы нейронов говорить :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru