public List <Coord3d> getDecimatedVertices(double dstep) { List <Coord3d> steps = new List <Coord3d>(); int num = vertices.Count; int i = 0; double segLen = 0; Coord3d a = default(Coord3d); Coord3d dir = default(Coord3d); Coord3d stepDir = default(Coord3d); Coord3d b = vertices[0]; Coord3d curr = b.Clone(); while (i < num - 1) { a = b; b = vertices[i + 1]; dir = b.substract(a); segLen = 1 / dir.magSquared(); stepDir = dir.normalizeTo(dstep); curr = a.interpolateTo(b, curr.substract(a).dot(dir) * segLen); while (curr.substract(a).dot(dir) / segLen <= 1) { steps.Add(curr.Clone()); curr.addSelf(stepDir); } i += 1; } return(steps); }
public List <Coord3d> ComputeVertices(int resolution) { UpdateCoefficients(); resolution += 1; if (bernstein == null || bernstein.resolution != resolution) { bernstein = new BernsteinPolynomial(resolution); } if (vertices == null) { vertices = new List <Coord3d>(); } else { vertices.Clear(); } findCPoints(); Coord3d deltaP = default(Coord3d); Coord3d deltaQ = default(Coord3d); resolution -= 1; for (int i = 0; i <= numP - 2; i++) { Coord3d p = points[i]; Coord3d q = points[i + 1]; deltaP = delta[i].@add(p); deltaQ = q.substract(delta[i + 1]); for (int k = 0; k <= resolution - 1; k++) { double x = p.x * bernstein.b0[k] + deltaP.x * bernstein.b1[k] + deltaQ.x * bernstein.b2[k] + q.x * bernstein.b3[k]; double y = p.y * bernstein.b0[k] + deltaP.y * bernstein.b1[k] + deltaQ.y * bernstein.b2[k] + q.y * bernstein.b3[k]; double z = p.z * bernstein.b0[k] + deltaP.z * bernstein.b1[k] + deltaQ.z * bernstein.b2[k] + q.z * bernstein.b3[k]; vertices.Add(new Coord3d(x, y, z)); } } vertices.Add(points[points.Length - 1]); return(vertices); }