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; }
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(); }