Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }