]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
ArcCylinder with custom start angle 89/3389/1
authorMarko Luukkainen <marko.luukkainen@semantum.fi>
Tue, 22 Oct 2019 11:16:41 +0000 (14:16 +0300)
committerMarko Luukkainen <marko.luukkainen@semantum.fi>
Tue, 22 Oct 2019 11:16:41 +0000 (14:16 +0300)
gitlab #10

Change-Id: Ica933203d05073499f1ab46c3f4a92041b1106d6

org.simantics.g3d/src/org/simantics/g3d/shape/ArcCylinder.java
org.simantics.g3d/src/org/simantics/g3d/shape/Tube.java

index 6f82e33cab924b4de7c082550970f02597ca7ee2..c48584bb284609b5d4ce0ed78444eb9483e65dcc 100644 (file)
@@ -147,6 +147,56 @@ public class ArcCylinder {
                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);
index dc7ff4e5270a31c0707df36e02a4531556781989..6b1bf618b7533f8183aed58c4210b27278b4f790 100644 (file)
@@ -72,7 +72,7 @@ public class Tube {
                for (int i = 0; i < vertices.size() - 1; i++) {
                        t.set(vertices.get(i+1));
                        t.sub(vertices.get(i));
-                       if (t.lengthSquared() < 0.000001)
+                       if (t.lengthSquared() < 0.0000001)
                                throw new IllegalArgumentException("vertices at index " + i + " are too close to each other");
                }