int64_t WallOverlapComputation::handlePotentialOverlap(const ListPolyIt from_it, const ListPolyIt to_it, const ProximityPointLink& to_link, const ListPolyIt from_other_it, const ListPolyIt to_other_it) { if (from_it == to_other_it && from_it == from_other_it) { // don't compute overlap with a line and itself return 0; } const ProximityPointLink* from_link = overlap_linker.getLink(from_it, from_other_it); if (!from_link) { return 0; } if (!getIsPassed(to_link, *from_link)) { // check whether the segment is already passed setIsPassed(to_link, *from_link); return 0; } return getApproxOverlapArea(from_it.p(), to_it.p(), to_link.dist, to_other_it.p(), from_other_it.p(), from_link->dist); }
void WallOverlapComputation::findOverlapPoints(ListPolyIt from_it, unsigned int to_list_poly_idx, ListPolygon::iterator start) { ListPolygon& to_list_poly = list_polygons[to_list_poly_idx]; Point& from = from_it.p(); ListPolygon::iterator last_it = to_list_poly.end(); last_it--; for (ListPolygon::iterator it = start; it != to_list_poly.end(); ++it) { Point& last_point = *last_it; Point& point = *it; if (from == last_point || from == point ) { // we currently consider a linesegment directly connected to [from] last_point = point; continue; } Point closest = getClosestOnLine(from, last_point, point); int64_t dist2 = vSize2(closest - from); if (dist2 > lineWidth * lineWidth) { // line segment too far away to have overlap last_point = point; continue; } int64_t dist = sqrt(dist2); if (closest == last_point) { addOverlapPoint(from_it, ListPolyIt(to_list_poly, last_it), dist); } else if (closest == point) { addOverlapPoint(from_it, ListPolyIt(to_list_poly, it), dist); } else { ListPolygon::iterator new_it = to_list_poly.insert(it, closest); addOverlapPoint(from_it, ListPolyIt(to_list_poly, new_it), dist); } last_point = point; } }