topical media & game development

talk show tell print

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



  
  class MyGroup  {
    MySolid [] solids;
    int nsolids;
    color c;
  
    MyGroup (){
      solids = new MySolid[0];
    }
  
    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(String filename){
     
     String lines[] = loadStrings(filename);
     if(lines.length==0)return;
     int k=0;
     Vector vsolids = new Vector();
     Vector vfaces = new Vector();
     Vector vpoints = new Vector();
     float tx,ty,tz;
     boolean poly_found = false;
     
     for(int ii=0; ii<lines.length; ii++){
        String code = trim(lines[ii]);
        if(code.equals("POLYLINE")) poly_found=true;
     while(!lines[k].equals("30")){
     if(poly_found && code.equals("10"))
         tx = float(lines[ii+1]);
     if(poly_found && code.equals("20"))
         ty = float(lines[ii+1]);
     if(poly_found && code.equals("30"))
          vpoints.addElement(new MyPoint(tx,ty,float(lines[ii+1])));
     }
     tz = float(lines[k++]);
     vpoints.addElement(new MyPoint(tx,ty,tz));
     }
     k++;
     }
     MyPoint [] p = new MyPoint[vpoints.size()];
     for(int i=0; i<vpoints.size(); i++){
     p[i] = (MyPoint)vpoints.elementAt(i);  
     vfaces.addElement(new MyFace(p));
     }
     k++;
     }
     MyFace [] f = new MyFace[vfaces.size()]; 
     for(int i=0; i<vfaces.size(); i++)
     f[i] = (MyFace)vfaces.elementAt(i);  
     
     //solids = new MySolid(f);
     
     }
  */
    void openDXF_3DFACE(String filename){
  
      String lines[] = loadStrings(filename);
      if(lines.length==0)return;
      int k=0;
      Vector vfaces = new Vector();
      MyFace [] f;
      Vector vpoints = new Vector();
      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")))
          vpoints.addElement(new MyPoint(tx,ty,float(lines[ii+1])));
        if(vpoints.size()==4){
          face_found=false;
          MyPoint [] p = new MyPoint[vpoints.size()];
          for(int i=0; i<vpoints.size(); i++) //
            p[i] = (MyPoint)vpoints.elementAt(vpoints.size()-1-i); //reverse order 
          vfaces.addElement(new MyFace(p));
          vpoints.removeAllElements(); 
        }
      }   
      nsolids = vfaces.size();
      f = new MyFace[1]; 
      solids = new MySolid[nsolids];
      for(int i=0; i<nsolids; i++){
        f[0] = (MyFace)vfaces.elementAt(i); 
        solids[i] = new MySolid(f);
      }
    }
  }
  


(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.