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