Esempio n. 1
0
  // 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;
  }
Esempio n. 2
0
  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;
  }
Esempio n. 3
0
  /**
   * 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;
  }
Esempio n. 4
0
  // 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));
  }
Esempio n. 5
0
  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;
  }