Вопрос к т.н. "технарям"
Aug. 13th, 2008 12:46 pmТупняк на меня напал. Имеется функция в виде набора значений на двумерной сетке точек, надо определить кривую, на которой она обращается в нуль. Пока делаю очевидным образом: если произведение значения функции в (x_i,y_j) на значение в одной из трёх соседних точек ({x_i,x_i+1},{y_j,y_j+1}) отрицательное, то искомая точка считается лежащей на кривой. Очевидные недостатки - то, что в зависимости от направления кривой возле неё может получаться разное количество точек (для симметричной функции получится несимметричная кривая). Чтобы было понятнее, картинко:

Соответственно, принимаются предложения о том, как бы это всё сделать, чтобы получше результат получался. Заранее спасибо за помощь :)
Соответственно, принимаются предложения о том, как бы это всё сделать, чтобы получше результат получался. Заранее спасибо за помощь :)
no subject
Date: 2008-08-13 10:02 am (UTC)А вообще, используй какой-нибудь Матлаб. Там все это сделают за тебя :)
no subject
Date: 2008-08-13 10:14 am (UTC)С Матлабом имеются трудности: во-первых, я под линухом. Во-вторых, осваивать какие-то большие пакеты сейчас некогда, мне через месяц уже доклад на конференции делать. Мой описанный рецепт обладает тем достоинством, что его можно быстро запрограммировать на баше (!), т.к. после умножения функции на 10 в соответствующей степени ничего, кроме целочисленной арифметики, не требуется :D
no subject
Date: 2008-08-13 10:05 am (UTC)no subject
Date: 2008-08-13 10:09 am (UTC)no subject
Date: 2008-08-13 10:54 am (UTC)no subject
Date: 2008-08-13 10:58 am (UTC)no subject
Date: 2008-08-13 11:58 am (UTC)/х от 1 до фиг знает сколько/
/y от 1 до .../
/если F(x,y)*F(x+1,y)<0 или F(x,y)*F(x,y+1)<0 или F(x,y)*F(x+1,y+1)<0 то отметить точку (х,y)/
/возврат по у/
/возврат по х/
/покажи чего нашёл/
Правда, граница сдвинута в сторону обхода будет. Можно второй обход навстречу сделать, но тогда ряд точек двойной получится.
Почему на картинке иногда по две-три точки подряд при одном пересечении - не понимаю...
no subject
Date: 2008-08-13 01:29 pm (UTC)no subject
Date: 2008-08-13 10:27 am (UTC)Если нужен поиск кривой, то я бы просто обработал бы получившиеся в результате обходов области.
Это первое что приходит в голову, наверняка можно быстрее и проще.
no subject
Date: 2008-08-13 10:41 am (UTC)no subject
Date: 2008-08-13 10:49 am (UTC)no subject
Date: 2008-08-13 10:57 am (UTC)no subject
Date: 2008-08-13 11:05 am (UTC)no subject
Date: 2008-08-13 11:14 am (UTC)no subject
Date: 2008-08-13 01:05 pm (UTC)no subject
Date: 2008-08-13 02:54 pm (UTC)Возьмем массив трехцветных точек (скажем, черных, белых и красных), вначале белый, конгруэнтный Вашей сетке, и закрасим красным цветом все точки, где функция больше нуля (либо больше или равна нулю, либо, для лучшей симметрии, больше или равна нулю если x у >= 0, в противном случае строго больше нуля). Останется «обвести» границы белого или красного (или и — тогда они будут двойной толщины).
Обвести их можно так. Вначале сканируете массив до первой границы произвольным образом. Возьмем белую клетку на границе, закрасим черным. По конфигурации ее соседей легко найти, какую клетку закрасить черным следующей, так, чтобы граница не разрывалась по вертикали или диагонали. Закрасив соседнюю клетку, повторим процесс от нее (идти надо в обе стороны; можно начать в одну, а в другую идти только если упремся в границу). Процесс остановится сам, когда мы вернемся в исходную точку. Черная граница будет непрерывной в том смысле, в каком вы определите клеточные правила закрашивания соседей.
Сканирование будем повторять, ища границу красного и белого, около которой нет черных точек. Процесс остановится, когда границу найти будет уже нельзя.
Но на баше писать это, конечно — епитимья. За что Вы себя так? :-)
no subject
Date: 2008-08-13 09:55 pm (UTC)А что касается баша - тут ведь какая штука, при всей его корявости и неумении работать с действительными числами на написание скрипта уходит, скажем, два-три часа. На Сях написать то же самое можно было бы за полчаса-час, что при условии равных затрат времени оставляет нам час-два на вспоминание Сей, знание которых за шесть лет пришло в некоторый упадок (или, скажем, изучение Питона с нуля). А кроме того, на каждом новом компьютере программу нужно компилить, а скрипт готов к работе везде, где есть баш. Такие вот рационализации вместо честного признания тяги к извращениям :)