From: Egon W. <eg...@us...> - 2003-06-14 19:06:53
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol In directory sc8-pr-cvs1:/tmp/cvs-serv13700/src/org/openscience/jmol Modified Files: Tag: b6 CrystalFile.java CrystalFrame.java Log Message: Backported patch by Fabian to HEAD: 'Fixed problem reading some abinit files' and 'Fixed bug occuring while computing the BoundingBox when the unit frame collapse' Index: CrystalFile.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/CrystalFile.java,v retrieving revision 1.16.2.2 retrieving revision 1.16.2.3 diff -u -r1.16.2.2 -r1.16.2.3 --- CrystalFile.java 15 May 2003 13:25:32 -0000 1.16.2.2 +++ CrystalFile.java 14 Jun 2003 19:06:50 -0000 1.16.2.3 @@ -98,6 +98,49 @@ // atomic position (double[3]) of each atom + //Compute the Unit Cell Box edges + static Vector boxEdgesTemplate = new Vector(24); + static { + boxEdgesTemplate.addElement(new Point3d()); //O + boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //E + + boxEdgesTemplate.addElement(new Point3d()); //O + boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //E + + boxEdgesTemplate.addElement(new Point3d()); //O + boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //E + + + boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //O + boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //E + + boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //O + boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //E + + boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //O + boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //E + + boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //O + boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //E + + boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //O + boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //E + + boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //O + boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //E + + boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //O + boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //E + + boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //O + boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //E + + boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //O + boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //E + } + + + /** * Default constructor:<br> * Create a CrystalFile object using default parameters.<br> @@ -393,48 +436,11 @@ double[][] unitBox = crystalBoxS.getUnitBox(); int mina, minb, minc, maxa, maxb, maxc; Matrix3d op = new Matrix3d(); - Vector boxEdgesTemplate = new Vector(24); Vector boxEdges = new Vector(1); Point3d vec; double[][] rprimd = unitCellBoxS.getRprimd(); - //Compute the Unit Cell Box edges - boxEdgesTemplate.addElement(new Point3d()); //O - boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //E - boxEdgesTemplate.addElement(new Point3d()); //O - boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //E - - boxEdgesTemplate.addElement(new Point3d()); //O - boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //E - - - boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //O - boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //E - - boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //O - boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //E - - boxEdgesTemplate.addElement(new Point3d(0, 1, 0)); //O - boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //E - - boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //O - boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //E - - boxEdgesTemplate.addElement(new Point3d(0, 0, 1)); //O - boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //E - - boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //O - boxEdgesTemplate.addElement(new Point3d(1, 0, 0)); //E - - boxEdgesTemplate.addElement(new Point3d(1, 0, 1)); //O - boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //E - - boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //O - boxEdgesTemplate.addElement(new Point3d(1, 1, 0)); //E - - boxEdgesTemplate.addElement(new Point3d(0, 1, 1)); //O - boxEdgesTemplate.addElement(new Point3d(1, 1, 1)); //E //Operator "op" needed to transform atomic crystal //coordinate (atomCrystCoord) in cartesian atomic @@ -467,9 +473,37 @@ } //end j } //end i - return boxEdges; + return boxEdges; + + } //end generate UnitBoxFrame + + /* + * Return the frame bounds corresponding to a single unit cell. + * This method is used by CrystalFrame.calcBoundingBox() when + * the boxEdges are 0 (no unit cell frame) + */ + static public Vector getSingleBoxEdge(double[][] rprimd) { + Matrix3d op = new Matrix3d(); + //Operator "op" needed to transform atomic crystal + //coordinate (atomCrystCoord) in cartesian atomic + //position (atomPos) + op.transpose(MathUtil.arrayToMatrix3d(rprimd)); + + double[] redEdge = new double[3]; + double[] cartEdge; + Vector boxEdgesDummy = new Vector(1); + for (int l = 0; l < boxEdgesTemplate.size(); l++) { + redEdge[0] = ((Point3d) boxEdgesTemplate.elementAt(l)).x; + redEdge[1] = ((Point3d) boxEdgesTemplate.elementAt(l)).y; + redEdge[2] = ((Point3d) boxEdgesTemplate.elementAt(l)).z; + cartEdge = MathUtil.mulVec(op, redEdge); + boxEdgesDummy.addElement(new Point3d(cartEdge[0], cartEdge[1], + cartEdge[2])); + } //end l; + return boxEdgesDummy; + } Index: CrystalFrame.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/CrystalFrame.java,v retrieving revision 1.11.2.1 retrieving revision 1.11.2.2 diff -u -r1.11.2.1 -r1.11.2.2 --- CrystalFrame.java 15 May 2003 13:25:32 -0000 1.11.2.1 +++ CrystalFrame.java 14 Jun 2003 19:06:51 -0000 1.11.2.2 @@ -66,11 +66,19 @@ } void calcBoundingBox() { + + Vector boxEdges; + if (this.boxEdges.isEmpty()) { + boxEdges = CrystalFile.getSingleBoxEdge(rprimd); + } else { + boxEdges = this.boxEdges; + } + Point3d position = (Point3d) boxEdges.elementAt(0); double minX = position.x, maxX = minX; double minY = position.y, maxY = minY; double minZ = position.z, maxZ = minZ; - + for (int i = 1, size = boxEdges.size(); i < size; ++i) { position = (Point3d) boxEdges.elementAt(i); double x = position.x; @@ -84,12 +92,12 @@ if (z > maxZ) { maxZ = z; } } centerBoundingBox = new Point3d((minX + maxX) / 2, - (minY + maxY) / 2, - (minZ + maxZ) / 2); + (minY + maxY) / 2, + (minZ + maxZ) / 2); cornerBoundingBox = new Point3d(maxX, maxY, maxZ); cornerBoundingBox.sub(centerBoundingBox); } - + // arrowhead size isn't included because it is currently in screen // coordinates .. oh well. public double calcRadius(Point3d center) { |