Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv12633/src/net/sourceforge/bprocessor/model
Modified Files:
SpaceAnalysis.java
Log Message:
Improved space propagation
Index: SpaceAnalysis.java
===================================================================
RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/SpaceAnalysis.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** SpaceAnalysis.java 27 Sep 2007 08:33:13 -0000 1.4
--- SpaceAnalysis.java 27 Sep 2007 10:44:14 -0000 1.5
***************
*** 9,15 ****
--- 9,18 ----
import java.util.HashMap;
+ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+ import java.util.Queue;
+ import java.util.Set;
/**
***************
*** 22,25 ****
--- 25,32 ----
private static final int BACKWARD = -1;
+ private Map<Edge, List<Surface>> edgemap;
+ private Queue<Element> queue;
+ private Set<Surface> mark;
+
private static int travel(Surface surface, Edge edge) {
Vertex vertex = surface.getFirstVertex();
***************
*** 37,40 ****
--- 44,66 ----
}
+
+ private class Element {
+ private Surface surface;
+ private int side;
+
+ public Element(Surface surface, int side) {
+ this.surface = surface;
+ this.side = side;
+ }
+
+ public Surface surface() {
+ return surface;
+ }
+
+ public int side() {
+ return side;
+ }
+ }
+
/**
* Progates space assignment in specified direction
***************
*** 45,49 ****
public void propagate(Surface surface, int side) {
Space space = surface.getOwner();
! Map<Edge, List<Surface>> edgemap = new HashMap();
for (Edge current : space.getEdges()) {
edgemap.put(current, new LinkedList());
--- 71,75 ----
public void propagate(Surface surface, int side) {
Space space = surface.getOwner();
! edgemap = new HashMap();
for (Edge current : space.getEdges()) {
edgemap.put(current, new LinkedList());
***************
*** 55,73 ****
}
for (Edge current : surface.getEdges()) {
List<Surface> surfaces = edgemap.get(current);
if (surfaces.size() > 1) {
Surface selected = select(current, surfaces, surface, side);
! if (travel(surface, current) == travel(selected, current)) {
! if (side == 1) {
! selected.setBackDomain(surface.getFrontDomain());
! } else {
! selected.setFrontDomain(surface.getBackDomain());
! }
! } else {
! if (side == 1) {
! selected.setFrontDomain(surface.getFrontDomain());
} else {
! selected.setBackDomain(surface.getBackDomain());
}
}
--- 81,116 ----
}
+ mark = new HashSet();
+ queue = new LinkedList();
+ queue.offer(new Element(surface, side));
+ while (!queue.isEmpty()) {
+ Element element = queue.remove();
+ process(element);
+ }
+ }
+
+ private void process(Element element) {
+ Surface surface = element.surface();
+ int side = element.side;
+ mark.add(surface);
for (Edge current : surface.getEdges()) {
List<Surface> surfaces = edgemap.get(current);
if (surfaces.size() > 1) {
Surface selected = select(current, surfaces, surface, side);
! if (!mark.contains(selected)) {
! if (travel(surface, current) == travel(selected, current)) {
! if (side == 1) {
! selected.setBackDomain(surface.getFrontDomain());
! } else {
! selected.setFrontDomain(surface.getBackDomain());
! }
! queue.offer(new Element(selected, -side));
} else {
! if (side == 1) {
! selected.setFrontDomain(surface.getFrontDomain());
! } else {
! selected.setBackDomain(surface.getBackDomain());
! }
! queue.offer(new Element(selected, side));
}
}
|