public virtual MyPoint ComputeDU(double u1, double v1)
        {
            int l = this.isCylinder ? 3 : 0;

            double step1, step2;
            int    m = DeBoorControlPoints.GetLength(0) + Degree + 1 + l;

            m = DeBoorControlPoints.GetLength(1) + Degree + 1;
            //step1 = (_knots2[DeBoorControlPoints.GetLength(1)] - _knots2[Degree]) / (double)(samplesNumber - 1);
            //step2 = (_knots[DeBoorControlPoints.GetLength(0) + l] - _knots[Degree]) / (double)(samplesNumber - 1);
            double         u, v;
            List <MyPoint> qPoints = new List <MyPoint>();

            v = _knots2[Degree - 1]; //N
            double a, b, c, x, z, y;

            x = 0; y = 0; z = 0; a = 0; b = 0; c = 0;
            v = u1;
            double delta = 0.001;

            if (v < _knots2[Degree - 1])
            {
                return(new MyPoint());
            }
            if (v - delta <= _knots2[DeBoorControlPoints.GetLength(1)])
            {
                for (int i = 0; i < mSize + l; i++)
                {
                    x = y = z = 0;
                    for (int j = 0; j < nSize; j++)
                    {
                        x += (DeBoorControlPoints[i % mSize, j].x * Nik2Derivative(v, j, Degree - 1));
                        y += (DeBoorControlPoints[i % mSize, j].y * Nik2Derivative(v, j, Degree - 1));
                        z += (DeBoorControlPoints[i % mSize, j].z * Nik2Derivative(v, j, Degree - 1));
                    }
                    qPoints.Add(new MyPoint(x, y, z));
                }

                List <MyPoint> subList = new List <MyPoint>();
                u = _knots[Degree];
                u = v1;

                if (u - delta <= _knots[DeBoorControlPoints.GetLength(0) + l])
                {
                    a = b = c = 0;
                    for (int p = 0; p < mSize + l; p++)
                    {
                        a += (qPoints[p].x * Nik(u, p, Degree));
                        b += (qPoints[p].y * Nik(u, p, Degree));
                        c += (qPoints[p].z * Nik(u, p, Degree));
                    }
                    return(new MyPoint(a, b, c));
                    //subList.Add(new MyPoint(a, b, c));
                    //u += step2;
                }
                return(new MyPoint());
            }
            return(new MyPoint());
        }
 public void TranslateZ(int shift)
 {
     for (int i = 0; i < DeBoorControlPoints.GetLength(0); i++)
     {
         for (int j = 0; j < DeBoorControlPoints.GetLength(1); j++)
         {
             DeBoorControlPoints[i, j].z += (double)shift;
         }
     }
 }
        public virtual void CalculatePoints()
        {
            if (DeBoorControlPoints[0, 0] == null || isTrymmed)
            {
                return;
            }

            points.Clear();
            _knots.Clear();
            double delta = 0.001f;

            _knots2.Clear();
            int l = this.isCylinder ? 3 : 0;

            double step1, step2;
            int    m = DeBoorControlPoints.GetLength(0) + Degree + 1 + l;

            for (int i = 0; i < m; i++)
            {
                _knots.Add((double)i / (double)(m - 1));
            }
            m = DeBoorControlPoints.GetLength(1) + Degree + 1;
            for (int i = 0; i < m; i++)
            {
                _knots2.Add((double)i / (double)(m - 1));
            }
            //   int counter1 = 0;
            //   int counter2 = 0;
            step1 = (_knots2[DeBoorControlPoints.GetLength(1)] - _knots2[Degree]) / (double)(samplesNumber - 1);
            step2 = (_knots[DeBoorControlPoints.GetLength(0) + l] - _knots[Degree]) / (double)(samplesNumber - 1);
            double         u, v;
            List <MyPoint> qPoints = new List <MyPoint>();

            v = _knots2[Degree]; //N
            double x = 0, y = 0, z = 0, a = 0, b = 0, c = 0;

            while (v - delta <= _knots2[DeBoorControlPoints.GetLength(1)])
            {
                for (int i = 0; i < mSize + l; i++)
                {
                    x = y = z = 0;
                    for (int j = 0; j < nSize; j++)
                    {
                        x += (DeBoorControlPoints[i % mSize, j].x * Nik2(v, j, Degree));
                        y += (DeBoorControlPoints[i % mSize, j].y * Nik2(v, j, Degree));
                        z += (DeBoorControlPoints[i % mSize, j].z * Nik2(v, j, Degree));
                    }
                    qPoints.Add(new MyPoint(x, y, z));
                }

                List <MyPoint> subList = new List <MyPoint>();
                //     counter2 = 0;
                u = _knots[Degree];
                while (u - delta <= _knots[DeBoorControlPoints.GetLength(0) + l])
                {
                    a = b = c = 0;
                    for (int p = 0; p < mSize + l; p++)
                    {
                        a += (qPoints[p].x * Nik(u, p, Degree));
                        b += (qPoints[p].y * Nik(u, p, Degree));
                        c += (qPoints[p].z * Nik(u, p, Degree));
                    }
                    subList.Add(new MyPoint(a, b, c));
                    u += step2;
                }
                points.Add(subList);
                //counter1++;
                v += step1;// _knots2[Degree] + step1 * (double)counter1;
                qPoints.Clear();
            }
        }
        public virtual void CalculatePoints(double step)
        {
            if (DeBoorControlPoints[0, 0] == null)
            {
                return;
            }

            //points2.Clear();
            _knots.Clear();
            double delta = 0.001f;

            _knots2.Clear();
            int l = this.isCylinder ? 3 : 0;

            int    m           = DeBoorControlPoints.GetLength(0) + Degree + 1 + l;
            int    from        = 3;
            int    to          = DeBoorControlPoints.GetLength(0) + l;
            int    numOfPoints = to - from + 1;
            double cos1        = (double)1 / (double)(numOfPoints - 1);
            double start       = -3 * cos1;

            for (int i = 0; i < m; i++)
            {
                _knots.Add(start + i * cos1);
            }
            m           = DeBoorControlPoints.GetLength(1) + Degree + 1;
            from        = 3;
            to          = DeBoorControlPoints.GetLength(1);
            numOfPoints = to - from + 1;
            cos1        = (double)1 / (double)(numOfPoints - 1);
            start       = -3 * cos1;
            for (int i = 0; i < m; i++)
            {
                _knots2.Add(start + i * cos1);
            }

            double step1, step2;

            step1 = (_knots2[DeBoorControlPoints.GetLength(1)] - _knots2[Degree]) / (double)(samplesNumber - 1);
            step2 = (_knots[DeBoorControlPoints.GetLength(0) + l] - _knots[Degree]) / (double)(samplesNumber - 1);
            //   int counter1 = 0;
            //   int counter2 = 0;
            // step1 = step;
            // step2 = step;
            double         u, v;
            List <MyPoint> qPoints = new List <MyPoint>();

            v = _knots2[Degree]; //N
            double x = 0, y = 0, z = 0, a = 0, b = 0, c = 0;

            while (v - delta <= _knots2[DeBoorControlPoints.GetLength(1)])
            {
                for (int i = 0; i < mSize + l; i++)
                {
                    x = y = z = 0;
                    for (int j = 0; j < nSize; j++)
                    {
                        x += (DeBoorControlPoints[i % mSize, j].x * Nik2(v, j, Degree));
                        y += (DeBoorControlPoints[i % mSize, j].y * Nik2(v, j, Degree));
                        z += (DeBoorControlPoints[i % mSize, j].z * Nik2(v, j, Degree));
                    }
                    qPoints.Add(new MyPoint(x, y, z));
                }

                List <MyPoint> subList = new List <MyPoint>();
                //     counter2 = 0;
                u = _knots[Degree];
                while (u - delta <= _knots[DeBoorControlPoints.GetLength(0) + l])
                {
                    a = b = c = 0;
                    for (int p = 0; p < mSize + l; p++)
                    {
                        a += (qPoints[p].x * Nik(u, p, Degree));
                        b += (qPoints[p].y * Nik(u, p, Degree));
                        c += (qPoints[p].z * Nik(u, p, Degree));
                    }
                    subList.Add(new MyPoint(a, b, c));
                    subList.Last().u = u;
                    subList.Last().v = v;
                    u += step2;
                }
                //points2.Add(subList);

                v += step1;// _knots2[Degree] + step1 * (double)counter1;
                qPoints.Clear();
            }
        }
        public double ComputeStepV()
        {
            int l = this.isCylinder ? 3 : 0;

            return((_knots[DeBoorControlPoints.GetLength(0) + l] - _knots[Degree]) / (double)(samplesNumber - 1));
        }
 public double ComputeStepU()
 {
     return((_knots2[DeBoorControlPoints.GetLength(1)] - _knots2[Degree]) / (double)(samplesNumber - 1));
 }
        public virtual MyPoint ComputePointForParameter(double u1, double v1)
        {
            if (DeBoorControlPoints[0, 0] == null)
            {
                return(new MyPoint());
            }

            _knots.Clear();
            double delta = 0.001f;

            _knots2.Clear();
            int l = this.isCylinder ? 3 : 0;

            double step1, step2;
            int    m           = DeBoorControlPoints.GetLength(0) + Degree + 1 + l;
            int    from        = 3;
            int    to          = DeBoorControlPoints.GetLength(0) + l;
            int    numOfPoints = to - from + 1;
            double cos1        = (double)1 / (double)(numOfPoints - 1);
            double start       = -3 * cos1;

            for (int i = 0; i < m; i++)
            {
                _knots.Add(start + i * cos1);
            }
            m           = DeBoorControlPoints.GetLength(1) + Degree + 1;
            from        = 3;
            to          = DeBoorControlPoints.GetLength(1);
            numOfPoints = to - from + 1;
            cos1        = (double)1 / (double)(numOfPoints - 1);
            start       = -3 * cos1;
            for (int i = 0; i < m; i++)
            {
                _knots2.Add(start + i * cos1);
            }

            double         u, v;
            List <MyPoint> qPoints = new List <MyPoint>();

            double x = 0, y = 0, z = 0, a = 0, b = 0, c = 0;

            v = u1;
            if (v - delta < 1)
            {
                for (int i = 0; i < mSize + l; i++)
                {
                    x = y = z = 0;
                    for (int j = 0; j < nSize; j++)
                    {
                        x += (DeBoorControlPoints[i % mSize, j].x * Nik2(v, j, Degree));
                        y += (DeBoorControlPoints[i % mSize, j].y * Nik2(v, j, Degree));
                        z += (DeBoorControlPoints[i % mSize, j].z * Nik2(v, j, Degree));
                    }
                    qPoints.Add(new MyPoint(x, y, z));
                }
                List <MyPoint> subList = new List <MyPoint>();
                u = v1;
                if (u - delta <= 1)
                {
                    a = b = c = 0;
                    for (int p = 0; p < mSize + l; p++)
                    {
                        a += (qPoints[p].x * Nik(u, p, Degree));
                        b += (qPoints[p].y * Nik(u, p, Degree));
                        c += (qPoints[p].z * Nik(u, p, Degree));
                    }
                    return(new MyPoint(a, b, c));
                }
                return(new MyPoint());
            }
            return(new MyPoint());
        }
        public virtual List <MyPoint> getP(double u1, double v1)
        {
            double  step = 0.05;
            MyPoint p1   = new MyPoint();
            MyPoint p2   = new MyPoint();
            MyPoint p3   = new MyPoint();

            p1.SetCoordinates(this.ComputePointForParameter(u1, v1));
            p2.SetCoordinates(this.ComputePointForParameter(u1, v1 + step));
            p3.SetCoordinates(MyMath.Substract(p2, p1));
            p3.Normalized();

            //points.Clear();
            //_knots.Clear();
            double delta = 0.001f;
            //_knots2.Clear();
            int l = this.isCylinder ? 3 : 0;

            double step1, step2;
            int    m = DeBoorControlPoints.GetLength(0) + Degree + 1 + l;

            //for (int i = 0; i < m; i++)
            //    _knots.Add((double)i / (double)(m - 1));
            //m = DeBoorControlPoints.GetLength(1) + Degree + 1;
            //for (int i = 0; i < m; i++)
            //    _knots2.Add((double)i / (double)(m - 1));
            step1 = (_knots2[DeBoorControlPoints.GetLength(1)] - _knots2[Degree]) / (double)(samplesNumber - 1);
            step2 = (_knots[DeBoorControlPoints.GetLength(0) + l] - _knots[Degree]) / (double)(samplesNumber - 1);
            double         u, v;
            List <MyPoint> qPoints = new List <MyPoint>();

            v = _knots2[Degree]; //N
            double x = 0, y = 0, z = 0, a = 0, b = 0, c = 0;

            while (v - delta <= _knots2[DeBoorControlPoints.GetLength(1)])
            {
                for (int i = 0; i < mSize + l; i++)
                {
                    x = y = z = 0;
                    for (int j = 0; j < nSize; j++)
                    {
                        x += (DeBoorControlPoints[i % mSize, j].x * Nik2(v, j, Degree));
                        y += (DeBoorControlPoints[i % mSize, j].y * Nik2(v, j, Degree));
                        z += (DeBoorControlPoints[i % mSize, j].z * Nik2(v, j, Degree));
                    }
                    qPoints.Add(new MyPoint(x, y, z));
                    v += step1;
                }
            }

            List <MyPoint> qPointsDer = new List <MyPoint>();

            qPointsDer.Add(new MyPoint());
            for (int i = 0; i < qPoints.Count - 1; i++)
            {
                qPointsDer.Add(new MyPoint());
                qPointsDer[i].SetCoordinates(MyMath.Difference(qPoints[i + 1], qPoints[i]));
            }
            //qPointsDer[0].SetCoordinates(MyMath.AddDifference(qPointsDer[0], qPointsDer[1]));
            //policzyc krzywa stalego parametru
            //Qi = (delta P)
            _knotsDeriv.Clear();
            m = qPointsDer.Count + Degree - 1 + 1; //stopień = 2
            for (int i = 0; i < m; i++)
            {
                _knotsDeriv.Add((double)i / (double)(m - 1));
            }
            double t;

            t = u1;
            //        while (t < _knotsDeriv[qPointsDer.Count])
            //       {
            x = y = z = 0;
            for (int i = 0; i < qPointsDer.Count; i++)
            {
                x += (qPointsDer[i].x * Nik3(t, i, Degree - 1));
                y += (qPointsDer[i].y * Nik3(t, i, Degree - 1));
                z += (qPointsDer[i].z * Nik3(t, i, Degree - 1));
            }
            //        }
            //Ci = suma i = 0 .. n-1 Ni,p-1(u),Qi
            return(qPointsDer);
//            return p3;
        }
