/** * Constructor. * * @param inpParApp Parent PApplet. * @param inpResNbr Resolution of the sphere. * @param inpModelRadiusNbr Radius of the sphere. * @param inpExtDatFilePathTxt Path to an external data file for manipulating the sphere. */ public Sphere( PApplet inpParApp, float inpResNbr, float inpModelRadiusNbr, String inpExtDatFilePathTxt) { _parApp = inpParApp; _resNbr = inpResNbr; _modelRadiusNbr = inpModelRadiusNbr; _latitudeLnCnt = (int) (180 / _resNbr); _longitudeLnCnt = (int) (360 / _resNbr); // The number of vertices is the number of longitudinal lines multiplied by the number of // latitudinal lines minus 1, plus 2 vertices for the poles. int vertexCnt = _longitudeLnCnt * (_latitudeLnCnt - 1) + 2; _latitudeDegs = new float[vertexCnt]; _longitudeDegs = new float[vertexCnt]; _radiusLenNbrs = new float[vertexCnt]; // createVertices(0); crteVertices(); FROM_CLR_NBR = _parApp.color(144, 29, 31); TO_CLR_NBR = _parApp.color(215, 180, 15); _loadFilePathTxt = inpExtDatFilePathTxt; loadExtData(); }
// Draw a box at the location public void highlightLocation(Location l) { p.fill(p.color(50, 200, 50, 150)); p.rect(xCoordOf(l), yCoordOf(l), dx, dy); }
void generate(PApplet pa) { int space = World.space; // sz^3 pisteitä, joiden välillä space tyhjää (tyhjä 0: kuutio) // eli (sz + (sz - 1) * space) ^ 3 tileä // visited ~ V_new wikipedian algossa boolean[] visited = new boolean[size3]; int[] visitorder = new int[size3]; // indeksoidaan järjestysnumerolla // aluksi size on pisteiden määrä, newsize sitten kun niiden väliin on venytetty kulkuväyliä int newsz = size + (size - 1) * space; int newsz3 = newsz * newsz * newsz; map = new int[newsz3]; // lähtöpaikka visitorder[0] = 0; visited[0] = true; map[0] = 0xffffffff; // käydään kaikki alkuperäiset pisteet läpi, jokaiseen mennään jotenkin for (int count = 1; count < size3; count++) { // - arvo tiili reunalta // (randomilla saattaa tulla sellainenkin joka ei ole reunalla, ei väliä kun ei jättikarttoja) // vois tietty pitää listaa sellaisista joista ei vielä pääse kaikkialle... // - arvo sille suunta // - visitoi se. int vidx; do { vidx = (int) (pa.random(0, count)); // monesko jo visitoitu leviää. } while (full(visited, visitorder[vidx])); int idx = visitorder[vidx]; int z = idx / (size * size), y = idx / size % size, x = idx % size; // joku vierestä, dir on akselin suuntainen yksikkövektori int[] dir = getadj(pa, x, y, z, visited); int nx = x + dir[0], ny = y + dir[1], nz = z + dir[2]; int newidx = world.at(nx, ny, nz); visitorder[count] = newidx; visited[newidx] = true; // nykykohta venytetyssä maailmassa int i = x * (space + 1), j = y * (space + 1), k = z * (space + 1); // nurkkien välillä debugväreillä for (int a = 0; a < space; a++) { i += dir[0]; j += dir[1]; k += dir[2]; // vihreä kasvaa iteraatioiden kasvaessa, sininen taas z:n mukaan map[world.at(i, j, k, newsz)] = pa.color(1, (int) ((float) count / size3 * 255), (int) ((float) k / newsz * 255)); } // verkon kärkipisteet punaisia map[world.at(i + dir[0], j + dir[1], k + dir[2], newsz)] = pa.color(255, 0, 0); } world.size = newsz; world.size3 = newsz3; world.map = map; }