Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv10679/src/net/sourceforge/bprocessor/model
Modified Files:
Command.java
Log Message:
offset command improved
Index: Command.java
===================================================================
RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Command.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -d -r1.29 -r1.30
*** Command.java 16 Nov 2007 13:15:08 -0000 1.29
--- Command.java 16 Nov 2007 14:26:29 -0000 1.30
***************
*** 882,894 ****
}
}
}
return vertices;
}
private List<Edge> offset(List<Edge> edges, double distance) {
List<Edge> contour = new LinkedList();
{
List<Vertex> vertices = vertices(edges);
! Vertex normal = Surface.normalOf(edges);
if (vertices.size() > 2) {
List<Vertex> result = offset(vertices, normal, distance);
--- 882,962 ----
}
}
+ } else {
+ Edge e0 = edges.get(0);
+ vertices.add(e0.from);
+ vertices.add(e0.to);
}
return vertices;
}
+ /**
+ * Order a list of edges
+ * @param edges list of edges
+ * @return orderd list of edges
+ */
+ public static List<Edge> order(List<Edge> edges) {
+ LinkedList<Edge> ordered = new LinkedList();
+ {
+ Set<Edge> mark = new HashSet();
+ Edge first = edges.get(0);
+ ordered.add(first);
+ mark.add(first);
+
+ {
+ Vertex to = first.getTo();
+ boolean working = true;
+ while (working) {
+ search:
+ for (Edge current : edges) {
+ working = false;
+ if (!mark.contains(current)) {
+ if (current.contains(to)) {
+ ordered.addLast(current);
+ mark.add(current);
+ to = current.otherVertex(to);
+ working = true;
+ break search;
+ }
+ }
+ }
+ }
+ }
+ {
+ Vertex from = first.getFrom();
+ boolean working = true;
+ while (working) {
+ search:
+ for (Edge current : edges) {
+ working = false;
+ if (!mark.contains(current)) {
+ if (current.contains(from)) {
+ ordered.addFirst(current);
+ mark.add(current);
+ from = current.otherVertex(from);
+ working = true;
+ break search;
+ }
+ }
+ }
+ }
+ }
+ if (mark.size() < edges.size()) {
+ return null;
+ }
+ }
+ return ordered;
+ }
+
private List<Edge> offset(List<Edge> edges, double distance) {
List<Edge> contour = new LinkedList();
{
List<Vertex> vertices = vertices(edges);
! Vertex normal;
! if (edges.size() > 1) {
! normal = Surface.normalOf(edges);
! } else {
! normal = Project.getInstance().getActiveCoordinateSystem().getN();
! }
!
if (vertices.size() > 2) {
List<Vertex> result = offset(vertices, normal, distance);
***************
*** 913,918 ****
public void evaluate() {
double distance = parameters.getDouble("distance");
! List<Edge> contour = offset(edges, distance);
! Geometry.insertEdges(contour);
}
}
--- 981,989 ----
public void evaluate() {
double distance = parameters.getDouble("distance");
! List<Edge> ordered = order(edges);
! if (ordered != null) {
! List<Edge> contour = offset(ordered, distance);
! Geometry.insertEdges(contour);
! }
}
}
|