[Bprocessor-commit] model/src/net/sourceforge/bprocessor/model Edge.java,1.21,1.22 Domain.java,1.11,
Status: Pre-Alpha
Brought to you by:
henryml
|
From: Michael L. <he...@us...> - 2005-12-05 07:53:56
|
Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9883/src/net/sourceforge/bprocessor/model Modified Files: Edge.java Domain.java Surface.java Project.java Plane.java Log Message: Implemented Surface.extrude(length) Index: Surface.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Surface.java,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** Surface.java 28 Nov 2005 22:23:49 -0000 1.50 --- Surface.java 5 Dec 2005 07:53:46 -0000 1.51 *************** *** 11,14 **** --- 11,15 ---- import java.util.HashMap; import java.util.Iterator; + import java.util.LinkedList; import java.util.List; import java.util.Set; *************** *** 183,187 **** vertices.add(e0.getTo()); } else if (edges.size() > 1) { ! Vertex current = getFirtVertex(); if (current != null) { vertices.add(current); --- 184,188 ---- vertices.add(e0.getTo()); } else if (edges.size() > 1) { ! Vertex current = getFirstVertex(); if (current != null) { vertices.add(current); *************** *** 190,193 **** --- 191,197 ---- Edge edge = (Edge) iter.next(); current = edge.otherVertex(current); + if (current == null) { + throw new Error("other vertex null"); + } vertices.add(current); } *************** *** 203,207 **** * @return The first vertex */ ! public Vertex getFirtVertex() { List edges = getEdges(); if (edges.size() == 0) { --- 207,211 ---- * @return The first vertex */ ! public Vertex getFirstVertex() { List edges = getEdges(); if (edges.size() == 0) { *************** *** 401,404 **** --- 405,505 ---- } + /** + * Extrude this surface + * @param delta How much to extrude along the normal + * @return The top in the extruded surface + */ + public Surface extrude(double delta) { + Vertex normal = normal(); + normal.scale(delta / normal.length()); + + List vertices = getVertices(); + Vertex first = (Vertex) vertices.get(0); + Vertex last = (Vertex) vertices.get(vertices.size() - 1); + if (first != last) { + throw new Error("extruding open surface"); + } + + // FIXME getVertices() should not return duplicates + // why is a surface not allways closed? It should be! + + vertices.remove(vertices.size() - 1); + List edges = getEdges(); + + int n = vertices.size(); + + Vertex[] v = new Vertex[n]; + Edge[] e = new Edge[n]; + + + Vertex[] vmap = new Vertex[n]; + Edge[] topmap = new Edge[n]; + Edge[] sidemap = new Edge[n]; + Surface[] facemap = new Surface[n]; + + Surface top = null; + + vertices.toArray(v); + edges.toArray(e); + + for (int i = 0; i < n; i++) { + vmap[i] = v[i].add(normal); + Project.getInstance().intern(vmap[i]); + } + + for (int i = 0; i < n; i++) { + topmap[i] = new Edge("", vmap[i], vmap[(i + 1) % n]); + Project.getInstance().intern(topmap[i]); + } + + for (int i = 0; i < n; i++) { + sidemap[i] = new Edge("", v[i], vmap[i]); + Project.getInstance().intern(sidemap[i]); + } + + for (int i = 0; i < n; i++) { + Edge b = e[i]; + Edge r = sidemap[i]; + Edge l = sidemap[(i + 1) % n]; + Edge t = topmap[i]; + List newEdges = new LinkedList(); + newEdges.add(r); + newEdges.add(t); + newEdges.add(l); + newEdges.add(b); + facemap[i] = new Surface("", newEdges); + Project.getInstance().intern(facemap[i]); + + } + + { + List newEdges = new LinkedList(); + for (int i = 0; i < n; i++) { + newEdges.add(topmap[n - i - 1]); + } + top = new Surface("", newEdges); + Project.getInstance().intern(top); + } + + + // FIXME should return the sides instead of assigning + // spaces here. + + for (int i = 0; i < n; i++) { + if (delta < 0) { + facemap[i].setBackDomain(getBackDomain()); + } else { + facemap[i].setFrontDomain(getFrontDomain()); + } + } + if (delta < 0) { + top.setBackDomain(getBackDomain()); + } else { + top.setFrontDomain(getFrontDomain()); + } + + + return top; + } /** *************** *** 408,418 **** public void addHole(Surface inner) { if (innerSurfaces == null) { ! Set initSet = new HashSet(); ! initSet.add(inner); ! setInnerSurfaces(initSet); ! } else { ! innerSurfaces.add(inner); } inner.setIsInner(true); } --- 509,537 ---- public void addHole(Surface inner) { if (innerSurfaces == null) { ! innerSurfaces = new HashSet(); } + innerSurfaces.add(inner); inner.setIsInner(true); + + Vertex normal = normal(); + Vertex other = inner.normal(); + double dot = normal.dot(other); + Domain front = getFrontDomain(); + Domain back = getBackDomain(); + if (dot > 0) { + if (inner.getFrontDomain() == null) { + inner.setFrontDomain(front); + } + if (inner.getBackDomain() == null) { + inner.setBackDomain(back); + } + } else { + if (inner.getFrontDomain() == null) { + inner.setFrontDomain(back); + } + if (inner.getBackDomain() == null) { + inner.setBackDomain(front); + } + } } *************** *** 515,620 **** } - //private boolean containedCheck(Surface hole, Surface surf) { - /*this is done by aplying the crossing numbers algorithm on every vertex - *of the hole. Using the edges of the hole as rays we cover two vertecies - *at a time. - */ - /* - List holeEdges = hole.getEdges(); - Iterator holeIt = holeEdges.iterator(); - Edge holeEdge = null; - boolean contained = true; - if (holeIt.hasNext()) { - holeEdge = (Edge)holeIt.next(); - contained = crossingNumbers(holeEdge, surf); - } - while (holeIt.hasNext() && contained) { - holeEdge = (Edge)holeIt.next(); - if (holeIt.hasNext()) { - holeEdge = (Edge)holeIt.next(); - if (!crossingNumbers(holeEdge, surf)) { - contained = false; - } - } - } - return contained; - }*/ - - /** ! * The crossing numbers algorithm to check if an edge is contained in an other surface. ! * @param edge the edge. ! * @param surf the surface. ! * @return a boolean werther or not the edge is contained */ ! private boolean crossingNumbers(Edge edge, Surface surf) { ! List surfEdges = surf.getEdges(); ! Iterator surfIt = surfEdges.iterator(); ! Edge holeEdge = edge; ! Vertex holeOr = holeEdge.getTo(); ! Vertex holeDir = holeEdge.getFrom().minus(holeOr); ! holeDir.scale(1 / holeDir.length()); ! boolean contained = true; ! int crossings = 0; ! while (surfIt.hasNext() && contained) { ! Edge surfEdge = (Edge)surfIt.next(); ! //in order to find intersections we get a parametrizied version of the edges ! //the origin point and direction vector for the surface edge ! Vertex surfOr = surfEdge.getTo(); ! Vertex surfDir = surfEdge.getFrom().minus(surfOr); ! surfDir.scale(1 / surfDir.length()); ! //formulars for finding intersections taken from http://www.realtimerendering.com/int/#I304 ! Vertex dirCross = surfDir.cross(holeDir); ! double denominator = dirCross.length() * dirCross.length(); ! if (denominator != 0) { ! Vertex orSubs = holeOr.minus(surfOr); ! double surfDet = orSubs.determinant(holeDir, dirCross); ! double holeDet = orSubs.determinant(surfDir, dirCross); ! double tSurf = surfDet / denominator; ! double tHole = holeDet / denominator; ! double epsilon = 0.00001; ! if ((tSurf > 0) && (tHole > 0) && ! (Math.abs((surfOr.getX() + surfDir.getX() * tSurf) - ! (holeOr.getX() + holeDir.getX() * tHole)) ! < epsilon) && ! (Math.abs((surfOr.getY() + surfDir.getY() * tSurf) - ! (holeOr.getY() + holeDir.getY() * tHole)) ! < epsilon) && ! (Math.abs((surfOr.getZ() + surfDir.getZ() * tSurf) - ! (holeOr.getZ() + holeDir.getZ() * tHole)) ! < epsilon)) { ! //the parameters for the "from" point on the edges ! double tSurfFrom = 0; ! double tHoleFrom = 0; ! if (surfDir.getX() != 0) { ! tSurfFrom = ((surfEdge.getFrom().getX() - surfOr.getX()) / surfDir.getX()); ! } else if (surfDir.getY() != 0) { ! tSurfFrom = ((surfEdge.getFrom().getY() - surfOr.getY()) / surfDir.getY()); ! } else if (surfDir.getZ() != 0 && holeDir.getZ() != 0) { ! tSurfFrom = ((surfEdge.getFrom().getZ() - surfOr.getZ()) / surfDir.getZ()); ! } else { ! log.warn("outer surface edge has a zero vector direction vector"); ! } ! if (holeDir.getX() != 0) { ! tHoleFrom = ((holeEdge.getFrom().getX() - holeOr.getX()) / holeDir.getX()); ! } else if (holeDir.getY() != 0) { ! tHoleFrom = ((holeEdge.getFrom().getY() - holeOr.getY()) / holeDir.getY()); ! } else if (holeDir.getZ() != 0) { ! tHoleFrom = ((holeEdge.getFrom().getZ() - holeOr.getZ()) / holeDir.getZ()); ! } else { ! log.warn("inner surface edge has a zero vector direction vector"); ! } ! if (tHoleFrom > tHole && tSurfFrom >= tSurf) { ! contained = false; ! } else if (tSurfFrom >= tSurf) { ! crossings++; ! } ! } } } ! if (crossings % 2 == 0) { ! contained = false; ! } ! return contained; } --- 634,651 ---- } /** ! * Tests if a surface is a hole in this surface ! * @param hole The surface to test ! * @return True if hole */ ! public boolean surrounds(Surface hole) { ! Iterator iter = hole.getVertices().iterator(); ! while (iter.hasNext()) { ! Vertex current = (Vertex) iter.next(); ! if (!surrounds(current)) { ! return false; } } ! return true; } *************** *** 655,660 **** backDomain.removeSurface(this); } - backDomain = back; } --- 686,694 ---- backDomain.removeSurface(this); } backDomain = back; + if (backDomain != null) { + backDomain.addSurface(this); + } + Project.getInstance().update(this); } *************** *** 678,681 **** --- 712,719 ---- } frontDomain = front; + if (frontDomain != null) { + frontDomain.addSurface(this); + } + Project.getInstance().update(this); } *************** *** 762,766 **** n = normal(); Edge e0 = (Edge) edges.get(0); ! origin = getFirtVertex(); i = e0.otherVertex(origin).minus(origin); i.scale(1 / i.length()); --- 800,804 ---- n = normal(); Edge e0 = (Edge) edges.get(0); ! origin = getFirstVertex(); i = e0.otherVertex(origin).minus(origin); i.scale(1 / i.length()); *************** *** 869,873 **** */ public boolean surrounds(Vertex v) { ! return surrounds(v, 0.00001); } /** --- 907,911 ---- */ public boolean surrounds(Vertex v) { ! return surrounds(v, 0.0000001); } /** Index: Edge.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Edge.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** Edge.java 29 Nov 2005 19:06:51 -0000 1.21 --- Edge.java 5 Dec 2005 07:53:46 -0000 1.22 *************** *** 335,339 **** */ public String toString() { ! return "Edge[id=" + id + ",name=" + name + ",from=" + from + ",to=" + to + "]"; } --- 335,339 ---- */ public String toString() { ! return "Edge[E" + id + " {V" + from.getId() + " -> V" + to.getId() + "}]"; } *************** *** 388,394 **** */ public double[] center() { ! double x = (to.getX() - from.getX()) / 2; ! double y = (to.getY() - from.getY()) / 2; ! double z = (to.getZ() - from.getZ()) / 2; return new double[]{from.getX() + x, from.getY() + y, from.getZ() + z}; } --- 388,394 ---- */ public double[] center() { ! double x = (to.getX() - from.getX()) / 2.0; ! double y = (to.getY() - from.getY()) / 2.0; ! double z = (to.getZ() - from.getZ()) / 2.0; return new double[]{from.getX() + x, from.getY() + y, from.getZ() + z}; } Index: Domain.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Domain.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** Domain.java 6 Oct 2005 11:11:07 -0000 1.11 --- Domain.java 5 Dec 2005 07:53:46 -0000 1.12 *************** *** 137,140 **** --- 137,141 ---- s.add(surface); } + Project.getInstance().update(this); } Index: Plane.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Plane.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Plane.java 6 Nov 2005 16:25:34 -0000 1.9 --- Plane.java 5 Dec 2005 07:53:46 -0000 1.10 *************** *** 123,126 **** --- 123,127 ---- } Vertex i = new Vertex("intersection"); + // TODO Round off the point to be in the plane i.setX(x0 + t * xd); i.setY(y0 + t * yd); Index: Project.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Project.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Project.java 21 Nov 2005 09:53:41 -0000 1.7 --- Project.java 5 Dec 2005 07:53:46 -0000 1.8 *************** *** 154,157 **** --- 154,158 ---- Notification n = new Notification(Notification.CONSTRUCTION_SPACE_MODIFIED, domain.getId()); Notifier.getInstance().sendNotification(n); + System.out.println("send notification"); } else if (domain instanceof FunctionalSpace) { DatabaseFacade.getInstance().update((FunctionalSpace)domain); |