[Введение]
Я читал «Секретный лаконичный». В ней есть глава, которая вводит несколько методов использования шума для генерации фрактальных диаграмм. Это очень интересно, поэтому я попытался использовать компьютер для его имитации, и эффект неплохой (метод шума легче реализовать в программировании, чем традиционный итеративный метод. Позже я обнаружил, что есть еще много таких алгоритмов, поэтому я могу найти больше в поисках хаозой).
[Метод генерации шума Sierpinski Triangle]
В этих шумовых играх правила генерации треугольников Sierpinski являются самыми простыми:
1. Выберите три точки на плоскости, помеченные как 1, 2 и 3, как вершины большого треугольника.
2. Выберите один из них как «текущую точку» (например, выбор № 1).
3. Сгенерируйте случайное число от 1 до 3, нарисуйте новую точку в средней точке вершины и «текущую точку», выраженную номером, и используйте новую точку в качестве «текущей точки».
4. Повторите шаг 3, чтобы приблизиться к шаблону.
*. Обратите внимание на случайные числа, лучше не использовать время в качестве пути генерации семян.
[Программа симуляции]
пакет com.geiv.chaos; импорт java.awt.event.keyevent; import com.trblock.util.randomset; import geivcore.defaultfactor; импорт geivcore.keyfactor; импорт geivcore.keylistener; importcore.r; импорт geivcore.uessi; По умолчанию реализует KeyListener {uesi ues; obj [] basepoint; obj crtpoint; public sierpinski (uesi ues, int times) {this.ues = ues; basepoint = new obj [3]; // Создать три точки для (int i = 0; i <3; i ++) {basepoint [i] Ues.creatobj (uesi.bgindex); basepoint [i] .addglpoint ("70dbdb", 0,0); basepoint [i] .show ();} basepoint [0] .setCentralx (400); // Установить трехточечную позицию BasePoint [0] .SetCentraly (60); BasePoint [1] .SetCentralx (60); BasePoint [1] .SetCentraly (550); BasePoint [2] .setCentralx (740); BasePoint [2] .setCentral this.setKeyListener (this); ues.pushkeyboardio (this); for (int i = 0; i <times; i ++) {generatenew ();}}@переопределить публичный void dokeybord (keyfactor, кого, int keycode, boolean ispressed) {// mount ukeback if ispressed) {if keycode) {// {// {// spoce. Соответствует generatenew ();} else if (keycode == keyevent.vk_a) {// a соответствует 100 новым точкам для (int i = 0; i <100; i ++) {generatenew ();}} else if (keycode == keyevent.vk_b) {// b Соответствует 1000 Новые точки для (int i = 0; 1000; i ++) {generatenew ();}}}}} public void generatenew () {obj flagpoint = basepoint [randomset.getrandomnum (0, 2)]; // Случайно выберите одну из эталонных точек float nx = (flagpoint.getCentralx ()+crtpoint.getcoint.GetCoint.GetCoint.GetCoint.GetCoint.GetCoint.GETPOINT.GETPOINT.GETPOINT.GETPOINT.GETPOINT.GETPOINT.GETPOUNT.GETPOUNT.GETPOINT.GETPOINT.GETELENTRALX. (flagpoint.getCentraly () + crtpoint.getCentraly ())/2f; obj newpoint = ues.creatobj (uesi.bgindex); // Создать новую точку newpoint.addglpoint ("70dbdb", 0,0); newpoint.setcolor (randomset.getrandomcoldcolor ()); newpoint.setCentralx (nx); // Установить координаты newpoint.setCentraly (ny); newpoint.show (); crtpoint = newpoint main (string [] args) {uesi ues = new r (); new Sierpinski (UES, 0); // Последующие параметры конструкции могут устанавливать начальное количество точек. }}[Результаты моделирования]
Когда нажата клавиша B
[Метод генерации шума Barnsleyfern]
По сравнению с простой регулярностью треугольника Сьерпинского, Барнслиферн (фрактальная зубная трава) производит более сложное впечатление. Из -за своей сложности дисциплина хаоса часто приходит, чтобы доказать вывод, что «простые правила также могут создавать сложные объекты».
Его правила генерации тоже не сложны:
1. Во -первых, учитывая «точку тока» (0,0), мы используем OX и OY для представления горизонтальных и вертикальных координат.
2. Чтобы рассчитать следующую точку (NX, Нью -Йорк), вам необходимо выбрать одну из следующих четырех итерационных формул с определенными случайными правилами:
1) Выберите эту формулу итерации с вероятностью %1:
nx = 0;
ny = 0,16f*oy;
2) Выберите эту формулу итерации с вероятностью %85:
nx = 0,85*ox+0,04*oy;
ny = -0,04*ox+0,85*oy+1,6;
3) Выберите эту формулу итерации с вероятностью %7:
nx = 0,2*ox-0,26*oy;
NY = 0,23*OX+0,22*OY+1,6;
4) Выберите эту формулу итерации с вероятностью %7:
nx = -0,15*ox+0,28*oy;
NY = 0,26*OX+0,24*OY+0,44;
3. Нарисуйте (NX, NY), установите его в текущую точку, повторить 2, и вы можете бесконечно приблизиться к результату.
↑ Приведенная выше формула выдержается из Wiki: http://en.wikipedia.org/wiki/barnsley_fern. При программировании я нашел проблему. Вики не указывала взаимосвязь между относительным значением этой координаты и размером экрана, а также не указывал направление оси x и y. Рисунок всегда был неудачным в рамках системы координат, которую я определил. Позже я искал в соответствии с формулой и нашел эту поверхность: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp. Это программа OpenGL в C ++, и используется та же формула, что и вики. То есть этот набор формул основан на системе координат OpenGL. После выполнения соответствующего преобразования это было наконец успешно нарисовано.
[Программа симуляции]
пакет com.geiv.chaos; import geivcore.defaultfactor; import geivcore.keyfactor; импорт geivcore.keylistener; import geivcore.r; импорт geivcore.uesi; импорт geivcore.enginedata.obj.obj; импорт java.awt.color; import java.awt.event.keyevent; com.thrblock.util.randomset; public Class Barnsleyfern Extends Default Factor реализует keylistener {uesi ues; obj crtpoint; public barnsleyfern (uesi ues, int times) {this.ues = ues; crtpoint = Ues.creatobj (uesi.bgindex); crtpoint.addglpoint ("70dbdb", 0,0); crtpoint.show (); crtpoint.setcentralx (0); crtpoint.setcentraly (0); ues.setViewOffsex (90); это i = 0; i <Times; i ++) {generatEnew ();}}@переопределить публичный void dokeybord (keyfactor, кто, int keycode, boolean ispressed) {// метод keyboard io такой же, как и выше (iSpressed) {if (keycode == keyevent.vk_space) {generatenew (); keycode if ate if ate if ate if ate if ate if ate if if ate if ate if ate if ate if ate if ate if ate if ate keycode = keyevent.vk_space). Keyevent.vk_a) {for (int i = 0; i <100; i ++) {generatenew ();}} else if (keycode == keyevent.vk_b) {for (int i = 0; i <100; i ++) {generatEnew ();}} els 1000; i ++) {generatEnew ();}}}} public void generatEnew () {float nx, ny; float ox = crtpoint.getCentralx ()/150f, OY = (600 - crtpoint.getCentrally ()/60f; // Opengl Comportinate Comportinate Comportinate. Double Code = 100,0 * randomset.getrandomfloatin_1 (); // Случайное число с плавающей точкой 0 ~ 100 if (code> = 0 && code <= 1) {nx = 0; ny = 0,00f * ox + 0,16f * oy;} else if (code> 1 && code <= 86) {nx = 0,85f * ox + 0,04f * yy; yy * oxf * 04f * oy; 0,85f*oy + 1,6f;} else if (code> 86 && code <= 93) {nx = 0,2f*ox - 0,26f*oy; ny = 0,23f*ox + 0,22f*oy + 1,6f;} else {nx = -0,15f*ox + 0,28f*oy; ny = 0,26f*0,24f*oy + 0,24 0.44f;} obj newpoint = ues.creatobj (uesi.bgindex); newpoint.addglpoint ("70dbdb", 0,0); newpoint.setcolor (color.green); newpoint.setCentralx (nx*150f); // Cancel предыдущий координатный трансформирование. ny*60f); newpoint.show (); crtpoint = newpoint; // Установить новую точку в текущую точку. } public static void main (string [] args) {uesi ues = new r (); new Barnsleyfern (ues, 0);}}[Результаты моделирования]
Суммировать
Выше приведено все содержание этой статьи о коде игры Java Chaos Game Game Game, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!