Sean,

That commit didnt fix any bugs regarding sketch. That was code for 
implementing a surface area function for sketch, in particular a method 
for linearly approximating Bezier curves. If you need a more detailed 
explanation, I could take a look over the code and write something up.

Regards,
Chris

On 03/08/2013 10:59 AM, Christopher Sean Morrison wrote:
> Chris,
>
> This goes back a ways, but can you elaborate a little on what errors were 
> fixed in the below patch?  If this fixes a bug in sketch+extrude or 
> sketch+revolve, like ray tracing or conversion, I want to make sure we 
> properly document it.
>
> Cheers!
> Sean
>   
>
>
> On Jul 17, 2012, at 1:42 PM, crdu...@users.sourceforge.net wrote:
>
>> Revision: 51564
>>           http://brlcad.svn.sourceforge.net/brlcad/?rev=51564&view=rev
>> Author:   crdueck
>> Date:     2012-07-17 17:42:16 +0000 (Tue, 17 Jul 2012)
>> Log Message:
>> -----------
>> use signed curvature to find inflection point in bezier_inflection(), change 
>> test condition for approx_bezier(), fix some errors
>>
>> Modified Paths:
>> --------------
>>     brlcad/trunk/src/librt/primitives/sketch/sketch_tess.cpp
>>
>> Modified: brlcad/trunk/src/librt/primitives/sketch/sketch_tess.cpp
>> ===================================================================
>> --- brlcad/trunk/src/librt/primitives/sketch/sketch_tess.cpp 2012-07-17 
>> 16:43:35 UTC (rev 51563)
>> +++ brlcad/trunk/src/librt/primitives/sketch/sketch_tess.cpp 2012-07-17 
>> 17:42:16 UTC (rev 51564)
>> @@ -30,10 +30,11 @@
>>
>> #include "common.h"
>>
>> -#include <algorithm>
>> #include <vector>
>>
>> #include "raytrace.h"
>> +#include "rtgeom.h"
>> +#include "vmath.h"
>> #include "../../opennurbs_ext.h"
>>
>>
>> @@ -56,6 +57,7 @@
>>      return incenter;
>> }
>>
>> +
>> /* create a biarc for a bezier curve.
>>   *
>>   * extends the tangent lines to the bezier curve at its first and last 
>> control
>> @@ -64,7 +66,7 @@
>>   * of the circle defined by the first, last and intersection points.
>>   */
>> HIDDEN ON_Arc
>> -make_biarc(const ON_BezierCurve bezier)
>> +make_biarc(const ON_BezierCurve& bezier)
>> {
>>      ON_2dPoint isect, arc_pt;
>>      ON_2dPoint p_start(bezier.PointAt(0)), p_end(bezier.PointAt(1.0));
>> @@ -78,22 +80,28 @@
>> }
>>
>>
>> -/* computes the first point of inflection on a bezier if it exists by 
>> finding
>> - * where the magnitude of the velocity vector (1st derivative) is at a
>> - * maximum.
>> - * Returns true if an inflection point was found
>> +#define POW3(x) ((x)*(x)*(x))
>> +#define SIGN(x) ((x) >= 0 ? 1 : -1)
>> +#define SIGNEDCURVATURE(d1, d2) SIGN(V2CROSS((d1), (d2)) / 
>> POW3((d1).Length()))
>> +
>> +/* find a point of inflection on a bezier curve, if it exists, by finding 
>> the
>> + * value of parameter 't' where the signed curvature of the bezier changes
>> + * signs. Returns true if an inflection point is found.
>>   */
>> HIDDEN bool
>> -bezier_inflection(const ON_BezierCurve bezier, fastf_t& inflection)
>> +bezier_inflection(const ON_BezierCurve& bezier, fastf_t& inflection_pt)
>> {
>>      fastf_t t, step = 0.1;
>> -    for (t = 0.0; t <= 1.0; t += step) {
>> -        ON_2dVector derv_1, derv_2;
>> -        derv_1 = bezier.DerivativeAt(t);
>> -        derv_2 = bezier.DerivativeAt(t + step * 0.5 > 1.0 ? 1.0 : t + step 
>> * 0.5);
>> -        // compare magnitude of velocity vectors
>> -        if (derv_1.LengthSquared() > derv_2.LengthSquared()) {
>> -            inflection = t;
>> +    ON_3dVector d1, d2;
>> +    ON_3dPoint tmp;
>> +
>> +    bezier.Ev2Der(0, tmp, d1, d2);
>> +    int sign = SIGNEDCURVATURE(d1, d2);
>> +
>> +    for (t = step; t <= 1.0; t += step) {
>> +        bezier.Ev2Der(t, tmp, d1, d2);
>> +        if (sign != SIGNEDCURVATURE(d1, d2)) {
>> +            inflection_pt = t;
>>              return true;
>>          }
>>      }
>> @@ -107,17 +115,15 @@
>>   * tolerance by the biarc
>>   */
>> HIDDEN void
>> -approx_bezier(const ON_BezierCurve bezier, const ON_Arc biarc, const struct 
>> bn_tol *tol, std::vector<ON_Arc>& approx)
>> +approx_bezier(const ON_BezierCurve& bezier, const ON_Arc& biarc, const 
>> struct bn_tol *tol, std::vector<ON_Arc>& approx)
>> {
>>      fastf_t t, step = 0.1;
>>      fastf_t err, max_t, max_err = 0.0;
>> -    ON_3dPoint test;
>>      ON_BezierCurve head, tail;
>>
>>      // walk the bezier curve at interval given by step
>>      for (t = 0; t <= 1.0; t += step) {
>> -        test = bezier.PointAt(t);
>> -        err = (test - biarc.ClosestPointTo(test)).LengthSquared();
>> +        err = fabs((bezier.PointAt(t) - biarc.Center()).Length() - 
>> biarc.Radius());
>>          // find the maximum point of deviation
>>          if (err > max_err) {
>>              max_t = t;
>> @@ -125,16 +131,16 @@
>>          }
>>      }
>>
>> -    if (max_err > tol->dist_sq) {
>> +    if (max_err + VDIVIDE_TOL < tol->dist) {
>> +        // bezier doesn't deviate from biarc by the given tolerance, add 
>> the biarc
>> +        // approximation
>> +        approx.push_back(biarc);
>> +    } else {
>>          // split bezier at point of maximum deviation and recurse on the new
>>          // subsections
>>          bezier.Split(max_t, head, tail);
>>          approx_bezier(head, make_biarc(head), tol, approx);
>>          approx_bezier(tail, make_biarc(tail), tol, approx);
>> -    } else {
>> -        // bezier doesn't deviate from biarc by the given tolerance, add 
>> the biarc
>> -        // approximation
>> -        approx.push_back(biarc);
>>      }
>> }
>>
>> @@ -143,7 +149,7 @@
>>   * returns approximation in carcs
>>   */
>> HIDDEN void
>> -bezier_to_carcs(const ON_BezierCurve bezier, const struct bn_tol *tol, 
>> std::vector<ON_Arc>& carcs)
>> +bezier_to_carcs(const ON_BezierCurve& bezier, const struct bn_tol *tol, 
>> std::vector<ON_Arc>& carcs)
>> {
>>      bool curvature_changed = false;
>>      fastf_t inflection_pt, biarc_angle;
>> @@ -152,16 +158,14 @@
>>      std::vector<ON_BezierCurve> rest;
>>
>>      // get inflection point, if it exists
>> -    //if (bezier_inflection(bezier, inflection_pt)) {
>> -        //curvature_changed = true;
>> -        //bezier.Split(inflection_pt, current, tmp);
>> -        //rest.push_back(tmp);
>> -    //} else {
>> -        //current = bezier;
>> -    //}
>> +    if (bezier_inflection(bezier, inflection_pt)) {
>> +        curvature_changed = true;
>> +        bezier.Split(inflection_pt, current, tmp);
>> +        rest.push_back(tmp);
>> +    } else {
>> +        current = bezier;
>> +    }
>>
>> -    current = bezier;
>> -
>>      do {
>> bez_to_carcs_loop:
>>      biarc = make_biarc(current);
>> @@ -197,7 +201,7 @@
>>
>>          current = rest.back();
>>          rest.pop_back();
>> -        continue;
>> +        goto loop;
>>      }
>>
>>      if (curvature_changed) {
>> @@ -237,8 +241,8 @@
>>   *      else, calculate the area for the polygon edge Start->End, and the 
>> area
>>   *      of the circular segment
>>   * bezier_seg: approximate the bezier using the bezier_to_carcs() function. 
>> for
>> - *      each carc_seg, calculate the area for the polygon edges Start->Mid 
>> and
>> - *      Mid->End, and the area of the circular segment
>> + *      each carc_seg, calculate the area for the polygon edges Start->End 
>> and
>> + *      the area of the circular segment
>>   */
>> extern "C" void
>> rt_sketch_surf_area(fastf_t *area, const struct rt_db_internal *ip) //, 
>> const struct bn_tol *tol)
>> @@ -298,9 +302,8 @@
>>              // approximate bezier curve by a set of circular arcs
>>              bezier_to_carcs(ON_BezierCurve(bez_pts), &tol, carcs);
>>              for (std::vector<ON_Arc>::iterator it = carcs.begin(); it != 
>> carcs.end(); ++it) {
>> -                // calculate area for polygon edges Start->Mid, Mid->End
>> -                *area += V2CROSS(it->StartPoint(), it->MidPoint());
>> -                *area += V2CROSS(it->MidPoint(), it->EndPoint());
>> +                // calculate area for polygon edges Start->End
>> +                *area += V2CROSS(it->StartPoint(), it->EndPoint());
>>                  // calculate area for circular segment
>>                  *area += 0.5 * it->Radius() * it->Radius() * 
>> (it->AngleRadians() - sin(it->AngleRadians()));
>>              }
>>
>> This was sent by the SourceForge.net collaborative development platform, the 
>> world's largest Open Source development site.
>>
>>
>> ------------------------------------------------------------------------------
>> Live Security Virtual Conference
>> Exclusive live event will cover all the ways today's security and
>> threat landscape has changed and how IT managers can respond. Discussions
>> will include endpoint security, mobile security and the latest in malware
>> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
>> _______________________________________________
>> BRL-CAD Source Commits mailing list
>> brlcad-comm...@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/brlcad-commits
>
> ------------------------------------------------------------------------------
> Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester
> Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the
> endpoint security space. For insight on selecting the right partner to
> tackle endpoint security challenges, access the full report.
> http://p.sf.net/sfu/symantec-dev2dev
> _______________________________________________
> BRL-CAD Developer mailing list
> brlcad-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/brlcad-devel


-- 
Regards,
Chris


------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
BRL-CAD Developer mailing list
brlcad-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-devel

Reply via email to