Revision: 5251
Author:   hansonr
Date:     2006-06-28 16:30:26 -0700 (Wed, 28 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/jmol/?rev=5251&view=rev

Log Message:
-----------
bob200603 10.x.16a feature modification for polyhedra definition

Modified Paths:
--------------
    branches/bob200603/Jmol/src/org/jmol/viewer/Polyhedra.java
Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Polyhedra.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Polyhedra.java  2006-06-28 
22:11:51 UTC (rev 5250)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Polyhedra.java  2006-06-28 
23:30:26 UTC (rev 5251)
@@ -253,7 +253,7 @@
         break;
       otherAtoms[bondCount++] = otherAtom;
     }
-    if (bondCount < 2 || nBonds > 0 && nBonds != bondCount)
+    if (bondCount < 3 || nBonds > 0 && nBonds != bondCount)
       return null;
     return validatePolyhedronNew(atom, bondCount, otherAtoms);
   }
@@ -274,7 +274,7 @@
         break;
       otherAtoms[otherAtomCount++] = other;
     }
-    if (otherAtomCount < 2 || nBonds > 0 && nBonds != otherAtomCount)
+    if (otherAtomCount < 3 || nBonds > 0 && nBonds != otherAtomCount)
       return null;
     return validatePolyhedronNew(atom, otherAtomCount, otherAtoms);
   }
@@ -304,16 +304,49 @@
     int ptCenter = vertexCount;
     int nPoints = ptCenter + 1;
     float distMax = 0;
+    float dAverage = 0;
 
     Point3f[] points = new Point3f[MAX_POINTS];
     points[ptCenter] = centralAtom.point3f;
     otherAtoms[ptCenter] = centralAtom;
     for (int i = 0; i < ptCenter; i++) {
       points[i] = otherAtoms[i].point3f;
-      distMax += points[ptCenter].distance(points[i]);
+      dAverage += points[ptCenter].distance(points[i]);
     }
-    distMax = distMax / ptCenter * maxFactor;
-    
+    dAverage = dAverage / ptCenter;
+    float factor = maxFactor;
+    BitSet bs = new BitSet(ptCenter);
+    boolean isOK = (dAverage == 0);
+    // here we are assuring that at least ONE face is drawn to 
+    // all matching vertices
+
+      while (!isOK) {
+      distMax = dAverage * factor;
+      for (int i = 0; i < ptCenter; i++)
+        bs.set(i);
+      for (int i = 0; i < ptCenter - 2; i++)
+        for (int j = i + 1; j < ptCenter - 1; j++) {
+          if (points[i].distance(points[j]) > distMax)
+            continue;
+          for (int k = j + 1; k < ptCenter; k++) {
+            if (points[i].distance(points[k]) > distMax
+                || points[j].distance(points[k]) > distMax)
+              continue;
+            bs.clear(i);
+            bs.clear(j);
+            bs.clear(k);
+          }
+        }
+      isOK = true;
+      for (int i = 0; i < ptCenter; i++)
+        if (bs.get(i)) {
+          isOK = false;
+          factor *= 1.05f;
+          System.out.println("maxFactor for "+ptCenter+ " atoms increased to " 
+ factor
+              + " in order to include " + otherAtoms[i].getIdentity());
+          break;
+        }
+    }
     // simply define a face to be when all three distances 
     // are < MAX_FACTOR * longest central
     // collapsed trick is that introduce a "simple" atom
@@ -322,8 +355,7 @@
 
     // also needed: consideration for faces involving more than three atoms
 
-    out: 
-    for (int i = 0; i < ptCenter - 2; i++)
+    out: for (int i = 0; i < ptCenter - 2; i++)
       for (int j = i + 1; j < ptCenter - 1; j++) {
         if (points[i].distance(points[j]) > distMax)
           continue;
@@ -331,7 +363,7 @@
           if (points[i].distance(points[k]) > distMax
               || points[j].distance(points[k]) > distMax)
             continue;
-          g3d.getNormalFromCenter(points[ptCenter], points[i], points[j], 
+          g3d.getNormalFromCenter(points[ptCenter], points[i], points[j],
               points[k], true, normal);
           if (isCollapsed) {
             normal.scale(faceCenterOffset);
@@ -341,14 +373,14 @@
             planesT[ipt++] = (byte) nPoints;
             planesT[ipt++] = (byte) j;
             planesT[ipt++] = (byte) k;
-            g3d.getNormalFromCenter(points[i], points[ptCenter],
-                points[j], points[k], false, normal);
+            g3d.getNormalFromCenter(points[i], points[ptCenter], points[j],
+                points[k], false, normal);
             normixesT[planeCount++] = g3d.getNormix(normal);
             planesT[ipt++] = (byte) i;
             planesT[ipt++] = (byte) nPoints;
             planesT[ipt++] = (byte) k;
-            g3d.getNormalFromCenter(points[j], points[i],
-                points[ptCenter], points[k], false, normal);
+            g3d.getNormalFromCenter(points[j], points[i], points[ptCenter],
+                points[k], false, normal);
             normixesT[planeCount++] = g3d.getNormix(normal);
             planesT[ipt++] = (byte) i;
             planesT[ipt++] = (byte) j;


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Jmol-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to