double Dist2(const Line2d & g, const Line2d & h ) { double dd = 0.0, d1,d2,d3,d4; Point2d cp = CrossPoint(g,h); if ( Parallel(g,h) || !IsOnLine(g,cp) || !IsOnLine(h,cp) ) { d1 = Dist2(g.P1(),h.P1()); d2 = Dist2(g.P1(),h.P2()); d3 = Dist2(g.P2(),h.P1()); d4 = Dist2(g.P2(),h.P2()); if (d1<d2) d2 = d1; if (d3<d4) d4 = d3; dd = ( d2 < d4 ) ? d2 : d4; } return dd; }
void PGCicrcleTaskPt::Optimize(const ProjPt& prev, const ProjPt& next, double Alt) { if(m_Radius == 0.0){ return; } if (!m_Optimized) { // first run : init m_Optimized with center ... m_Optimized = m_Center; } if (!CrossPoint(prev, next ? next : m_Center, m_Optimized)) { OptimizedDistance Fmin(prev, m_Center, next, m_Radius); double x0 = 0; double d1 = min_newuoa<double, OptimizedDistance > (1, &x0, Fmin, PI, 0.01 / m_Radius); if (m_bExit) { double x1 = x0 + PI; double d2 = min_newuoa<double, OptimizedDistance > (1, &x1, Fmin, PI, 0.01 / m_Radius); x0 = (std::min(d1, d2) == d1) ? x0 : x1; } m_Optimized = ProjPt(m_Center.m_X + m_Radius * cos(x0), m_Center.m_Y + m_Radius * sin(x0)); } }
CircleSeg<D> :: CircleSeg (const GeomPoint<D> & ap1, const GeomPoint<D> & ap2, const GeomPoint<D> & ap3) : p1(ap1), p2(ap2), p3(ap3) { Vec<D> v1,v2; v1 = p1 - p2; v2 = p3 - p2; Point<D> p1t(p1+v1); Point<D> p2t(p3+v2); // works only in 2D!!!!!!!!! Line2d g1t,g2t; g1t.P1() = Point<2>(p1(0),p1(1)); g1t.P2() = Point<2>(p1t(0),p1t(1)); g2t.P1() = Point<2>(p3(0),p3(1)); g2t.P2() = Point<2>(p2t(0),p2t(1)); Point<2> mp = CrossPoint (g1t,g2t); pm(0) = mp(0); pm(1) = mp(1); radius = Dist(pm,StartPI()); Vec2d auxv; auxv.X() = p1(0)-pm(0); auxv.Y() = p1(1)-pm(1); w1 = Angle(auxv); auxv.X() = p3(0)-pm(0); auxv.Y() = p3(1)-pm(1); w3 = Angle(auxv); if ( fabs(w3-w1) > M_PI ) { if ( w3>M_PI ) w3 -= 2*M_PI; if ( w1>M_PI ) w1 -= 2*M_PI; } }