topical media & game development
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.