1 package org.simantics.g3d.shape;
3 import java.util.ArrayList;
6 import javax.vecmath.AxisAngle4d;
7 import javax.vecmath.Point3d;
8 import javax.vecmath.Quat4d;
9 import javax.vecmath.Tuple3d;
10 import javax.vecmath.Vector3d;
12 import org.simantics.g3d.math.MathTools;
14 public class ArcCylinder {
16 public Mesh create(Point3d s, Point3d v, Point3d e, double rad, int res) {
18 Vector3d v1 = new Vector3d(s);
21 Vector3d v2 = new Vector3d(e);
24 double a = v2.angle(v1);
28 Vector3d rn = new Vector3d();
32 if ((a +0.0001) > Math.PI) {
38 c.scale(v1.length() * (1.0/Math.cos(a*0.5)));
44 Vector3d r2 = new Vector3d(e);
52 steps = (int)(Math.ceil(a/0.1));
59 List<Tuple3d> vertices = new ArrayList<Tuple3d>(res * (steps+1));
60 List<Tuple3d> normals = new ArrayList<Tuple3d>(res * (steps+1));
61 List<Integer> indices = new ArrayList<Integer>();
63 for (int i = 0; i <= steps; i++) {
71 } else if (i == steps) {
78 Quat4d q = MathTools.getQuat(new AxisAngle4d(rn, ca));
79 MathTools.rotate(q, r1, p);
86 createCircle(vertices, normals, p, t, rn, res, rad);
88 int count = steps*res*6;
89 for (int i = 0; i < count; i++) {
92 createIndices(steps, res, indices);
93 return new Mesh(vertices, normals, indices);
96 private static void createCircle(List<Tuple3d> points, List<Tuple3d> normals, Tuple3d p, Vector3d t, Vector3d n, int res, double radius) {
100 for (int index = 0; index < res; index ++) {
106 AxisAngle4d aa = new AxisAngle4d(t, (Math.PI * 2 * (double)index)/(double)res);
108 MathTools.rotate(MathTools.getQuat(aa), n, v);
110 //int vIndex = (i*resolution + index)*3;
111 Vector3d pt = new Vector3d(p);
113 //points.set(vIndex, pt);
116 //normals.set(vIndex, v);
120 private static void createIndices(int steps, int resolution, List<Integer> index) {
121 for (int c = 0; c < steps; c++) {
122 for (int s = 0; s < resolution; s++) {
123 int ii = (c * resolution + s) * 6;
124 int iv = c*resolution + s;
127 iv+1 ---- iv + resolution + 1
130 iv ---- iv + resolution
132 if (s < resolution - 1) {
134 index.set(ii+1,iv+resolution);
135 index.set(ii+0,iv+resolution+1);
138 index.set(ii+4,iv+resolution+1);
139 index.set(ii+3,iv+1);
142 index.set(ii+1,iv+resolution);
143 index.set(ii+0,iv+1);
146 index.set(ii+4,iv+1);
147 index.set(ii+3,iv+1-resolution);