// joku randomilla tämän vierestä // tylsä bruteforcemenetelmä hajotusfiiliksen tuotoksena int[] getadj(PApplet pa, int x, int y, int z, boolean[] visited) { // {-x, x, -y, y, -z, z} int[][] dirs = { {-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1} }; boolean ok = true; int[] dir; do { int i = (int) (pa.random(0, 6)); dir = dirs[i]; ok = true; if (x == 0 && i == 0) ok = false; if (y == 0 && i == 2) ok = false; if (z == 0 && i == 4) ok = false; if (x == size - 1 && i == 1) ok = false; if (y == size - 1 && i == 3) ok = false; if (z == size - 1 && i == 5) ok = false; } while (!ok || visited[world.at(x + dir[0], y + dir[1], z + dir[2])]); return dir; }
public static ArrayList<BChar> buildString(PApplet app, String str, float wander) { ArrayList<BChar> bchars = new ArrayList<BChar>(str.length()); for (int i = 0, n = str.length(); i < n; i++) { bchars.add(new BChar(str.substring(i, i + 1), app.random(-wander, wander))); if (i > 0) bchars.get(i - 1).addChild(bchars.get(i)); } return bchars; }
/** * Calculates the new height to assign to a vertex and stores that value in our array of vertex * heights. * * @param inpVertexIdx The index of this vertex in our arrays. * @param inpPrevAudioFrameLvlNbr The level number of the previous audio frame. * @param inpCurrAudioFrameLvlNbr The level number of the current audio frame. * @return The height at which to draw the vertex. */ private float calcAndStoreNewVertexHghtNbr( int inpVertexIdx, float inpPrevAudioFrameLvlNbr, float inpCurrAudioFrameLvlNbr) { float rtnVertexHghtNbr = 0; rtnVertexHghtNbr = _modelRadiusNbr + _parApp.random( 0, AMPLITUDE_SCALE_NBR * PApplet.lerp( inpPrevAudioFrameLvlNbr, inpCurrAudioFrameLvlNbr, HGHT_INTERPOLATION_NBR)); _radiusLenNbrs[inpVertexIdx] = rtnVertexHghtNbr; return rtnVertexHghtNbr; }
// Constructor Box(PApplet parent, PBox2D box2d, float x, float y, float w_, float h_, boolean lock) { this.parent = parent; this.box2d = box2d; w = w_; h = h_; // Define and create the body BodyDef bd = new BodyDef(); bd.position.set(box2d.coordPixelsToWorld(new Vec2(x, y))); if (lock) bd.type = BodyType.STATIC; else bd.type = BodyType.DYNAMIC; body = box2d.createBody(bd); // Define the shape -- a (this is what we use for a rectangle) PolygonShape sd = new PolygonShape(); float box2dW = box2d.scalarPixelsToWorld(w / 2); float box2dH = box2d.scalarPixelsToWorld(h / 2); sd.setAsBox(box2dW, box2dH); // Define a fixture FixtureDef fd = new FixtureDef(); fd.shape = sd; // Parameters that affect physics fd.density = 1; fd.friction = 0.3f; fd.restitution = 0.5f; body.createFixture(fd); // Give it some initial random velocity body.setLinearVelocity(new Vec2(parent.random(-5, 5), parent.random(2, 5))); body.setAngularVelocity(parent.random(-5, 5)); }
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; }