mark(face); Node na = face.nodeA(); Node nb = face.nodeB(); Node nc = face.nodeC(); Face fa = face.faceA();
Node nb = nodeB(); Node nc = nodeC(); if (node1==na) {
nabors.add(face); Node na = face.nodeA(); Node nb = face.nodeB(); Node nc = face.nodeC(); Face fa = face.faceA();
mark(face); Node na = face.nodeA(); Node nb = face.nodeB(); Node nc = face.nodeC(); Face fa = face.faceA();
private static Node otherNode(Face face, Node na, Node nb) { Node fa = face.nodeA(); Node fb = face.nodeB(); Node fc = face.nodeC(); if (na==fa) {
private void init(Face face) { trace("init: face="+face); trace(" meshFace A="+face._meshFace.nodeA()); trace(" meshFace B="+face._meshFace.nodeB()); trace(" meshFace C="+face._meshFace.nodeC()); face._faceA = null; face._faceB = null; face._faceC = null; Node nodeA = face.nodeA(); Node nodeB = face.nodeB(); Node nodeC = face.nodeC(); nodeA.setFace(face); nodeB.setFace(face); nodeC.setFace(face); Edge edgeCB = makeEdge(nodeC,nodeB,face); Edge edgeBA = makeEdge(nodeB,nodeA,face); Edge edgeAC = makeEdge(nodeA,nodeC,face); nodeA.setEdgeBefore(edgeBA); nodeB.setEdgeBefore(edgeCB); nodeC.setEdgeBefore(edgeAC); nodeA.setEdgeAfter(edgeAC); nodeB.setEdgeAfter(edgeBA); nodeC.setEdgeAfter(edgeCB); addEdge(edgeCB); addEdge(edgeBA); addEdge(edgeAC); addFace(face); }
/** * Returns the node referenced by this face that is nearest to * the point with specified coordinates. * @param x the x coordinate. * @param y the y coordinate. * @param z the z coordinate. * @return the node nearest to the point (x,y,z). */ public final Node nodeNearest(float x, float y, float z) { Node na = nodeA(); Node nb = nodeB(); Node nc = nodeC(); double da = distanceSquared(na,x,y,z); double db = distanceSquared(nb,x,y,z); double dc = distanceSquared(nc,x,y,z); double dmin = da; Node nmin = na; if (db<dmin) { dmin = db; nmin = nb; } if (dc<dmin) { dmin = dc; nmin = nc; } return nmin; }
private static void accNormalVector(Face face, float[] v) { Node na = face.nodeA(); Node nb = face.nodeB(); Node nc = face.nodeC(); float xa = na.x(); float ya = na.y(); float za = na.z(); float xb = nb.x(); float yb = nb.y(); float zb = nb.z(); float xc = nc.x(); float yc = nc.y(); float zc = nc.z(); float x0 = xc-xa; float y0 = yc-ya; float z0 = zc-za; float x1 = xa-xb; float y1 = ya-yb; float z1 = za-zb; v[0] += y0*z1-y1*z0; v[1] += x1*z0-x0*z1; v[2] += x0*y1-x1*y0; } }
/** * Computes the circumcenter of this face. * @param cc array of circumcenter coordinates {xc,yc,zc}. * @return radius-squared of circumcircle. */ public double centerCircle(double[] cc) { Node na = nodeA(); Node nb = nodeB(); Node nc = nodeC(); double xa = na.x(); double ya = na.y(); double za = na.z(); double xb = nb.x(); double yb = nb.y(); double zb = nb.z(); double xc = nc.x(); double yc = nc.y(); double zc = nc.z(); Geometry.centerCircle3D(xa,ya,za,xb,yb,zb,xc,yc,zc,cc); double xcc = cc[0]; double ycc = cc[1]; double zcc = cc[2]; double dx = xcc-xc; double dy = ycc-yc; double dz = zcc-yc; return dx*dx+dy*dy+dz*dz; }
private static void linkFaces( Face face, Node node, Face faceNabor, Node nodeNabor) { if (face!=null) { if (node==face.nodeA()) { face._faceA = faceNabor; } else if (node==face.nodeB()) { face._faceB = faceNabor; } else if (node==face.nodeC()) { face._faceC = faceNabor; } else { assert false:"node referenced by face"; } } if (faceNabor!=null) { if (nodeNabor==faceNabor.nodeA()) { faceNabor._faceA = face; } else if (nodeNabor==faceNabor.nodeB()) { faceNabor._faceB = face; } else if (nodeNabor==faceNabor.nodeC()) { faceNabor._faceC = face; } else { assert false:"nodeNabor referenced by faceNabor"; } } }
/** * Determines whether this face references the specified nodes. * @param node1 a node. * @param node2 a node. * @return true, if this face references the nodes; false, otherwise. */ public boolean references(Node node1, Node node2) { Node na = nodeA(); Node nb = nodeB(); Node nc = nodeC(); if (node1==na) { return node2==nb || node2==nc; } else if (node1==nb) { return node2==na || node2==nc; } else if (node1==nc) { return node2==na || node2==nb; } else { return false; } }
/** * Gets the face nabor opposite the specified node. * @param node a node. * @return the face nabor opposite the node. */ public final Face faceNabor(Node node) { if (node==nodeA()) return _faceA; if (node==nodeB()) return _faceB; if (node==nodeC()) return _faceC; Check.argument(false,"node is referenced by face"); return null; }
private Face faceNext(Face face) { if (this==face.nodeA()) { return face.faceB(); } else if (this==face.nodeB()) { return face.faceC(); } else { return face.faceA(); } } private Face facePrev(Face face) {
/** * Determines whether this face references the specified node. * @param node the node. * @return true, if this face references the node; false, otherwise. */ public boolean references(Node node) { return node==nodeA() || node==nodeB() || node==nodeC(); }
private Face facePrev(Face face) { if (this==face.nodeA()) { return face.faceC(); } else if (this==face.nodeB()) { return face.faceA(); } else { return face.faceB(); } } private static void accNormalVector(Face face, float[] v) {
private static boolean nodesInOrder(Face face, Node na, Node nb, Node nc) { Node fa = face.nodeA(); Node fb = face.nodeB(); Node fc = face.nodeC(); return na==fa && nb==fb && nc==fc || na==fb && nb==fc && nc==fa || na==fc && nb==fa && nc==fb; }
/** * Gets the node in the specified face nabor that is opposite this face. * @param faceNabor a face nabor. * @return the node in the specified face nabor. */ public final Node nodeNabor(Face faceNabor) { if (faceNabor._faceA==this) return faceNabor.nodeA(); if (faceNabor._faceB==this) return faceNabor.nodeB(); if (faceNabor._faceC==this) return faceNabor.nodeC(); Check.argument(false,"faceNabor is a nabor of face"); return null; }