Esempio n. 9
0
        public override void CreateMain()
        {
            //m = 10 , n = 20
            int breakinPart = 17;
            int brakinPart2 = 7;

            for (int i = 0; i < this.mSize; i++)
            {
                double r  = 25;
                double r2 = 25;
                double r3 = 7;
                double v  = ((double)i) / ((double)this.mSize);
                v *= Math.PI * 2.0f;
                for (int j = 0; j < this.nSize; j++)
                {
                    if (j < brakinPart2)
                    {
                        DeBoorControlPoints[i, j] = new MyPoint(-nSize * (r + 2) / 2 + r * j, Math.Cos(v) * 2 * r3, Math.Sin(v) * 2 * r3);
                        r3 += 3.0f;
                    }
                    else if (j < breakinPart)
                    {
                        DeBoorControlPoints[i, j] = new MyPoint(-nSize * (r + 2) / 2 + r * j, Math.Cos(v) * 2 * r, Math.Sin(v) * 2 * r);
                    }
                    else
                    {
                        r2 -= 8.0f;
                        DeBoorControlPoints[i, j] = new MyPoint(-nSize * (r + 2) / 2 + r * breakinPart + (j - breakinPart) * (r / 2.0f), Math.Cos(v) * 2 * r2, Math.Sin(v) * 2 * r2);
                    }
                }
            }
            for (int i = 0; i < this.mSize; i++)
            {
                if (i != 0 && i != 3 && i != 6 && i != 9)
                {
                    continue;
                }
                double r  = 25;
                double r4 = 60;
                double r3 = 9;
                double v  = ((double)i) / ((double)this.mSize);
                v *= Math.PI * 2.0f;
                for (int j = 0; j < 3; j++)
                {
                    DeBoorControlPoints[i, j] = new MyPoint(-nSize * r / 2 + r * j, Math.Cos(v) * 2 * r4, Math.Sin(v) * 2 * r4);
                    if (j < 2)
                    {
                        DeBoorControlPoints[i, j].x -= r;
                    }
                    //
                    //         if (j == brakinPart2 + 4)
                    //             DeBoorControlPoints[i, j].x += r4;
                }
            }

            MyPoint[,] Temp = new MyPoint[DeBoorControlPoints.GetLength(0), DeBoorControlPoints.GetLength(1)];
            for (int i = 0; i < DeBoorControlPoints.GetLength(0); i++)
            {
                for (int j = 0; j < DeBoorControlPoints.GetLength(1); j++)
                {
                    Temp[i, j] = new MyPoint();
                    Temp[i, j].SetCoordinates(DeBoorControlPoints[i, j]);
                }
            }

            for (int i = 0; i < DeBoorControlPoints.GetLength(0); i++)
            {
                for (int j = 0; j < DeBoorControlPoints.GetLength(1); j++)
                {
                    DeBoorControlPoints[i, j] = Temp[DeBoorControlPoints.GetLength(0) - 1 - i, j];
                }
            }

            CalculatePoints();
        }