С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
что-то у меня под эмулятором не работает, ну в смысле не включается "открытый" режим, или я что-то не так понял. Поэкспериментирую - отпишусь.
Добавлено через 25 минут
Фильтрация ФНЧ!
По поводу случайных чисел мое ламерское мнение думает что проблем не будет если использовать не деление, а умножение (возведение в степени, вычисление логорифма и т.д.), а если еще перемешивать эти результаты с задержками нажатия клавиш пользователем, то вообще все должно быть красиво. Когда мне нужны были случайные числа, я создавал массив на 256 байт, брал один регистр и постоянно инкриминировал его значение и опрашивал клавиатуру или мышь. Как только была нажата какая-нибудь клавиша инкремент прекращался и этот регистр сохранялся в массиве, брался следующий элемент массива и так далеее. Массив адресовывался регистровой парой HL и я просто делал INC L, что позволяло постоянно двигаться по кругу. Прерывания были запрещены. У меня была тогда самопальная утилита для рисования анимированных спрайтов 2 на 2 знакоместа и вот в эту утилиту я и вставил процедуру случайных чисел. Процесс рисования был длительный и неравномерный и числа получались действительно случайными.
Но я так понимаю что для генерации ладшафта такой способ не годится. Если я понял верно, то в результате геренации должен получится как бы рельеф местности, который будет отсечен уровнем моря и разделен на сушу и воду, а для этого ландшафт должен быть достаточно плавным. Иначе может получиться (и чаще всего так и будет) друшлаг вместо материка. Так что это за волшебный метод ФНЧ?![]()
Последний раз редактировалось valeron; 16.09.2008 в 22:47. Причина: Добавлено сообщение
Сначала выбирается номер карты, потом нужно нажать "а", потом любую другую клавишу и тогда должно нарисовать мини карту.
По поводу отделения суши от моря. Что-то Вы все очень усложняете, отделение суши от моря, фнч. Голову можна сломать. Все намного проще. Сушу можна просто наростить (или море) и при этом ничего не нужно будет отделять и озер будет не много. У меня они получаются только когда 2 острова перекроют один другого, тогда есть вероятнось озера. Иначе никакого озера не будет.
В генерации карт суть проблемы не только в генерации случайных чисел, а и в том как правильно воспользоваться случайными числами чтобы вполне не случайно получились например острова.
Последний раз редактировалось rnd.gen; 17.09.2008 в 09:23.
Насчет случайных чисел повторюсь: зачем изобретать велосипед? Зачем попадать в ловушки, в которые ранее попадали другие? Вспомни закон Мерфи: "Сложные проблемы всегда имеют простые, легкие для понимания, неправильные решения".
Вот рекомендую почитать про генерацию псевдослучайных чисел вообще:
http://ru.wikipedia.org/wiki/%D0%93%...81%D0%B5%D0%BB
И конкретно про один простой в реализации метод, который обеспечивает генерацию приемлемых для данной задачи случайных чисел:
http://ru.wikipedia.org/wiki/%D0%9B%...82%D0%BE%D0%B4
---------
Теперь о фильтрации.
Простейший случай двумерного фильтра низких частот представляет собой обычное усреднение элемента матрицы с его соседями.
То есть если у нас имеется исходный двумерный массив A, и нужно построить отфильтрованный массив B, то каждый элемент B(i,j) будет равен среднему арифметическому соответствующего элемента A(i,j) и 8 его ближайших соседей.
Еще большей степени сглаживания можно добиться, если усреднять не 3х3 ближайших соседей, а 5х5 (по два элемента в каждую сторону) и более. При этом совсем не обязательно чтобы "маска усреднения" была симметричной. Можно брать одного соседа влево и двоих вправо, например. Это повлияет на фазовую характеристику фильтра и т.д., но у нас ведь исходные данные и результат являются случайным шумом, и мало ли, что там оно чуть-чуть по фазе будет сдвинуто - сущность результата от этого не поменяется.
Дальнейшее развитие идеи - это усреднение элемента с соседями не в равных пропорциях, а с разными весовыми коэффициентами. Например, брать 0.5 от самого элемента и по 0.0625 от каждого из соседей, и складывать вместе.
Тут уже идет речь о (малых размеров) матрице с коэффициентами фильтра. Для изотропного фильтра, действие которого одинаково во всех направлениях, эта матрица обладает центральной симметрией. Если она не обладает центральной симметрией, то действие фильтра может быть различным в разных направлениях. Например, более плавные изменения по горизонтали и более резкие - по вертикали.
Фильтры низких частот получаются обычно с коэффициентами, которые образуют как бы колокол. То есть с максимумом в центре и монотонным убыванием при движении к краям. Можно взять любую функцию с подобными свойствами - например, косинус, или параболу, или функцию Гаусса... Все они обеспечивают пропускание низких частот и подавление высоких, хотя и в разной степени, с разной эффективностью.
Фильтр высоких частот можно получить из фильтра низких частот, взяв все его коэффициенты с обратным знаком и прибавив после этого к центральному элементу матрицы фильтра единицу.
Обычно также следует стремиться к тому, чтобы сумма всех элементов матрицы ФНЧ была равна 1. Это несложно обеспечить, взяв произвольный набор коэффициентов, вычислив их сумму и разделив коэффициенты на полученное число. В противном случае происходит не только фильтрация, но и усиление/ослабление сигнала.
Для конкретной задачи генерации карт я рекомендую начать с простого усреднения соседних элементов, подобрав подходящее их количество. Более сложные фильтры вряд ли придется придумывать.
И вот еще что. По своим краям отфильтрованный массив-карта будет иметь значение, ведущее себя иначе, чем в центре. Это потому, что фильтр имеет "краевой эффект", протяженность которого равна половине длины матрицы фильтра. Чтобы побороть краевой эффект, достаточно взять размеры исходного массива с случайными числами немного больше, чем нужно, а после фильтрации края просто выбросить.
Судя по посещаемости никого не интересует генератор полей к Last Battle. Уже наверное никто даже под эмулятором не играет.![]()
Процедурные текстуры типа "плазма" в демах так и делаются. Причём даже можно не 3x3 соседа, а только соседа слева и соседа сверху. Естественно, прогонять всю карту несколько раз. Можно вообще фильтровать по очереди горизонтально и вертикально, 2x1.
некроманты
С уважением,
Jerri / Red Triangle.
По горизонтали:
ld a,(hl)
add a,c
rra
ld c,(hl)
ld (hl),a
inc l
По вертикали то же самое, но inc h.
Можно и быстрее.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)