[Bprocessor-commit] model/src/net/sourceforge/bprocessor/model Edge.java,1.16,1.17 Vertex.java,1.14,
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2005-11-15 18:58:38
|
Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4391/src/net/sourceforge/bprocessor/model Modified Files: Edge.java Vertex.java Surface.java Geometry.java MemoryFacade.java SQLFacade.java Project.java DatabaseFacade.java Log Message: - Improved calculation of surface-normals - Splitting edges and surfaces - Improved finding of new surfaces Index: Surface.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Surface.java,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** Surface.java 13 Nov 2005 11:43:07 -0000 1.44 --- Surface.java 15 Nov 2005 18:58:30 -0000 1.45 *************** *** 268,271 **** --- 268,316 ---- } + /** + * Replace the edge with the edges + * @param edge The original edge + * @param e1 The first new edge to insert + * @param e2 The second new edge to insert + */ + public void replace(Edge edge, Edge e1, Edge e2) { + List lst = new ArrayList(); + Edge[] edges = new Edge[getEdges().size()]; + getEdges().toArray(edges); + + for (int i = 0; i < edges.length; i++) { + Edge current = edges[i]; + if (current == edge) { + if (i == 0) { + if (edges.length == 1) { + lst.add(e1); + lst.add(e2); + } else { + Edge next = edges[i + 1]; + if (next.contains(current.getFrom())) { + lst.add(e2); + lst.add(e1); + } else { + lst.add(e1); + lst.add(e2); + } + } + } else { + Edge previous = edges[i - 1]; + if (previous.contains(current.getTo())) { + lst.add(e2); + lst.add(e1); + } else { + lst.add(e1); + lst.add(e2); + } + } + } else { + lst.add(current); + } + } + setEdges(lst); + } + /** * Calculate the turn direction of the vertices of this *************** *** 292,317 **** */ public double angle(CoordinateSystem coordinateSystem) { ! List vertexlist = getVertices(); ! ! vertexlist = coordinateSystem.translate(vertexlist); ! ! vertexlist.remove(vertexlist.size() - 1); ! Vertex first = (Vertex) vertexlist.get(0); ! Vertex last = (Vertex) vertexlist.get(vertexlist.size() - 1); ! vertexlist.add(first); ! vertexlist.add(0, last); ! Vertex[] vertices = new Vertex[vertexlist.size()]; ! vertexlist.toArray(vertices); ! ! double tetra = 0.0; ! for (int i = 1; i <= (vertices.length - 2); i++) { ! double dxi = vertices[i + 1].getX() - vertices[i].getX(); ! double dxi1 = vertices[i].getX() - vertices[i - 1].getX(); ! double dyi = vertices[i + 1].getY() - vertices[i].getY(); ! double dyi1 = vertices[i].getY() - vertices[i - 1].getY(); ! double tetrai = Math.atan2((dxi * dyi1 - dxi1 * dyi), (dxi * dxi1 + dyi * dyi1)); ! tetra += tetrai; ! } ! return tetra; } --- 337,343 ---- */ public double angle(CoordinateSystem coordinateSystem) { ! List vertices = getVertices(); ! vertices = coordinateSystem.translate(vertices); ! return Geometry.angle(vertices); } *************** *** 663,667 **** * @return A vector normal for this surface, null if the surface consists of only one edge */ ! public Vertex normal() { if (edges.size() > 1) { Edge e1 = (Edge)edges.get(0); --- 689,693 ---- * @return A vector normal for this surface, null if the surface consists of only one edge */ ! public Vertex normal1() { if (edges.size() > 1) { Edge e1 = (Edge)edges.get(0); *************** *** 688,691 **** --- 714,726 ---- return null; } + + /** + * Returns the outward pointing normal to this Surface + * @return A vector normal for this surface, null if the surface consists of only one edge + */ + + public Vertex normal() { + return Geometry.normal(getVertices()); + } /** Index: Edge.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Edge.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** Edge.java 21 Oct 2005 11:56:27 -0000 1.16 --- Edge.java 15 Nov 2005 18:58:30 -0000 1.17 *************** *** 11,15 **** import org.apache.log4j.Logger; - import java.util.HashSet; import java.util.Iterator; --- 11,14 ---- *************** *** 284,287 **** --- 283,302 ---- * TODO to split this edge by the vertex */ + + Vertex from = getFrom(); + Vertex to = getTo(); + Edge e1 = new Edge("", from, vertex); + Project.getInstance().intern(e1); + Edge e2 = new Edge("", vertex, to); + Project.getInstance().intern(e2); + + + Set surfaces = getSurfaces(); + Iterator iter = surfaces.iterator(); + while (iter.hasNext()) { + Surface current = (Surface) iter.next(); + current.replace(this, e1, e2); + } + Project.getInstance().remove(this); } Index: MemoryFacade.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/MemoryFacade.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** MemoryFacade.java 28 Oct 2005 10:42:00 -0000 1.3 --- MemoryFacade.java 15 Nov 2005 18:58:30 -0000 1.4 *************** *** 319,321 **** --- 319,331 ---- return result; } + + /** + * Clear the DataBase + */ + public void clear() { + domains.clear(); + edges.clear(); + surfaces.clear(); + vertices.clear(); + } } Index: Project.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Project.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Project.java 5 Oct 2005 08:05:36 -0000 1.4 --- Project.java 15 Nov 2005 18:58:30 -0000 1.5 *************** *** 40,44 **** return instance; } ! /** * Intern an attribute --- 40,49 ---- return instance; } ! /** ! * Clear all objects ! */ ! public void clear() { ! DatabaseFacade.getInstance().clear(); ! } /** * Intern an attribute Index: Geometry.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Geometry.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Geometry.java 24 Oct 2005 10:25:47 -0000 1.3 --- Geometry.java 15 Nov 2005 18:58:30 -0000 1.4 *************** *** 22,25 **** --- 22,121 ---- /** + * Calculate the normal that points outwards + * @param vertices The vertices describing a planar polygon + * @return The outwards pointing normal + */ + public static Vertex normal(List vertices) { + Vertex normal = normal0(vertices); + Vertex origin = (Vertex) vertices.get(0); + Vertex a = (Vertex) vertices.get(1); + Vertex i = a.minus(origin); + Vertex j = normal.cross(i); + CoordinateSystem system = new CoordinateSystem(i, j, normal, origin); + List projection = system.translate(vertices); + double tetra = angle(projection); + if (tetra > 0) { + normal.scale(-1); + } + return normal; + } + + /** + * Calculate some normal vector + * @param vertices The vertices describing a planar polygon + * @return A normal vector + */ + public static Vertex normal0(List vertices) { + if (vertices.size() < 2) { + return null; + } else { + Vertex a = (Vertex) vertices.get(0); + Vertex b = (Vertex) vertices.get(1); + Vertex v1 = b.minus(a); + for (int i = 2; i < vertices.size(); i++) { + Vertex c = (Vertex) vertices.get(i); + Vertex v2 = c.minus(b); + Vertex normal = v1.cross(v2); + if (!normal.isZero()) { + return normal; + } + } + } + return null; + } + + /** + * Calculate the projection of the vertices into the + * specified plane. + * @param vertices The vertices to project + * @param origin The origin of the plane + * @param normal The normal to the plane + * @return The projection + */ + public static List projection(List vertices, Vertex origin, Vertex normal) { + List projection = new ArrayList(); + + // TODO The following projection calculation should + // be done using a plane. + + for (int i = 0; i < vertices.size(); i++) { + Vertex current = (Vertex) vertices.get(i); + Vertex v = current.minus(origin); + double t = v.dot(normal); + Vertex up = normal.copy(); + up.scale(t); + projection.add(v.minus(up)); + } + return projection; + } + + /** + * Calculate the turn angle of the vertices, which + * are assumed to be 2d (z is ignored). + * @param vertices The vertices to calculate the turn angle for + * @return The turn angle + */ + public static double angle(List vertices) { + vertices.remove(vertices.size() - 1); + Vertex first = (Vertex) vertices.get(0); + Vertex last = (Vertex) vertices.get(vertices.size() - 1); + vertices.add(first); + vertices.add(0, last); + Vertex[] vertexarray = new Vertex[vertices.size()]; + vertices.toArray(vertexarray); + + double tetra = 0.0; + for (int i = 1; i <= (vertexarray.length - 2); i++) { + double dxi = vertexarray[i + 1].getX() - vertexarray[i].getX(); + double dxi1 = vertexarray[i].getX() - vertexarray[i - 1].getX(); + double dyi = vertexarray[i + 1].getY() - vertexarray[i].getY(); + double dyi1 = vertexarray[i].getY() - vertexarray[i - 1].getY(); + double tetrai = Math.atan2((dxi * dyi1 - dxi1 * dyi), (dxi * dxi1 + dyi * dyi1)); + tetra += tetrai; + } + return tetra; + } + + /** * Insert the list of edges in the model by splitting * surfaces etc. *************** *** 29,34 **** --- 125,145 ---- Edge first = (Edge) edges.get(0); + Vertex from = first.getFrom(); Edge last = (Edge) edges.get(edges.size() - 1); Vertex to = last.getTo(); + Surface exterior = null; + { + Set fromSurfaces = from.getSurfaces(); + Set toSurfaces = to.getSurfaces(); + Iterator it = fromSurfaces.iterator(); + while (it.hasNext()) { + Surface current = (Surface) it.next(); + if (toSurfaces.contains(current)) { + exterior = current; + } + } + } + + System.out.println("exterior = " + exterior); Set siblings = to.getEdges(); *************** *** 39,52 **** Edge current = (Edge) siblings.iterator().next(); CoordinateSystem system = CoordinateSystem.create(last, current); if (system != null) { VertexNode node = new VertexNode(to, system); EdgeNode lastEdgeNode = node.insert(last); ! siblings = node.insert(siblings); ! node.sort(); ! findSurfaces(node, lastEdgeNode, edges); ! } else { ! siblings.remove(current); } } } --- 150,166 ---- Edge current = (Edge) siblings.iterator().next(); CoordinateSystem system = CoordinateSystem.create(last, current); + siblings.remove(current); if (system != null) { VertexNode node = new VertexNode(to, system); EdgeNode lastEdgeNode = node.insert(last); ! if (lastEdgeNode != null) { ! node.insert(current); ! siblings = node.insert(siblings); ! node.sort(); ! findSurfaces(node, lastEdgeNode, edges, exterior); ! } } } + } *************** *** 57,62 **** * @param last The first EdgeNode * @param edges The edges */ ! private static void findSurfaces(VertexNode vertex, EdgeNode last, List edges) { { Surface clockwise = clockwiseSurface(vertex, last, edges); --- 171,178 ---- * @param last The first EdgeNode * @param edges The edges + * @param exterior The exterior */ ! private static void findSurfaces(VertexNode vertex, EdgeNode last, List edges, Surface exterior) { ! int count = 0; { Surface clockwise = clockwiseSurface(vertex, last, edges); *************** *** 64,67 **** --- 180,184 ---- if (clockwise.angle(vertex.system()) < 0) { Project.getInstance().intern(clockwise); + count++; } } *************** *** 72,78 **** --- 189,201 ---- if (counterclockwise.angle(vertex.system()) > 0) { Project.getInstance().intern(counterclockwise); + count++; } } } + if (exterior != null) { + if (count == 2) { + Project.getInstance().remove(exterior); + } + } } *************** *** 187,191 **** Vertex v = edge.otherVertex(vertex).minus(vertex); double dz = v.dot(system.getN()); ! if (dz == 0.0) { double dx = v.dot(system.getI()); double dy = v.dot(system.getJ()); --- 310,314 ---- Vertex v = edge.otherVertex(vertex).minus(vertex); double dz = v.dot(system.getN()); ! if (Math.abs(dz) < 0.00000001) { double dx = v.dot(system.getI()); double dy = v.dot(system.getJ()); Index: DatabaseFacade.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/DatabaseFacade.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** DatabaseFacade.java 11 Oct 2005 12:04:51 -0000 1.3 --- DatabaseFacade.java 15 Nov 2005 18:58:30 -0000 1.4 *************** *** 160,162 **** --- 160,167 ---- */ public abstract Vertex findVertexById(Long id); + + /** + * Clear the database + */ + public abstract void clear(); } Index: Vertex.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Vertex.java,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** Vertex.java 7 Oct 2005 05:52:48 -0000 1.14 --- Vertex.java 15 Nov 2005 18:58:30 -0000 1.15 *************** *** 201,204 **** --- 201,218 ---- /** + * Return the surfaces connected to this vertex + * @return The connected surfaces + */ + public Set getSurfaces() { + Set result = new HashSet(); + Set edges = getEdges(); + Iterator iter = edges.iterator(); + while (iter.hasNext()) { + Edge current = (Edge) iter.next(); + result.addAll(current.getSurfaces()); + } + return result; + } + /** * Return a copy of this Vertex * @return The copy *************** *** 317,320 **** --- 331,342 ---- /** + * Is this a zero vector? + * @return True if this is a zero vector + */ + public boolean isZero() { + return (length() < 0.0000001); + } + + /** * Moves the Vertex a distance * @param dx The x distance Index: SQLFacade.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/SQLFacade.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SQLFacade.java 6 Oct 2005 08:20:32 -0000 1.1 --- SQLFacade.java 15 Nov 2005 18:58:30 -0000 1.2 *************** *** 234,236 **** --- 234,242 ---- return VertexFacade.getInstance().findById(id); } + + /** + * Clear the DataBase + */ + public void clear() { + } } |