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

Reply via email to