// with the manual startpoint, which is a hint private static Point2F prepare_segments_w_hinted_starpoint(Topographer topo, List <Line2F> segments, Segpool pool, double min_dist_to_wall, double general_tolerance, Point2F startpoint) { // same as automatic, but seek the segment with the closest end to startpoint double min_dist = double.MaxValue; Point2F tree_start = Point2F.Undefined; foreach (Line2F seg in segments) { double r1 = topo.Get_dist_to_wall(seg.p1); double r2 = topo.Get_dist_to_wall(seg.p2); if (r1 >= min_dist_to_wall) { pool.Add(seg, false); double dist = startpoint.DistanceTo(seg.p1); if (dist < min_dist) { min_dist = dist; tree_start = seg.p1; } } if (r2 >= min_dist_to_wall) { pool.Add(seg, true); double dist = startpoint.DistanceTo(seg.p2); if (dist < min_dist) { min_dist = dist; tree_start = seg.p2; } } } return(tree_start); }
// with the manual startpoint private static Point2F prepare_segments_w_manual_starpoint(Topographer topo, List <Line2F> segments, Segpool pool, double min_dist_to_wall, double general_tolerance, Point2F startpoint) { // same as automatic, but seek the segment with the closest end to startpoint if (!topo.Is_line_inside_region(new Line2F(startpoint, startpoint), general_tolerance)) { Logger.warn("startpoint is outside the pocket"); return(Point2F.Undefined); } if (topo.Get_dist_to_wall(startpoint) < min_dist_to_wall) { Logger.warn("startpoint radius < tool radius"); return(Point2F.Undefined); } double min_dist = double.MaxValue; Point2F tree_start = Point2F.Undefined; foreach (Line2F seg in segments) { double r1 = topo.Get_dist_to_wall(seg.p1); double r2 = topo.Get_dist_to_wall(seg.p2); if (r1 >= min_dist_to_wall) { pool.Add(seg, false); double dist = startpoint.DistanceTo(seg.p1); if (dist < min_dist && topo.Is_line_inside_region(new Line2F(startpoint, seg.p1), general_tolerance)) { min_dist = dist; tree_start = seg.p1; } } if (r2 >= min_dist_to_wall) { pool.Add(seg, true); double dist = startpoint.DistanceTo(seg.p2); if (dist < min_dist && topo.Is_line_inside_region(new Line2F(startpoint, seg.p2), general_tolerance)) { min_dist = dist; tree_start = seg.p2; } } } return(tree_start); }
private static Point2F prepare_segments_w_auto_startpoint(Topographer topo, List <Line2F> segments, Segpool pool, double min_dist_to_wall) { // segments are analyzed for mic radius from both ends. passed segmens are inserted in segpool // hashed by one or both endpoints. if endpoint is not hashed, segment wouldn't be followed // from that side, preventing formation of bad tree. // segments are connected later in a greedy fashion, hopefully forming a medial axis covering all // pocket. // start segment is the one with the largest mic double max_r = double.MinValue; Point2F tree_start = Point2F.Undefined; foreach (Line2F seg in segments) { double r1 = topo.Get_dist_to_wall(seg.p1); double r2 = topo.Get_dist_to_wall(seg.p2); if (r1 >= min_dist_to_wall) { pool.Add(seg, false); if (r1 > max_r) { max_r = r1; tree_start = seg.p1; } } if (r2 >= min_dist_to_wall) { pool.Add(seg, true); if (r2 > max_r) { max_r = r2; tree_start = seg.p2; } } } return(tree_start); }
private double get_mic_radius(Point2F pt) { return(_topo.Get_dist_to_wall(pt) - _tool_r - _margin); }