[Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/tool CatmullClark.java,1.1,1.2
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2005-11-30 08:51:58
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19957/src/net/sourceforge/bprocessor/gl/tool Modified Files: CatmullClark.java Log Message: More catmull-clark stuff Index: CatmullClark.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/CatmullClark.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** CatmullClark.java 28 Nov 2005 22:24:51 -0000 1.1 --- CatmullClark.java 30 Nov 2005 08:51:50 -0000 1.2 *************** *** 36,39 **** --- 36,43 ---- private HashMap edgelist; + /** The other edge list */ + + private HashMap el; + /** The face list */ private HashMap facelist; *************** *** 148,151 **** --- 152,187 ---- /** + * Init el + * @param v The vertex + * @return The new el + */ + public List elInit(Vertex v) { + List edges = new LinkedList(); + el.put(v, edges); + return edges; + } + /** + * Get el + * @param v The vertex + * @return The el + */ + public List elGet(Vertex v) { + List edges = (List) el.get(v); + if (edges == null) { + edges = elInit(v); + } + return edges; + } + /** + * Insert edge in el + * @param v The Vertex + * @param e The edge + */ + public void elInsert(Vertex v, Edge e) { + List edges = elGet(v); + edges.add(e); + } + + /** * Init facelist * @param v The Vertex *************** *** 270,273 **** --- 306,322 ---- /** + * Check if this is a crease vertex - this + * is wrong, there should be a tag. Some + * vertices with 2 or 3 edges are not crease. + * @param v The vertex + * @return Crease or not + */ + boolean crease(Vertex v) { + int k = elGet(v).size(); + return (k < 4); + } + + + /** * Run catmullclark subdivsion on faces * @param faces The faces to subdivide *************** *** 277,280 **** --- 326,330 ---- edgelist = new HashMap(); facelist = new HashMap(); + el = new HashMap(); List surfaces = new ArrayList(); HashSet edges = new HashSet(); *************** *** 306,309 **** --- 356,361 ---- edgepoints.add(center); edgemap.put(current, center); + elInsert(current.getFrom(), current); + elInsert(current.getTo(), current); } } *************** *** 341,397 **** Vertex v = (Vertex) iter.next(); List adjacent = edgelistGet(v); ! List pts = new LinkedList(); ! Iterator eit = adjacent.iterator(); ! while (eit.hasNext()) { ! Edge edge = (Edge) eit.next(); ! pts.add(edge.otherVertex(v)); } - double[] values = average(pts); - v.setX(values[0]); - v.setY(values[1]); - v.setZ(values[2]); } } { Iterator iter = vertices.iterator(); while (iter.hasNext()) { Vertex v = (Vertex) iter.next(); ! List es = edgelistGet(v); double n = es.size(); ! List adjacent = facelistGet(v); ! List pts = new LinkedList(); ! Iterator sit = adjacent.iterator(); ! while (sit.hasNext()) { ! pts.add(facemap.get(sit.next())); ! } ! double[] q = average(pts); ! ! double[] r = new double[]{0, 0, 0}; ! Iterator eit = es.iterator(); ! while (eit.hasNext()) { ! Edge edge = (Edge) eit.next(); ! double[] c = edge.center(); ! r[0] += c[0]; ! r[1] += c[1]; ! r[2] += c[2]; ! } ! ! r[0] /= n; ! r[1] /= n; ! r[2] /= n; ! double[] p = new double[3]; ! p[0] = v.getX(); ! p[1] = v.getY(); ! p[2] = v.getZ(); ! double[] values = new double[3]; ! values[0] = q[0] / n + 2 * r[0] / n + (n - 3) * p[0] / n; ! values[1] = q[1] / n + 2 * r[1] / n + (n - 3) * p[1] / n; ! values[2] = q[2] / n + 2 * r[2] / n + (n - 3) * p[2] / n; ! v.setX(values[0]); ! v.setY(values[1]); ! v.setZ(values[2]); } --- 393,476 ---- Vertex v = (Vertex) iter.next(); List adjacent = edgelistGet(v); ! if (adjacent.size() > 3) { ! List pts = new LinkedList(); ! Iterator eit = adjacent.iterator(); ! while (eit.hasNext()) { ! Edge edge = (Edge) eit.next(); ! pts.add(edge.otherVertex(v)); ! } ! double[] values = average(pts); ! v.setX(values[0]); ! v.setY(values[1]); ! v.setZ(values[2]); } } } { Iterator iter = vertices.iterator(); + LinkedList positions = new LinkedList(); + while (iter.hasNext()) { Vertex v = (Vertex) iter.next(); ! List es = elGet(v); double n = es.size(); ! double[] values = new double[3]; ! if (n > 3) { ! List adjacent = facelistGet(v); ! List pts = new LinkedList(); ! Iterator sit = adjacent.iterator(); ! while (sit.hasNext()) { ! pts.add(facemap.get(sit.next())); ! } ! double[] q = average(pts); ! Iterator eit = es.iterator(); ! pts.clear(); ! while (eit.hasNext()) { ! Edge edge = (Edge) eit.next(); ! pts.add(edge.otherVertex(v)); ! } ! double[] r = average(pts); ! double[] p = new double[3]; ! p[0] = v.getX(); ! p[1] = v.getY(); ! p[2] = v.getZ(); ! ! values[0] = q[0] / n + r[0] / n + (n - 2) * p[0] / n; ! values[1] = q[1] / n + r[1] / n + (n - 2) * p[1] / n; ! values[2] = q[2] / n + r[2] / n + (n - 2) * p[2] / n; ! } else { ! ! ! values[0] = v.getX() * 6; ! values[1] = v.getY() * 6; ! values[2] = v.getZ() * 6; ! Iterator esit = es.iterator(); ! while (esit.hasNext()) { ! Edge e = (Edge) esit.next(); ! Vertex to = e.otherVertex(v); ! if (crease(to)) { ! values[0] += to.getX(); ! values[1] += to.getY(); ! values[2] += to.getZ(); ! } ! } ! ! values[0] /= 8.0; ! values[1] /= 8.0; ! values[2] /= 8.0; ! } ! positions.add(values); ! } ! Iterator vit = vertices.iterator(); ! Iterator pit = positions.iterator(); ! while (vit.hasNext()) { ! Vertex v = (Vertex) vit.next(); ! double[] p = (double[]) pit.next(); ! v.setX(p[0]); ! v.setY(p[1]); ! v.setZ(p[2]); } |