Package org.jmol.shapespecial
Class Polyhedra
java.lang.Object
org.jmol.shape.Shape
org.jmol.shape.AtomShape
org.jmol.shapespecial.Polyhedra
- All Implemented Interfaces:
Comparator<Object[]>
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanprivate javajs.util.BSprivate javajs.util.BSprivate javajs.util.BSprivate javajs.util.P3private javajs.util.BSprivate static final floatprivate static final floatprivate static final floata dot product comparison termprivate floatintstatic final intstatic final intprivate static final intstatic final intprivate int[][]private static final int(package private) floatprivate booleanprivate booleanprivate boolean(package private) boolean(package private) booleanprivate static floatprivate static final intprivate static final intprivate static final intprivate static final intprivate static final intprivate static final intprivate static final intprivate static final intprivate intprivate javajs.util.V3[]private intprivate intprivate javajs.util.P3[]private floatprivate int[][]private floatintprivate floatprivate floatprivate static final javajs.util.P3private Stringprivate booleanprivate final javajs.util.V3private final javajs.util.V3private final javajs.util.V3Fields inherited from class org.jmol.shape.AtomShape
bsSizeDefault, colixes, isActive, isSet, mad, mads, monomerCount, paletteIDsFields inherited from class org.jmol.shape.Shape
bsColixSet, bsSizeSet, isBioShape, ms, myType, RADIUS_MAX, shapeID, translucentAllowed, translucentLevel, vf, vwr -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate ObjectaddEdge(javajs.util.Lst<int[]> faceEdgeList, Map<String, Object> htEdgeMap, Integer normix, int[] p1, int i, javajs.util.P3[] points) Check each edge to see that (a) it has not been used before (b) it does not have vertex points on both sides of it (c) if it runs opposite another edge, then both edge masks are set properlyprivate voidaddFacet(int i, int j, int k, javajs.util.P3 ptRef, javajs.util.P3[] points, javajs.util.V3[] normals, int[][] faces, int planeCount, int nRef, boolean isWindingOK, javajs.util.V3 vTemp) Add one of the three "facets" that compose the planes of a "collapsed" polyhedron.private voidprivate javajs.util.BSandBitSet(javajs.util.BS bs) private voidprivate floatcheckFacet(javajs.util.P3[] points, int nPoints, int[] t, int index, javajs.util.V3 norm, javajs.util.P4 pTemp, javajs.util.V3 vNorm, javajs.util.V3 vAC, Map<Integer, Object[]> htNormMap, Map<String, Object> htEdgeMap, float planarParam, javajs.util.BS bsTemp, Object[] edgeTest) Clean out overlapping triangles based on normals and cross products.private booleanintprivate Polyhedronprivate PolyhedronconstructBondsPolyhedron(Atom atom, int otherAtomCount) private PolyhedronconstructRadiusPolyhedron(Atom atom, AtomIndexIterator iter) private PolyhedronconstructUnitCellPolygon(Atom atom, boolean useBondAlgorithm) private voidprivate Polyhedronprivate javajs.util.BSfindPolyBS(javajs.util.BS bsCenters) private int[]fixExplicitFaceWinding(int[] face, int ipt, javajs.util.P3[] points, javajs.util.V3[] normals) Check to see that the winding of the explicit face is correct.private javajs.util.BSgetAtomsWithin(Polyhedron p, float offset) private int[][]Face: a CCW loop of edges all (within tolerance) in the same plane.private int[][]getFaceTriangles(int n, Map<Integer, Object[]> htNormMap, int triangleCount) intgetProperty(String property, int i) booleangetPropertyData(String property, Object[] data) private booleanprivate booleanisPlanar(javajs.util.P3 pt1, javajs.util.P3 pt2, javajs.util.P3 pt3, javajs.util.P3 ptX) private voidoffsetPolyhedra(javajs.util.P3 value) private voidpointsPolyhedra(javajs.util.BS bs, float pointScale) private voidscalePolyhedra(float scale) private voidsetDefinedFaces(javajs.util.P3[] points, int[][] faces) private intsetGap(javajs.util.P3 atom, int otherAtomCount) voidsetModelVisibilityFlags(javajs.util.BS bsModels) private voidvoidsetProperty(String propertyName, Object value, javajs.util.BS bs) private voidsetVisible(boolean visible) private booleantestDiff(javajs.util.P3 a1, javajs.util.P3 b1, javajs.util.P3 a2, javajs.util.P3 b2) private PolyhedronvalidatePolyhedron(javajs.util.P3 atomOrPt, int vertexCount) Methods inherited from class org.jmol.shape.AtomShape
checkColixLength, getInfoAsString, getSize, initModelSet, initShape, setAtomClickability, setColixAndPalette, setPropAS, setSize, setSize2, setSizeRD, setSizeRD2Methods inherited from class org.jmol.shape.Shape
appendCmd, checkBoundsMinMax, checkObjectClicked, checkObjectDragged, checkObjectHovered, coordinateInRange, encodeColor, findNearestAtomIndex, getColix, getColixA, getColixB, getColixI, getColorCommand, getColorCommandUnk, getFontCommand, getPropShape, getSizeG, getTranslucentLabel, initializeShape, replaceGroup, setModelSet, setPropS, setShapeSizeRD, wasClickedMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface java.util.Comparator
equals, reversed, thenComparing, thenComparing, thenComparing, thenComparingDouble, thenComparingInt, thenComparingLong
-
Field Details
-
DEFAULT_FACECENTEROFFSET
private static final float DEFAULT_FACECENTEROFFSET- See Also:
-
EDGES_NONE
private static final int EDGES_NONE- See Also:
-
EDGES_ALL
public static final int EDGES_ALL- See Also:
-
EDGES_FRONT
public static final int EDGES_FRONT- See Also:
-
EDGES_ONLY
public static final int EDGES_ONLY- See Also:
-
MAX_VERTICES
private static final int MAX_VERTICES- See Also:
-
FACE_COUNT_MAX
private static final int FACE_COUNT_MAX- See Also:
-
MAX_OTHER
private static final int MAX_OTHER- See Also:
-
otherAtoms
private javajs.util.P3[] otherAtoms -
normalsT
private javajs.util.V3[] normalsT -
planesT
private int[][] planesT -
randomPoint
private static final javajs.util.P3 randomPoint -
MODE_BONDING
private static final int MODE_BONDING- See Also:
-
MODE_POINTS
private static final int MODE_POINTS- See Also:
-
MODE_RADIUS
private static final int MODE_RADIUS- See Also:
-
MODE_BITSET
private static final int MODE_BITSET- See Also:
-
MODE_UNITCELL
private static final int MODE_UNITCELL- See Also:
-
MODE_INFO
private static final int MODE_INFO- See Also:
-
DEFAULT_PLANAR_PARAM
private static final float DEFAULT_PLANAR_PARAMa dot product comparison term- See Also:
-
CONVEX_HULL_MAX
private static final float CONVEX_HULL_MAX- See Also:
-
polyhedronCount
public int polyhedronCount -
polyhedrons
-
drawEdges
public int drawEdges -
radius
private float radius -
radiusMin
private float radiusMin -
pointScale
private float pointScale -
nVertices
private int nVertices -
faceCenterOffset
float faceCenterOffset -
isCollapsed
boolean isCollapsed -
isFull
boolean isFull -
iHaveCenterBitSet
private boolean iHaveCenterBitSet -
bondedOnly
private boolean bondedOnly -
haveBitSetVertices
private boolean haveBitSetVertices -
centers
private javajs.util.BS centers -
thisID
-
center
private javajs.util.P3 center -
bsVertices
private javajs.util.BS bsVertices -
bsVertexCount
private javajs.util.BS bsVertexCount -
useUnitCell
private boolean useUnitCell -
nPoints
private int nPoints -
planarParam
private float planarParam -
info
-
distanceRef
private float distanceRef -
modelIndex
private int modelIndex -
isAuto
private boolean isAuto -
explicitFaces
private int[][] explicitFaces -
bsPolys
private javajs.util.BS bsPolys -
vAB
private final javajs.util.V3 vAB -
vAC
private final javajs.util.V3 vAC -
vBC
private final javajs.util.V3 vBC -
MAX_DISTANCE_TO_PLANE
private static float MAX_DISTANCE_TO_PLANE
-
-
Constructor Details
-
Polyhedra
public Polyhedra()
-
-
Method Details
-
compare
- Specified by:
comparein interfaceComparator<Object[]>
-
setProperty
- Specified by:
setPropertyin classShape
-
setDefinedFaces
private void setDefinedFaces(javajs.util.P3[] points, int[][] faces) -
pointsPolyhedra
private void pointsPolyhedra(javajs.util.BS bs, float pointScale) -
scalePolyhedra
private void scalePolyhedra(float scale) -
offsetPolyhedra
private void offsetPolyhedra(javajs.util.P3 value) -
getIndexFromName
- Overrides:
getIndexFromNamein classShape- Returns:
- index
-
getProperty
- Overrides:
getPropertyin classShape- Returns:
- true if serviced
-
getPropertyData
- Overrides:
getPropertyDatain classShape- Returns:
- true if serviced
-
getAtomsWithin
-
checkID
-
findPoly
- Parameters:
id- may be nulliatom- may be < 0 to (along with id==null) to get matching polyhedronallowCollapsed-- Returns:
- Polyhedron or null
-
findPolyBS
private javajs.util.BS findPolyBS(javajs.util.BS bsCenters) -
isMatch
-
getShapeDetail
- Overrides:
getShapeDetailin classShape
-
andBitSet
private javajs.util.BS andBitSet(javajs.util.BS bs) -
deletePolyhedra
private void deletePolyhedra() -
setVisible
private void setVisible(boolean visible) -
buildPolyhedra
private void buildPolyhedra() -
setPointsFromBitset
private void setPointsFromBitset() -
addPolyhedron
-
constructBondsPolyhedron
-
constructUnitCellPolygon
-
constructBitSetPolyhedron
-
constructRadiusPolyhedron
-
setGap
private int setGap(javajs.util.P3 atom, int otherAtomCount) -
validatePolyhedron
-
fixExplicitFaceWinding
private int[] fixExplicitFaceWinding(int[] face, int ipt, javajs.util.P3[] points, javajs.util.V3[] normals) Check to see that the winding of the explicit face is correct. If not, correct it. Also set the normals.- Parameters:
face-ipt-points-normals-- Returns:
- correctly wound face
-
getFaceTriangles
-
addFacet
private void addFacet(int i, int j, int k, javajs.util.P3 ptRef, javajs.util.P3[] points, javajs.util.V3[] normals, int[][] faces, int planeCount, int nRef, boolean isWindingOK, javajs.util.V3 vTemp) Add one of the three "facets" that compose the planes of a "collapsed" polyhedron. A mask of -2 ensures that only the [1-2] edge is marked as an outer edge.- Parameters:
i-j-k-ptRef- slightly out from the center; based on centerOffset parameterpoints-normals-faces-planeCount-nRef-isWindingOK-vTemp-
-
checkFacet
private float checkFacet(javajs.util.P3[] points, int nPoints, int[] t, int index, javajs.util.V3 norm, javajs.util.P4 pTemp, javajs.util.V3 vNorm, javajs.util.V3 vAC, Map<Integer, Object[]> htNormMap, Map<String, Object> htEdgeMap, float planarParam, javajs.util.BS bsTemp, Object[] edgeTest) Clean out overlapping triangles based on normals and cross products. For now, we use normixes, which are approximations of normals. It is not 100% guaranteed that this will work.- Parameters:
points-nPoints-t-index-norm-pTemp-vNorm-vAC-htNormMap-htEdgeMap-planarParam-bsTemp-edgeTest-- Returns:
- 0 if no error or value indicating the error
-
addEdge
private Object addEdge(javajs.util.Lst<int[]> faceEdgeList, Map<String, Object> htEdgeMap, Integer normix, int[] p1, int i, javajs.util.P3[] points) Check each edge to see that (a) it has not been used before (b) it does not have vertex points on both sides of it (c) if it runs opposite another edge, then both edge masks are set properly- Parameters:
faceEdgeList-htEdgeMap-normix-p1-i-points-- Returns:
- true if this triangle is OK
-
testDiff
private boolean testDiff(javajs.util.P3 a1, javajs.util.P3 b1, javajs.util.P3 a2, javajs.util.P3 b2) -
isPlanar
private boolean isPlanar(javajs.util.P3 pt1, javajs.util.P3 pt2, javajs.util.P3 pt3, javajs.util.P3 ptX) -
getFaces
Face: a CCW loop of edges all (within tolerance) in the same plane. Objective is to find all triangles with *essentially* the same normal and to then group them into a face. But we have to be careful here; not everything is perfect. We can have be so slightly off in a 4- or 6-face, and we still want it to be called a face. We allow a normal dot product (i.e. cos(theta)) to be < 0.05. This empirically seems to work.- Parameters:
triangles-triangleCount-htNormMap-- Returns:
- array of CCW connecting edges
-
setModelVisibilityFlags
public void setModelVisibilityFlags(javajs.util.BS bsModels) - Overrides:
setModelVisibilityFlagsin classShape
-
getShapeState
- Overrides:
getShapeStatein classAtomShape
-