import processing.core.*; import ORG.netlib.math.complex.*; public class MobiusDFS extends PApplet { /** * */ private static final long serialVersionUID = 1L; int windowsize=300; int DEPTH=120; float EPSILON=0.1f; float SCALE=2.5f; matrix[] word = new matrix[1000]; matrix[] gen = new matrix[5]; Complex[][] parabolics = new Complex[5][4]; int level=1; int[] tag= new int[1000]; Complex oldPoint, newPoint, tempPoint; public void setup() { size(windowsize, windowsize); fill(255); rect(0,0,windowsize,windowsize); background(255); Complex ta = new Complex(1.95f, 0.02f); Complex tb = new Complex(2.01f,0.0f); Complex tab = generateTab(ta, tb); Complex z0 = generatez0(ta, tb, tab); matrix Ma = generateMatrixA(ta, tb, tab, z0); matrix Mb = generateMatrixB(ta, tb, tab, z0); matrix MA = Ma.inv(); matrix MB = Mb.inv(); gen[0]=null; gen[1] = Ma; gen[2] = Mb; gen[3] = MA; gen[4] = MB; oldPoint = fixedPoint(gen[1].mul(gen[2]).mul(gen[3]).mul(gen[4])); parabolics[1][1] = fixedPoint(Mb.mul(MA).mul(MB).mul(Ma)); parabolics[1][2] = fixedPoint(Ma); parabolics[1][3] = fixedPoint(MB.mul(MA).mul(Mb).mul(Ma)); parabolics[2][1] = fixedPoint(MA.mul(MB).mul(Ma).mul(Mb)); parabolics[2][2] = fixedPoint(Mb); parabolics[2][3] = fixedPoint(Ma.mul(MB).mul(MA).mul(Mb)); parabolics[3][1] = fixedPoint(MB.mul(Ma).mul(Mb).mul(MA)); parabolics[3][2] = fixedPoint(MA); parabolics[3][3] = fixedPoint(Mb.mul(Ma).mul(MB).mul(MA)); parabolics[4][1] = fixedPoint(Ma.mul(Mb).mul(MA).mul(MB)); parabolics[4][2] = fixedPoint(MB); parabolics[4][3] = fixedPoint(MA.mul(Mb).mul(Ma).mul(MB)); tag[1]=1; word[1]=gen[1]; frameRate(10000); //noFill(); stroke(0,0,180); strokeWeight(0.2f); smooth(); } public void draw() { while(!(branchTermination())) { goForward(); } goBackward(); while( !((level==0)||(availableTurn()))) { goBackward(); } if(!((tag[1]==2)&&(level==0))) { turnAndGoForward(); } else { // saveFrame("DFStest.tif"); noLoop(); } } public void goBackward() { level--; } public void goForward() { level++; tag[level] = (tag[level-1])%4 +1; word[level] = word[level-1].mul(gen[tag[level]]); } public boolean availableTurn() { if ((tag[level+1])%4 == (tag[level]+3)%4) { return false; } else { return true; } } public void turnAndGoForward() { tag[level+1] = (tag[level+1] +3)%4; if(tag[level+1]==0) { tag[level+1]=4; } if(level==0) { word[1] = gen[tag[1]]; } else { word[level+1] = word[level].mul(gen[tag[level+1]]); } level++; } public boolean branchTermination() { Complex[] z= new Complex[4]; newPoint = mobius(oldPoint, word[level]); float dist=distance(oldPoint, newPoint); for(int j=1; j<=3; j++) { z[j]=mobius(parabolics[tag[level]][j],word[level]); } if(level>=DEPTH || ((dist