]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/shape/ArcCylinder.java
Remove dependencies on log4j
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / shape / ArcCylinder.java
index ab6178440ab04a8772dd25902eb59cdfcc0d0dd9..c48584bb284609b5d4ce0ed78444eb9483e65dcc 100644 (file)
@@ -12,8 +12,12 @@ import javax.vecmath.Vector3d;
 import org.simantics.g3d.math.MathTools;
 
 public class ArcCylinder {
+       
+       public Mesh create(Point3d s, Point3d v, Point3d e, double r, int res) {
+               return create(s, v, e, r, res, 0.15);
+       }
 
-       public Mesh create(Point3d s, Point3d v, Point3d e, double rad, int res) {
+       public Mesh create(Point3d s, Point3d v, Point3d e, double r, int res, double res2) {
                
                Vector3d v1 = new Vector3d(s);
                v1.sub(v);
@@ -49,7 +53,7 @@ public class ArcCylinder {
                        rn.cross(v2, v1);
                        rn.normalize();
                        
-                       steps = (int)(Math.ceil(a/0.1));
+                       steps = (int)(Math.ceil(a/res2));
                        if (steps == 0)
                                steps = 1;
                        sa = a/steps;
@@ -83,7 +87,7 @@ public class ArcCylinder {
                                p.add(c);
                                
                        }
-                       createCircle(vertices, normals, p, t, rn, res, rad);
+                       createCircle(vertices, normals, p, t, rn, res, r);
                }
                int count = steps*res*6;
                for (int i = 0; i < count; i++) {
@@ -93,6 +97,106 @@ public class ArcCylinder {
                return new Mesh(vertices, normals, indices);
        }
        
+       public Mesh create(Point3d c, Vector3d axis, Vector3d an, double R, double r, double a, int res, double res2) {
+               
+       
+               
+               int steps = 0;
+               double sa = 0.0;
+               
+               Vector3d rn = new Vector3d(axis);
+               rn.normalize();
+               Vector3d r1 = new Vector3d(an);
+               r1.normalize();
+               r1.scale(R);
+
+               
+               if ((a +0.0001) > Math.PI) {
+                       steps = 1;
+               } else {
+                       steps = (int)(Math.ceil(a/res2));
+                       if (steps == 0)
+                               steps = 1;
+                       sa = a/steps;
+               }
+
+               List<Tuple3d> vertices = new ArrayList<Tuple3d>(res * (steps+1));
+               List<Tuple3d> normals = new ArrayList<Tuple3d>(res * (steps+1));
+               List<Integer> indices = new ArrayList<Integer>();
+               
+               for (int i = 0; i <= steps; i++) {
+                       Vector3d p;
+                       Vector3d t;
+                       p = new Vector3d();
+                       double ca = sa * i;
+                       Quat4d q = MathTools.getQuat(new AxisAngle4d(rn, ca));
+                       MathTools.rotate(q, r1, p);
+                       t = new Vector3d();
+                       t.cross(rn,p);
+                       t.normalize();
+                       p.add(c);
+                               
+                       
+                       createCircle(vertices, normals, p, t, rn, res, r);
+               }
+               int count = steps*res*6;
+               for (int i = 0; i < count; i++) {
+                       indices.add(-1);
+               }       
+               createIndices(steps, res, indices);
+               return new Mesh(vertices, normals, indices);
+       }
+       
+public Mesh create(Point3d c, Vector3d axis, Vector3d an, double R, double r, double starta, double a, int res, double res2) {
+        
+    
+        
+        int steps = 0;
+        double sa = 0.0;
+        
+        Vector3d rn = new Vector3d(axis);
+        rn.normalize();
+        Vector3d r1 = new Vector3d(an);
+        r1.normalize();
+        r1.scale(R);
+
+        
+        if ((a +0.0001) > Math.PI) {
+            steps = 1;
+        } else {
+            steps = (int)(Math.ceil(a/res2));
+            if (steps == 0)
+                steps = 1;
+            sa = a/steps;
+        }
+
+        List<Tuple3d> vertices = new ArrayList<Tuple3d>(res * (steps+1));
+        List<Tuple3d> normals = new ArrayList<Tuple3d>(res * (steps+1));
+        List<Integer> indices = new ArrayList<Integer>();
+        
+        for (int i = 0; i <= steps; i++) {
+            Vector3d p;
+            Vector3d t;
+            p = new Vector3d();
+            double ca = sa * i + starta;
+            Quat4d q = MathTools.getQuat(new AxisAngle4d(rn, ca));
+            MathTools.rotate(q, r1, p);
+            t = new Vector3d();
+            t.cross(rn,p);
+            t.normalize();
+            p.add(c);
+                
+            
+            createCircle(vertices, normals, p, t, rn, res, r);
+        }
+        int count = steps*res*6;
+        for (int i = 0; i < count; i++) {
+            indices.add(-1);
+        }   
+        createIndices(steps, res, indices);
+        return new Mesh(vertices, normals, indices);
+    }
+       
        private static void createCircle(List<Tuple3d> points, List<Tuple3d> normals, Tuple3d p, Vector3d t, Vector3d n, int res, double radius) {
                n = new Vector3d(n);
                n.scale(radius);
@@ -124,9 +228,9 @@ public class ArcCylinder {
                                int iv = c*resolution + s;
                                
                                /*
-                            iv+1 ---- iv + resolution + 1
-                                     | /|
-                                     |/ |
+                                iv+1 ---- iv + resolution + 1
+                                         | /|
+                                         |/ |
                                   iv ---- iv + resolution 
                                */
                                if (s < resolution - 1) {