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);
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;
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++) {
+ 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 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++) {