public bool Build_medial_tree(Medial_branch tree, double sample_step, double general_tolerance, Point2F startpoint, double min_dist_to_wall, bool startpoint_is_a_hint) { List <Point2F> samples = Get_samples(sample_step); Logger.log("got {0} points", samples.Count); return(Medial_builder.Build(tree, this, samples, general_tolerance, startpoint, min_dist_to_wall, startpoint_is_a_hint)); }
public static bool Build(Medial_branch root, Topographer topo, List <Point2F> samples, double general_tolerance, Point2F startpoint, double min_dist_to_wall, bool startpoint_is_a_hint) { List <Line2F> medial_axis_segments = get_medial_axis_segments(topo, samples, general_tolerance); Logger.log("analyzing segments"); Segpool pool = new Segpool(medial_axis_segments.Count, general_tolerance); Point2F tree_start; if (startpoint.IsUndefined) { tree_start = prepare_segments_w_auto_startpoint(topo, medial_axis_segments, pool, min_dist_to_wall); } else if (startpoint_is_a_hint) { tree_start = prepare_segments_w_hinted_starpoint(topo, medial_axis_segments, pool, min_dist_to_wall, general_tolerance, startpoint); } else { tree_start = prepare_segments_w_manual_starpoint(topo, medial_axis_segments, pool, min_dist_to_wall, general_tolerance, startpoint); } if (tree_start.IsUndefined) { Logger.warn("failed to choose tree start point"); return(false); } Logger.log("done analyzing segments"); Logger.log("got {0} hashes", pool.N_hashes); if (!(startpoint.IsUndefined || startpoint_is_a_hint)) { root.Add_point(startpoint); } root.Add_point(tree_start); build_tree(root, pool, general_tolerance); return(true); }
private static void build_branch(Medial_branch me, Segpool pool, double min_branch_len) { Point2F running_end = me.End; List <Point2F> followers; while (true) { followers = pool.Pull_follow_points(running_end); if (followers.Count != 1) { break; } running_end = followers[0]; me.Add_point(running_end); // continuation } if (followers.Count == 0) { return; // end of branch, go out } foreach (Point2F pt in followers) { Medial_branch b = me.Spawn_child(); b.Add_point(running_end); b.Add_point(pt); build_branch(b, pool, min_branch_len); if (b.Deep_distance > min_branch_len) // attach only 'long enough' { b.Attach_to_parent(); } else { Logger.log("skipping short branch"); } } me.Postprocess(); }
private static void build_tree(Medial_branch root, Segpool pool, double min_branch_len) { // this will build tree recursively build_branch(root, pool, min_branch_len); }