Revision: 51586 http://brlcad.svn.sourceforge.net/brlcad/?rev=51586&view=rev Author: crdueck Date: 2012-07-19 07:25:15 +0000 (Thu, 19 Jul 2012) Log Message: ----------- fix some errors in the calculations for area
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-19 06:42:39 UTC (rev 51585) +++ brlcad/trunk/src/librt/primitives/sketch/sketch_tess.cpp 2012-07-19 07:25:15 UTC (rev 51586) @@ -263,8 +263,9 @@ * 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) +rt_sketch_surf_area(fastf_t *area, const struct rt_db_internal *ip) { + int j; size_t i; fastf_t full_circle_area = 0.0; @@ -295,7 +296,7 @@ case CURVE_LSEG_MAGIC: lsg = (struct line_seg *)lng; // calculate area for polygon edge - *area += V2CROSS(SKETCHPT(lsg->start), SKETCHPT(lsg->end)); + *area += 0.5 * V2CROSS(SKETCHPT(lsg->start), SKETCHPT(lsg->end)); break; case CURVE_CARC_MAGIC: csg = (struct carc_seg *)lng; @@ -304,7 +305,7 @@ full_circle_area += M_PI * DIST_PT_PT_SQ(SKETCHPT(csg->start), SKETCHPT(csg->end)); } else { // calculate area for polygon edge - *area += V2CROSS(SKETCHPT(csg->start), SKETCHPT(csg->end)); + *area += 0.5 * V2CROSS(SKETCHPT(csg->start), SKETCHPT(csg->end)); // calculate area for circular segment *area += carc_area(csg, sketch_ip); } @@ -314,15 +315,15 @@ ON_2dPointArray bez_pts(bsg->degree + 1); std::vector<ON_Arc> carcs; // convert struct bezier_seg into ON_BezierCurve - for (i = 0; (int)i < bsg->degree + 1; i++) { - bez_pts.Append(SKETCHPT(bsg->ctl_points[i])); + for (j = 0; j < bsg->degree + 1; j++) { + bez_pts.Append(SKETCHPT(bsg->ctl_points[j])); } // 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->End - *area += V2CROSS(it->StartPoint(), it->EndPoint()); - // calculate area for circular segment + // calculate area for each polygon edge + *area += 0.5 * V2CROSS(it->StartPoint(), it->EndPoint()); + // calculate area for each circular segment *area += 0.5 * it->Radius() * it->Radius() * (it->AngleRadians() - sin(it->AngleRadians())); } } @@ -332,7 +333,7 @@ break; } } - *area = fabs(*area) * 0.5 + full_circle_area; + *area = fabs(*area) + full_circle_area; } 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-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits