topical media & game development

talk show tell print

graphic-processing-algorithm-Ch10-p265-MyGroup.pde / pde



  
  class MyGroup  {
    MySolid [] solids;
    int nsolids;
    color c;
  
    MyGroup (){
      solids = new MySolid[0];
    }
  
    void debug(){
      println("        "+nsolids);
      for(int i=0; i<nsolids; i++)
        for(int j=0; j<solids[i].nfaces; j++)
          for(int k=0; k<solids[i].faces[j].npoints; k++)
            println(solids[i].faces[j].points[k].x + " " +
              solids[i].faces[j].points[k].y + " " +
              solids[i].faces[j].points[k].z );
    }
  
    MyGroup(MySolid[] inSolids){
      nsolids = inSolids.length;
      solids = new MySolid[nsolids];
      for(int i=0; i<nsolids; i++)
        solids[i] = new MySolid(inSolids[i].faces);  
    }
  
    void addSolids(MyPoint[] points, float hite){
      nsolids++;
      solids = (MySolid[])append(solids, new MySolid(points,hite));
    }
  
    //******************
    void draw(){
      sort();
      for(int i=0; i<nsolids; i++)
        solids[i].draw();
  
    }
    void sort(){
      float[] zc;
      zc = new float[nsolids];
      int knt;
      float centerz;
  
      // Calculate the centroids of each solid
      for(int i=0; i<nsolids; i++){
        centerz = 0;
        knt = 0;
        for(int j=0; j<solids[i].nfaces; j++){
          for(int k=0; k<solids[i].faces[j].npoints; k++){
            centerz += solids[i].faces[j].points[k].z;
            knt++;
          }
        }
        zc[i] = centerz/knt;
      }
  
      // Sorting the objects
      for(int i=0; i<nsolids; i++)
        for(int j=0; j<nsolids; j++)
          if(zc[i] > zc[j]){
            MySolid tobj = solids[i];
            solids[i] = solids[j];
            solids[j] = tobj;
            float temp = zc[i];
            zc[i] = zc[j];
            zc[j] = temp;
          }
    }
  
    void setColor(color cin){
      for(int i=0; i<nsolids; i++)
        solids[i].setColor(cin);
    }
    //*************
    void rotatex (float angle, MyPoint ref) {
      for(int i=0; i<nsolids; i++)
        solids[i].rotatex(angle, ref);
    }
  
    //*************
    void rotatey (float angle, MyPoint ref) {
      for(int i=0; i<nsolids; i++)
        solids[i].rotatey(angle, ref);
    }
  
    //*************
    void rotatez (float angle, MyPoint ref) {
      for(int i=0; i<nsolids; i++)
        solids[i].rotatez(angle, ref);
    }
  
    //*************
    void scale(float xs, float ys, float zs, MyPoint ref) {
      for(int i=0; i<nsolids; i++)
        solids[i].scale(xs, ys, zs, ref);
    }
  
    //*************
    void move(float xoff, float yoff, float zoff){
      for(int i=0; i<nsolids; i++)
        solids[i].move(xoff, yoff, zoff);
    }
  
    void setSelected(boolean what){
      for(int i=0; i<nsolids; i++)
        solids[i].setSelected(what);
    }
    boolean pick(int xmouse, int ymouse){
      for(int i=0; i< nsolids; i++)
        if(solids[i].pick(xmouse,ymouse))
          return true;
      return false;
    }
  
    void writeNative(String filename){
      PrintWriter out = createWriter(filename);
      out.println("native format");
      out.println(nsolids);
      for(int i=0; i< nsolids; i++){
        out.println(solids[i].nfaces);
        for(int ii=0; ii<solids[i].nfaces; ii++){
          out.println(solids[i].faces[ii].npoints);
          for(int iii=0; iii<solids[i].faces[ii].npoints; iii++){
            out.print(solids[i].faces[ii].points[iii].x + " " );
            out.print(solids[i].faces[ii].points[iii].y + " " );
            out.print(solids[i].faces[ii].points[iii].z + " " );
            out.print("\n");
          }
        }
      }
      out.flush();
      out.close();                  
    } 
  
    void openNative(String filename){
  
      String lines[] = loadStrings(filename);
      if(lines.length==0)return;
      int k=0;
      if(!lines[k++].equals("native format")){
        println("File format not native");
        return;
      }
      // loop to read the data
      nsolids = int(lines[k++]);
      solids = new MySolid[nsolids];
      for(int i=0; i< nsolids; i++){
        int nfaces = int(lines[k++]);
        MyFace [] f = new MyFace[nfaces];
        for(int ii=0; ii<nfaces; ii++){
          int npoints = int(lines[k++]);
          MyPoint [] p = new MyPoint[npoints];
          for(int iii=0; iii<npoints; iii++){
            String coords[] = split(lines[k++]," ");
            p[iii] = new MyPoint(float(coords[0]),float(coords[1]),float(coords[2]));
          }
          f[ii] = new MyFace(p);
        }
        solids[i] = new MySolid(f);
      } 
    } 
  
    void writeDXF(String filename) {
  
      println("Writing file " + filename + "...");
      PrintWriter out = createWriter(filename);
  
      out.println("0");
      out.println("SECTION");
      out.println("2");
      out.println("ENTITIES");
      for(int i=0; i<nsolids; i++)
        // for shapes
        for(int ii=0; ii<solids[i].nfaces; ii++)
          // for points
          for(int iii=0; iii<solids[i].faces[ii].npoints-2; iii++){
            out.println("  0 ");
            out.println("3DFACE");
            out.println(" 10");   // first x
            out.println(solids[i].faces[ii].points[0].x);
            out.println(" 20 ");  // first y
            out.println(solids[i].faces[ii].points[0].y);
            out.println(" 30 ");  // first z
            out.println(solids[i].faces[ii].points[0].z);
            out.println(" 11");   // second x
            out.println(solids[i].faces[ii].points[iii+1].x);
            out.println(" 21 ");  // second y
            out.println(solids[i].faces[ii].points[iii+1].y);
            out.println(" 31 ");  // second z
            out.println(solids[i].faces[ii].points[iii+1].z);
            out.println(" 12");   // third x
            out.println(solids[i].faces[ii].points[iii+2].x);
            out.println(" 22 ");  // third y
            out.println(solids[i].faces[ii].points[iii+2].y);
            out.println(" 32 ");  // third z
            out.println(solids[i].faces[ii].points[iii+2].z);
            out.println(" 13");   // fourth x
            out.println(solids[i].faces[ii].points[iii+2].x);
            out.println(" 23 ");  // fourth y
            out.println(solids[i].faces[ii].points[iii+2].y);
            out.println(" 33 ");  // fourth z
            out.println(solids[i].faces[ii].points[iii+2].z);
          }
      out.println("  0 ");
      out.println("ENDSEC");
      out.println("  0");
      out.println("EOF");
      //*** Finish
      out.flush();
      out.close();
    }
  
    void openDXF_3DFACE(String filename){
  
      String lines[] = loadStrings(filename);
      if(lines.length==0)return;
      int k=0;
      //MySolid [] s = new MySolid[0];
      MyFace [] f = new MyFace[0];
      MyPoint [] p = new MyPoint[0];
      float tx=0.,ty=0.;
      boolean face_found = false;
  
      for(int ii=0; ii<lines.length; ii++){
        String code = trim(lines[ii]);
        if(code.equals("AcDbFace"))face_found=true;
        if(face_found &&(code.equals("10")||code.equals("11")||
          code.equals("12")||code.equals("13")))
          tx = float(lines[ii+1]);
        if(face_found &&(code.equals("20")||code.equals("21")||
          code.equals("22")||code.equals("23")))
          ty = float(lines[ii+1]);
        if(face_found &&(code.equals("30")||code.equals("31")||
          code.equals("32")||code.equals("33"))){
          p = (MyPoint[])append(p, new MyPoint(tx,ty,float(lines[ii+1])));
          //println(tx + " " + ty + " " + lines[ii+1]); 
        }
        if(p.length==4){
          face_found=false;
          f = (MyFace[])append(f,new MyFace(p));
          solids = (MySolid[])append(solids,new MySolid(f));
          nsolids++;
          println(nsolids);
          p = (MyPoint[])expand(p,0);
          f = (MyFace[])expand(f,0);
        } 
      }
    }
  
    
******************************************************

  
    void writeVRML(String filename) {
  
      println("Writing file " + filename + "...");
      PrintWriter out = createWriter(filename);
  
      //out.println("0");
      out.println("#VRML V1.0 ascii");
      out.println("");
      out.println("#Creator My3D");
      out.println("#Date "+day()+"/"+month()+"/"+year()+" "+hour()+":"+minute()+":"+second());  // put time here. You can use Calendar/DateFormat
      out.println("#User Kostas Terzidis");    // put some identification here
      out.println("");
      out.println("DEF Color_1 Material {");  //hard coded
  
      out.println("        ambientColor "+red(solids[0].c)/256.+" "+green(solids[0].c)/256.+" "+blue(solids[0].c)/256.);   
      out.println("        diffuseColor 0.381476 0.30518 0.762951");
      out.println("        transparency 0");
      out.println("}");
      out.println("");
  
      for(int k=0; k<nsolids; k++){
        out.println("DEF " + "solid_" + k + " Separator {");
        out.println("        Coordinate3 {");
        out.println("                point [");
        for(int j=0; j<solids[k].nfaces; j++)  {
          //out.println("j = " + j + "numPoints=" + group.solids[k].faces[j].npoints);
          for(int i=0; i<solids[k].faces[j].npoints; i++)  {
            out.println("                        " +
              solids[k].faces[j].points[i].x+ " " +
              solids[k].faces[j].points[i].y+ " " +
              solids[k].faces[j].points[i].z+","   );
          }
  
        }
        out.println("                ]");
        out.println("        }");
        out.println("        USE Color_1");  //hard coded
        out.println("        IndexedFaceSet {");
        out.println("                coordIndex [");
        for(int j=0; j<solids[k].nfaces; j++)  {
          out.print("                        " );
          for(int i=0; i<solids[k].faces[j].npoints; i++)  {
            out.print((j*solids[k].faces[j].npoints+i) + ", " );
          }
          out.println("-1,");
          //out.println("");
        }
        out.println("                ]");
        out.println("        }");
        out.println("}");
      }
  
      //Finish
      out.flush();
      out.close();
    }
  
    void  readVRML(String filename) {
      String lines[] = loadStrings(filename);
      if(lines.length==0)return;
      MySolid [] s = new MySolid[0];
      MyFace  [] f = new MyFace[0];
      MyPoint [] p = new MyPoint[0];
      MyPoint [] ptemp = new MyPoint[0];
      boolean point_flag = false;
      boolean coordindex_flag = false;
  
      for(int i=0; i<lines.length; i++){
        if(match(lines[i],"point")!=null){
          point_flag=true;
          continue;
        }
        if(match(lines[i],"coordIndex")!=null){
          coordindex_flag=true;
          continue;
        }
        if(point_flag && match(lines[i],"]")!=null){
          point_flag=false;
          continue;
        }
        if(coordindex_flag && match(lines[i],"]")!=null){
          coordindex_flag=false;
          solids = (MySolid[])append(solids,new MySolid(f));
          nsolids++;
          f = (MyFace[])expand(f,0);
          ptemp = (MyPoint[])expand(ptemp,0);
          p = (MyPoint[])expand(p,0);
          continue;
        }
  
        String [] code = splitTokens(lines[i],", ");
        if(point_flag)
          p = (MyPoint[])append(p, new MyPoint(float(code[0]), float(code[1]), float(code[2])));
        if(coordindex_flag){
          for(int ii=0; ii<code.length-1; ii++)
            ptemp = (MyPoint[])append(ptemp, new MyPoint(p[int(code[ii])].x,p[int(code[ii])].y,p[int(code[ii])].z));
          f = (MyFace[])append(f,new MyFace(ptemp));
        }  
      }     
    }      
  }
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.