Revision: 44625
http://brlcad.svn.sourceforge.net/brlcad/?rev=44625&view=rev
Author: indianlarry
Date: 2011-05-18 11:41:48 +0000 (Wed, 18 May 2011)
Log Message:
-----------
Fixed array overrun in cubic interpolation routine
Modified Paths:
--------------
brlcad/trunk/src/conv/step/PullbackCurve.cpp
Modified: brlcad/trunk/src/conv/step/PullbackCurve.cpp
===================================================================
--- brlcad/trunk/src/conv/step/PullbackCurve.cpp 2011-05-17 20:15:26 UTC
(rev 44624)
+++ brlcad/trunk/src/conv/step/PullbackCurve.cpp 2011-05-18 11:41:48 UTC
(rev 44625)
@@ -405,93 +405,87 @@
}
}
-
ON_NurbsCurve*
-interpolateLocalCubicCurve(ON_2dPointArray &Q)
-{
+interpolateLocalCubicCurve(ON_2dPointArray &Q) {
int num_samples = Q.Count();
int num_segments = Q.Count() - 1;
- int qsize = num_samples + 3;
- std::vector<ON_2dVector> qarray(qsize);
- ON_2dVector *q = &qarray[1];
+ int qsize = num_samples + 4;
+ std::vector < ON_2dVector > qarray(qsize);
- for (int i=1; i < Q.Count(); i++) {
- q[i] = Q[i] - Q[i-1];
+ for (int i = 1; i < Q.Count(); i++) {
+ qarray[i + 1] = Q[i] - Q[i - 1];
}
- q[0] = 2.0*q[1] - q[2];
- q[-1] = 2.0*q[0] - q[1];
+ qarray[1] = 2.0 * qarray[2] - qarray[3];
+ qarray[0] = 2.0 * qarray[1] - qarray[2];
- q[num_samples] = 2*q[num_samples-1] - q[num_samples-2];
- q[num_samples+1] = 2*q[num_samples] - q[num_samples-1];
- q[num_samples+2] = 2*q[num_samples+1] - q[num_samples];
+ qarray[num_samples + 1] = 2 * qarray[num_samples] - qarray[num_samples -
1];
+ qarray[num_samples + 2] = 2 * qarray[num_samples + 1] -
qarray[num_samples];
+ qarray[num_samples + 3] = 2 * qarray[num_samples + 2] - qarray[num_samples
+ 1];
- std::vector<ON_2dVector> T(num_samples);
+ std::vector < ON_2dVector > T(num_samples);
std::vector<double> A(num_samples);
- for (int k=0; k < num_samples; k++) {
- ON_3dVector a = ON_CrossProduct(q[k-1], q[k]);
- ON_3dVector b = ON_CrossProduct(q[k+1], q[k+2]);
+ for (int k = 0; k < num_samples; k++) {
+ ON_3dVector a = ON_CrossProduct(qarray[k], qarray[k + 1]);
+ ON_3dVector b = ON_CrossProduct(qarray[k + 2], qarray[k + 3]);
double alength = a.Length();
if (NEAR_ZERO(alength, PBC_TOL)) {
- A[k] = 1.0;
+ A[k] = 1.0;
} else {
- A[k] = (a.Length())/(a.Length() + b.Length());
+ A[k] = (a.Length()) / (a.Length() + b.Length());
}
- T[k] = (1.0 - A[k])*q[k] + A[k]*q[k+1];
+ T[k] = (1.0 - A[k]) * qarray[k + 1] + A[k] * qarray[k + 2];
T[k].Unitize();
}
- std::vector<ON_2dPointArray> P(num_samples-1);
+ std::vector < ON_2dPointArray > P(num_samples - 1);
ON_2dPointArray control_points;
control_points.Append(Q[0]);
- for (int i=1; i<num_samples; i++) {
- ON_2dPoint P0 = Q[i-1];
+ for (int i = 1; i < num_samples; i++) {
+ ON_2dPoint P0 = Q[i - 1];
ON_2dPoint P3 = Q[i];
- ON_2dVector T0 = T[i-1];
+ ON_2dVector T0 = T[i - 1];
ON_2dVector T3 = T[i];
double a, b, c;
ON_2dVector vT0T3 = T0 + T3;
ON_2dVector dP0P3 = P3 - P0;
- a = 16.0 - vT0T3.Length()*vT0T3.Length();
- b = 12.0*(dP0P3*vT0T3);
- c = -36.0*dP0P3.Length()*dP0P3.Length();
+ a = 16.0 - vT0T3.Length() * vT0T3.Length();
+ b = 12.0 * (dP0P3 * vT0T3);
+ c = -36.0 * dP0P3.Length() * dP0P3.Length();
- double alpha = (-b + sqrt(b*b - 4.0*a*c))/(2.0*a);
+ double alpha = (-b + sqrt(b * b - 4.0 * a * c)) / (2.0 * a);
- ON_2dPoint P1 = P0 + (1.0/3.0)*alpha*T0;
+ ON_2dPoint P1 = P0 + (1.0 / 3.0) * alpha * T0;
control_points.Append(P1);
- ON_2dPoint P2 = P3 - (1.0/3.0)*alpha*T3;
+ ON_2dPoint P2 = P3 - (1.0 / 3.0) * alpha * T3;
control_points.Append(P2);
- P[i-1].Append(P0);
- P[i-1].Append(P1);
- P[i-1].Append(P2);
- P[i-1].Append(P3);
+ P[i - 1].Append(P0);
+ P[i - 1].Append(P1);
+ P[i - 1].Append(P2);
+ P[i - 1].Append(P3);
}
- control_points.Append(Q[num_samples-1]);
+ control_points.Append(Q[num_samples - 1]);
//generateParameters(spline);
- std::vector<double> u(num_segments+1);
+ std::vector<double> u(num_segments + 1);
u[0] = 0.0;
- for (int k=0;k<num_segments;k++) {
- u[k+1] = u[k] + 3.0*(P[k][1]-P[k][0]).Length();
+ for (int k = 0; k < num_segments; k++) {
+ u[k + 1] = u[k] + 3.0 * (P[k][1] - P[k][0]).Length();
}
int degree = 3;
int n = control_points.Count();
int p = degree;
int m = n + p - 1;
int dimension = 2;
- ON_NurbsCurve* c = ON_NurbsCurve::New(dimension,
- false,
- degree+1,
- n);
+ ON_NurbsCurve* c = ON_NurbsCurve::New(dimension, false, degree + 1, n);
c->ReserveKnotCapacity(m);
for (int i = 0; i < degree; i++) {
c->SetKnot(i, 0.0);
}
for (int i = 1; i < num_segments; i++) {
- double knot_value = u[i]/u[num_segments];
- c->SetKnot(degree + 2*(i -1), knot_value);
- c->SetKnot(degree + 2*(i -1) + 1, knot_value);
+ double knot_value = u[i] / u[num_segments];
+ c->SetKnot(degree + 2 * (i - 1), knot_value);
+ c->SetKnot(degree + 2 * (i - 1) + 1, knot_value);
}
for (int i = m - p; i < m; i++) {
c->SetKnot(i, 1.0);
@@ -499,13 +493,12 @@
// insert the control points
for (int i = 0; i < n; i++) {
- ON_3dPoint pnt = control_points[i];
- c->SetCV(i,pnt);
+ ON_3dPoint pnt = control_points[i];
+ c->SetCV(i, pnt);
}
return c;
}
-
ON_NurbsCurve*
interpolateLocalCubicCurve(ON_3dPointArray &Q)
{
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its
next-generation tools to help Windows* and Linux* C/C++ and Fortran
developers boost performance applications - including clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits