[소개]
나는 "The Secret Concise"를 읽고 있습니다. 프랙탈 차트를 생성하기 위해 노이즈를 사용하는 몇 가지 방법을 소개하는 장이 있습니다. 매우 흥미로운 느낌이 들기 때문에 컴퓨터를 사용하여 시뮬레이션하려고했는데 효과가 나쁘지 않습니다 (노이즈 방법은 전통적인 반복 방법보다 프로그래밍에서 구현하기가 더 쉽습니다. 나중에는 여전히 많은 알고리즘이 있다는 것을 알았으므로 Chaosgame을 검색 할 때 더 많은 것을 찾을 수 있습니다).
[Sierpinski 삼각형 소음 생성 방법]
이 노이즈 게임에서 Sierpinski 삼각형을 생성하기위한 규칙이 가장 쉽습니다.
1. 비행기에서 3 개의 점을 선택한 3 개의 점을 1, 2 및 3으로 표시하여 큰 삼각형의 정점으로 표시됩니다.
2. 그 중 하나를 "현재 지점"(예 : No. 1 선택)으로 선택하십시오.
3. 1 ~ 3의 임의 수를 생성하고 정점의 중간 점과 숫자로 표현 된 "현재 지점"에 새 지점을 그립니다. 새로운 지점을 "현재 지점"으로 사용하십시오.
4. 3 단계를 반복하여 패턴에 더 가까워집니다.
*. 임의의 숫자에주의를 기울이면 시간을 종자 생성 방식으로 사용하지 않는 것이 가장 좋습니다.
[시뮬레이션 프로그램]
패키지 com.geiv.chaos; import java.awt.event.keyevent; import com.thrblock.util.randomset; import geivcore.defaultfactor; import geivcore.keyfactor; import geivcore.keylistener; import geivcore.r; import geivcore.ues geivcore.obj.obj.obj. DefaultFactor는 Keylistener {uesi ues; obj [] BasePoint; obj crtpoint; public sierpinski (uesi ues, int times) {this. ues.creatobj (uesi.bgindex); basepoint [i] .addglpoint ( "70dbdb", 0,0); BasePoint [i] .show ();} basePoint [0] .setCentralx (400); // 3 점 위치를 설정합니다 BasePoint [0] .SetCentraly (60); BasePoint [1] .setCentralx (60); BasePoint [1] .SetCentraly (550); BasePoint [2] .setCentralx (740); BasePoint [2] .setCentraly (550); CRTPoint = BasePoint [0]; // 0을 전류 점으로 취합니다 this.setKeylistener (this); ues.pushkeyboardio (this); for (int i = 0; i <times; i ++) {generatenew ();}}@public void dokeybord (keyfactor, int keycode, boolean isspressed) {// mount callback if (keycode) {if a new a new a new a new a new a new a new a a mount callback. generatenew ();} else if (keycode == keyEvent.vk_a)에 해당하는 점 {// a는 (int i = 0; i <100; i ++) {generatenew ();}} else if (keycode == keyevent.vk_b)에 해당합니다. 1000; i ++) {generatenew ();}}}}} public void generatenew () {obj flagpoint = basePoint [randomset.getrandomnum (0, 2)]; // 참조 포인트 중 하나가 float nx = (flagpoint.getcentralx ()+crtpoint.getcentralx ()/2f; // calculate; // caltulate; // (flagpoint.getcentraly () + crtpoint.getCentraly ())/2f; obj newPoint = ues.creatoBj (uesi.bgindex); // new point.addglpoint ( "70dbdb", 0,0); newPoint.setColor (randomset.setrandomcoldcolor (); NewPoint.CETCETCED (); coordinates newpoint.setCentraly (ny); newpoint.show (); crtpoint = newpoint; // 현재 지점으로 설정} public static void main (string [] args) {uesi ues = new r (); new Sierpinski (ues, 0); // 후속 구성 매개 변수는 초기 번호를 설정할 수 있습니다. }}[시뮬레이션 결과]
B 키를 누르면
[Barnsleyfern의 소음 생성 방법]
Sierpinski Triangle의 단순한 규칙 성과 비교하여 Barnsleyfern (Fractal Tooth Grass)은 사람들에게 더 복잡한 인상을줍니다. 복잡성으로 인해 혼돈의 징계는 종종 "간단한 규칙이 복잡한 대상을 생성 할 수있다"는 결론을 증명하기 위해 나타납니다.
생성 규칙은 복잡하지 않습니다.
1. 먼저, "현재 지점"(0,0)을 고려할 때, 우리는 OX와 OY를 사용하여 수평 및 수직 좌표를 나타냅니다.
2. 다음 포인트 (NX, NY)를 계산하려면 특정 임의 규칙을 가진 다음 4 개의 반복 공식 중 하나를 선택해야합니다.
1) %1의 확률 로이 반복 공식을 선택하십시오.
NX = 0;
ny = 0.16f*oy;
2) %85의 확률 로이 반복 공식을 선택하십시오.
NX = 0.85*ox+0.04*OO;
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에서 발췌 한 것입니다. 프로그래밍 할 때 문제가 발견되었습니다. Wiki는이 좌표의 상대 값과 화면 크기 사이의 관계를 지정하지 않았으며 x 및 y 축 방향을 지정하지도 않았습니다. 그림은 내가 정의한 좌표계에서 항상 실패했습니다. 나중에, 나는 공식에 따라 검색 하고이 표면을 발견했습니다 : http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp. 이것은 C ++의 OpenGL 프로그램이며 Wiki와 동일한 공식이 사용됩니다. 즉,이 공식 세트는 OpenGL의 좌표계를 기반으로합니다. 해당 변환을 수행 한 후 마침내 성공적으로 그려졌습니다.
[시뮬레이션 프로그램]
패키지 com.geiv.chaos; import geivcore.defaultor; import geivcore.keyfactor; import geivcore.keylistener; import geivcore.r; import geivcore.uesi; import geivcore.enginedata.obj.obj; import java.awt.color; import java.awt.event.event.cyevent; com.thrblock.util.randomset; public class barnsleyfern 확장 기본 Factactor emplements keylistener {uesi ues; obj crtpoint; public barnsleyfern (uesi ues, int times) {this.ues; crtpoint = ues.creatobj (uesi.bgindex); crtpoint.addglpoint ( "70dbdb", 0,0); crtpoint.show (); crtpoint.setcentralx (0); crtpoint.setcentraly (0); ues.setviewoffsetx (90); this 0; i <times; i ++) {generatenew ();}}@public void dokeybord를 재정의합니다. 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 ();}} else (keycode == keyevent.vk_b) {int i = 0 (int i = 0). 1000; i ++) {generatenew ();}}}} public void generatenew () {float nx, ny; float ox = crtpoint.getcentralx ()/150f, oy = (600- crtpoint.getCentral.getCentraly ())/60f; // coperning coordinate는 해당 반전이 새로워지고 새로운 포인트 위치가 다시 시작됩니다. Double Code = 100.0 * randomset.getRandomfloatin_1 (); // 랜덤 플로팅 포인트 번호 0 ~ 100 if (code> = 0 && code <= 1) {nx = 0; ny = 0.00f * ox + 0.16f * ooy;} else if (코드> 1 && code <= 86) {nx = 0.85f * ox + 0.04f * 옥스 * 옥시; 0.85f*oy + 1.6f;} else if (코드> 86 && 코드 <= 93) {nx = 0.2f*ox -0.26f*oy; ny = 0.23f*ox + 0.22f*oy + 1.6f;} else {nx = -0.15f*ox + 0.28f*ay = 0.26f*ox + 0.24f*ay 0.44f;} obj newpoint = ues.creatobj (uesi.bgindex); newpoint.addglpoint ( "70dbdb", 0,0); newPoint.setColor (color.green); newPoint.setCentralx (nx*150f); // 이전 좌표 newPoint.setCentraly (600- ny*60f); newpoint.show (); crtpoint = newPoint; // 새 지점을 현재 지점으로 설정합니다. } public static void main (String [] args) {uesi ues = new r (); New Barnsleyfern (ues, 0);}}[시뮬레이션 결과]
요약
위는 Java Chaos Game Noise Game 예제 코드에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!