package org.jcae.viewer3d; import javax.media.j3d.BranchGroup; import javax.media.j3d.GeometryArray; import javax.media.j3d.LineArray; import javax.media.j3d.Shape3D; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector4d; public class ClipBox { Point3d p1; Point3d p2; BranchGroup branchGroup; final static double offsetFactor=0.00001; public ClipBox(Point3d p1,Point3d p2){ this.p1=p1; this.p2=p2; } private void getMinMax(double[] min,double max[],double extended){ double[] p1Values=new double[3]; double[] p2Values=new double[3]; p1.get(p1Values); p2.get(p2Values); for(int i=0;i<3;i++){ min[i]=(1-extended)*Math.min(p1Values[i],p2Values[i]); max[i]=(1+extended)*Math.max(p1Values[i],p2Values[i]); } } public BranchGroup getShape(){ if(branchGroup==null){ double[][] ptValues=new double[2][3]; getMinMax(ptValues[0],ptValues[1],0); LineArray la=new LineArray(24,GeometryArray.COORDINATES | GeometryArray.COLOR_3); int[][] w=new int[][]{{0,0,0},{1,1,0},{1,0,1},{0,1,1}}; Color3f color=new Color3f(1,0,0); for(int i=0;i<4;i++){ int[] v=w[i]; la.setCoordinate(6*i,new Point3d(ptValues[v[0]][0],ptValues[v[1]][1],ptValues[v[2]][2])); la.setColor(6*i,color); la.setCoordinate(6*i+1,new Point3d(ptValues[((v[0]+1)%2)][0],ptValues[v[1]][1],ptValues[v[2]][2])); la.setColor(6*i+1,color); la.setCoordinate(6*i+2,new Point3d(ptValues[v[0]][0],ptValues[v[1]][1],ptValues[v[2]][2])); la.setColor(6*i+2,color); la.setCoordinate(6*i+3,new Point3d(ptValues[v[0]][0],ptValues[((v[1]+1)%2)][1],ptValues[v[2]][2])); la.setColor(6*i+3,color); la.setCoordinate(6*i+4,new Point3d(ptValues[v[0]][0],ptValues[v[1]][1],ptValues[v[2]][2])); la.setColor(6*i+4,color); la.setCoordinate(6*i+5,new Point3d(ptValues[v[0]][0],ptValues[v[1]][1],ptValues[((v[2]+1)%2)][2])); la.setColor(6*i+5,color); } Shape3D s=new Shape3D(); s.addGeometry(la); branchGroup=new BranchGroup(); branchGroup.addChild(s); } return branchGroup; } public Vector4d[] getClipBoxPlanes(){ Vector4d[] toReturn=new Vector4d[6]; double[] min=new double[3]; double[] max=new double[3]; getMinMax(min,max,offsetFactor); double[] plane; Vector4d plane4d; //xmin plane plane=new double[]{-1,0,0,min[0]}; plane4d=new Vector4d(plane); toReturn[0]=plane4d; //xmax plane plane=new double[]{-1,0,0,max[0]}; plane4d=new Vector4d(plane); plane4d.scale(-1); toReturn[1]=plane4d; //ymin plane plane=new double[]{0,-1,0,min[1]}; plane4d=new Vector4d(plane); toReturn[2]=plane4d; //ymax plane plane=new double[]{0,-1,0,max[1]}; plane4d=new Vector4d(plane); plane4d.scale(-1); toReturn[3]=plane4d; //zmin plane plane=new double[]{0,0,-1,min[2]}; plane4d=new Vector4d(plane); toReturn[4]=plane4d; //zmax plane plane=new double[]{0,0,-1,max[2]}; plane4d=new Vector4d(plane); plane4d.scale(-1); toReturn[5]=plane4d; return toReturn; } }