bool VglPlus::mergeTwolineSegmentOnALine(const vgl_line_segment_2d<double> & seg1, const vgl_line_segment_2d<double> & seg2, vgl_line_segment_2d<double> & merged_seg) { double cosVal = fabs(cos_angle(seg1.direction(), seg2.direction())); if (cosVal < cos(5.0/180.0*vnl_math::pi)) { return false; } double dis_max = -1.0; vcl_vector<vgl_point_2d<double> > pts; pts.push_back(seg1.point1()); pts.push_back(seg1.point2()); pts.push_back(seg2.point1()); pts.push_back(seg2.point2()); // loop all combination and choose the longest one for (int i = 0; i<pts.size(); i++) { for (int j = i+1; j<pts.size(); j++) { double dis = vgl_distance(pts[i], pts[j]); if (dis > dis_max) { dis_max = dis; merged_seg = vgl_line_segment_2d<double>(pts[i], pts[j]); } } } return true; }
void VglPlus::parallelMove(const vgl_line_segment_2d<double> & initSeg, double distance, vgl_line_segment_2d<double> & seg1, vgl_line_segment_2d<double> & seg2) { // CCW rotated vgl_vector_2d<double> orthDir = rotated(initSeg.direction(), vnl_math::pi/2.0); orthDir = normalize(orthDir); vgl_point_2d<double> p1 = initSeg.point1(); vgl_point_2d<double> p2 = initSeg.point2(); vgl_vector_2d<double> dp = distance * orthDir; vgl_point_2d<double> p3(p1.x() + dp.x(), p1.y() + dp.y()); vgl_point_2d<double> p4(p2.x() + dp.x(), p2.y() + dp.y()); seg1 = vgl_line_segment_2d<double>(p3, p4); dp = -1.0 * dp; vgl_point_2d<double> p5(p1.x() + dp.x(), p1.y() + dp.y()); vgl_point_2d<double> p6(p2.x() + dp.x(), p2.y() + dp.y()); seg2 = vgl_line_segment_2d<double>(p5, p6); }