From f8f503f3f0150b96d34625ef8c604fb9ed552407 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 7 Oct 2012 20:44:28 +0200 Subject: powerstroke: arc extrp. corner case handling (bzr r11751) --- src/live_effects/lpe-powerstroke.cpp | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index 21fc5c869..df94a761e 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -28,6 +28,7 @@ #include <2geom/path-intersection.h> #include <2geom/crossing.h> #include <2geom/ellipse.h> +#include <2geom/math-utils.h> #include #include "spiro.h" @@ -382,8 +383,9 @@ static Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise derivs = reverse(B[prev_i]).valueAndDerivatives(0.,5); for (unsigned deriv_n = 1, count = 0; deriv_n < derivs.size(); deriv_n++) { @@ -394,17 +396,25 @@ static Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise= 0 ) { + norm0 = tang0.ccw(); + } else { + norm0 = tang0.cw(); + } break; // break out of for-loop } } } double r0 = curv0; - Geom::Point center0 = B[prev_i].at1() - r0*tang0.ccw(); + Geom::Point center0 = B[prev_i].at1() - r0*norm0; circle0 = Geom::Circle(center0, r0); } + Geom::Point tang1(0.,0.); { - Geom::Point tang1(0.,0.); + Geom::Point norm1(0.,0.); Geom::Coord curv1 = 0; std::vector derivs = B[i].valueAndDerivatives(0.,5); for (unsigned deriv_n = 1, count = 0; deriv_n < derivs.size(); deriv_n++) { @@ -416,20 +426,31 @@ static Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise= 0 ) { + norm1 = tang1.ccw(); + } else { + norm1 = tang1.cw(); + } break; // break out of for-loop } } } double r1 = curv1; - Geom::Point center1 = B[i].at0() - r1*tang1.ccw(); + Geom::Point center1 = B[i].at0() - r1*norm1; circle1 = Geom::Circle(center1, r1); } Geom::Point points[2]; int solutions = circle_circle_intersection(circle0, circle1, points[0], points[1]); if (solutions == 2) { - Geom::EllipticalArc *arc0 = circle0.arc(B[prev_i].at1(), 0.5*(B[prev_i].at1()+points[0]), points[0], true); - Geom::EllipticalArc *arc1 = circle1.arc(points[0], 0.5*(points[0]+B[i].at0()), B[i].at0(), true); + Geom::Point sol = points[0]; + if ( dot(tang0,sol-B[prev_i].at1()) > 0 ) { + sol = points[1]; + } + Geom::EllipticalArc *arc0 = circle0.arc(B[prev_i].at1(), 0.5*(B[prev_i].at1()+sol), sol, true); + Geom::EllipticalArc *arc1 = circle1.arc(sol, 0.5*(sol+B[i].at0()), B[i].at0(), true); if (arc0) { build_from_sbasis(pb,arc0->toSBasis(), tol, false); -- cgit v1.2.3