English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
[개요]
최근에 《심오한 간결성》을 읽고, 노이즈를 사용하여 분형을 생성하는 방법에 대해 소개하는 장이 있었습니다. 흥미롭게 생각되어 컴퓨터를 사용하여 시뮬레이션을 시도했고, 결과는 꽤 좋았습니다(노이즈 방법은 전통적인 반복 방법보다 프로그래밍이 더 쉬워 보였고, 나중에는 이러한 알고리즘들이 많이 있다는 것을 알게 되었습니다. chaosgame를 검색하면 더 많은 정보를 찾을 수 있습니다).
[Sierpinski 삼각형의 노이즈 생성 방법]
이러한 노이즈 게임에서, Sierpinski(셰르빈스키) 삼각형의 생성 규칙은 가장 간단합니다:
1.평면에서 세 점을 선택하여, 이를1、2、3으로 대각선 삼각형의 정점으로 사용합니다.
2.중 하나를 선택하여 "현재 점"으로 사용합니다(예:1번)。
3.생성합니다1~3의 무작위 수를 사용하여, 이 수가 표현하는 정점과 "현재 점"의 중점에서 새로운 점을 그립니다. 그리고 이 새로운 점을 "현재 점"으로 설정합니다.
4.단계를 반복합니다3으로 점근할 수 있습니다.
*.무작위 수를 시간을 종자로 사용하지 않는 것이 좋습니다.
[��擬程序]
package 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.UESI; import geivcore.enginedata.obj.Obj; public class Sierpinski extends DefaultFactor implements KeyListener{ UESI UES; Obj[] basePoint; Obj crtPoint; public Sierpinski(UESI UES,int times){ this.UES = UES; basePoint = new Obj[3]; //세 개의 기준점을 생성합니다 for (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].setCentralY(550); crtPoint = basePoint[0]; //0번 점을 현재 점으로 설정합니다 this.setKeyListener(this); UES.pushKeyBoardIO(this); for (int i = 0; i < times; i++){ generateNew(); } } @Override public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) { //콜백을 마운트합니다 if(ispressed){ if(keyCode == KeyEvent.VK_SPACE){ //공백을 입력하면 새로운 점을 생성합니다 generateNew(); } else if(keyCode == KeyEvent.VK_A){ //A에 해당하여 생성100개의 새로운 점 for (int i = 0; i < 100; i++){ generateNew(); } } else if(keyCode == KeyEvent.VK_B){ //B에 해당하여 생성1000개의 새로운 점 for (int i = 0; i < 1000; i++){ generateNew(); } } } } public void generateNew(){ Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2); //무작위로 기준점 중 하나를 선택합니다 float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f; //중간 값을 계산합니다 float ny = (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; //현재 점으로 설정합니다 } public static void main(String[] args) { UESI ues = new R(); new Sierpinski(ues,0); //초기 점수를 설정할 수 있는 초기 설정 파라미터를 설정할 수 있습니다. } }
[모의 결과]
B 키가 눌러진 상태에서
[Barnsley fern의 노이즈 생성 방법]
Sierpinski 삼각형의 간단한 규칙성에 비해, Barnsley fern(분형 양치화)은 더 복잡한 인상을 줍니다. 이 복잡성 덕분에,混沌학은 "간단한 규칙으로 복잡한 대상을 생성할 수 있다"는 결론을 증명하기 위해 자주 이를 사용합니다.
그 생성 규칙도 매우 간단합니다:
1.먼저 "현재 점"(0,0)을 주어서, 우리는 ox, oy를 사용하여 경계 좌표를 나타냅니다.
2다음 점(nx,ny)를 계산하려면, 다음 네 가지 반복 공식 중 하나를 선택하여 특정 무작위 규칙에 따라 계산합니다:
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프로그래밍을 할 때, Wiki에서는 이 좌표의 절대값과 스크린 크기의 관계를 명시하지 않았으며, 또한 x, y축의 방향도 설명하지 않았습니다. 나의 정의된 좌표계에서 그리면 항상 실패했습니다. 나중에 이 공식을 검색하여 이 면을 찾았습니다:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp.이것은 C++의 OPENGL 프로그램에서 사용된 공식과 Wiki에서 사용된 공식이 같다는 것을 의미하며, 이 그룹의 공식은 Opengl의 좌표계를 기준으로 하여, 필요한 변환을 통해 최종적으로 성공적으로 그려졌습니다.
[��擬程序]
package com.geiv.chaos; import geivcore.DefaultFactor; 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.KeyEvent; import com.thrblock.util.RandomSet; public class Barnsleyfern extends DefaultFactor implements 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.setViewOffsetX(90); this.setKeyListener(this); UES.pushKeyBoardIO(this); for (int i = 0; i < times; i++){ generateNew(); } } @Override public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) { //키보드 IO 방식은 위의 예제와 동일합니다. if(ispressed){ if(keyCode == KeyEvent.VK_SPACE){ generateNew(); } else if(keyCode == KeyEvent.VK_A){ for (int i = 0; i < 100; i++){ generateNew(); } } else if(keyCode == KeyEvent.VK_B){ for (int i = 0; i < 1000; i++){ generateNew(); } } } } public void generateNew(){ float nx, ny; float ox = crtPoint.getCentralX()/150f, oy = (600 - crtPoint.getCentralY())/60f; //여기서 OPENGL 좌표 변환을 수행하고, 새로운 포인트 위치를 설정할 때 반대로 반전합니다. double 코드 = 100.0 * RandomSet.getRandomFloatIn_1(); //임의의 실수 숫자 0~100 if(code >= 0&&code <= 1){ nx = 0; ny = 0.00f * ox + 0.16f * oy; } 1&& code <= 86){ nx = 0.85f*ox + 0.04f*oy; ny = -0.04f*ox + 0.85f*oy + 1.6f; } 86&& code <= 93){ nx = 0.2f*ox - 0.26f*oy; ny = 0.23f*ox + 0.22f*oy + 1.6f; } nx = -0.15f*ox + 0.28f*oy; ny = 0.26f*ox + 0.24f*oy + 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 노이즈 게임 예제 코드에 대한 모든 내용입니다. 많은 도움이 되길 바랍니다. 관심이 있는 분은 웹사이트에서 다른 관련 주제를 참고하시기 바랍니다. 불충분한 부분이 있으면 댓글을 달아 주시기 바랍니다. 웹사이트에 대한 지지에 감사합니다!
언급: 본 내용은 인터넷에서 가져왔으며, 원작자의 소유물입니다. 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 웹사이트는 소유권을 가지지 않으며, 인공적인 편집을 거치지 않았으며, 관련 법적 책임도 부담하지 않습니다.涉嫌 저작권 내용이 발견되면 이메일을 보내 주시기 바랍니다: notice#oldtoolbag.com(이메일을 보내는 경우, #을 @으로 변경하십시오. 신고하고 관련 증거를 제공하시면, 해당 내용이 확인되면 즉시 해당 내용을 삭제할 것입니다.