ClosestPolygonPoint findNearestClosest(Point from, PolygonRef polygon, int start_idx, int direction) { if (polygon.size() == 0) { return ClosestPolygonPoint(polygon); } Point aPoint = polygon[0]; Point best = aPoint; int64_t closestDist = vSize2(from - best); int bestPos = 0; for (unsigned int p = 0; p<polygon.size(); p++) { int p1_idx = (polygon.size() + direction*p + start_idx) % polygon.size(); int p2_idx = (polygon.size() + direction*(p+1) + start_idx) % polygon.size(); Point& p1 = polygon[p1_idx]; Point& p2 = polygon[p2_idx]; Point closestHere = getClosestOnLine(from, p1 ,p2); int64_t dist = vSize2(from - closestHere); if (dist < closestDist) { best = closestHere; closestDist = dist; bestPos = p1_idx; } else { return ClosestPolygonPoint(best, bestPos, polygon); } } return ClosestPolygonPoint(best, bestPos, polygon); }
ClosestPolygonPoint findClosest(Point from, PolygonRef polygon) { if (polygon.size() == 0) { return ClosestPolygonPoint(polygon); } Point aPoint = polygon[0]; Point best = aPoint; int64_t closestDist = vSize2(from - best); int bestPos = 0; // for (unsigned int p = 0; p<polygon.size(); p++) { Point& p1 = polygon[p]; unsigned int p2_idx = p+1; if (p2_idx >= polygon.size()) p2_idx = 0; Point& p2 = polygon[p2_idx]; Point closestHere = getClosestOnLine(from, p1 ,p2); int64_t dist = vSize2(from - closestHere); if (dist < closestDist) { best = closestHere; closestDist = dist; bestPos = p; } } return ClosestPolygonPoint(best, bestPos, polygon); }
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; } }