public void AddSegment(CartesianSegment aSegment) { if (segments.Count == 0 || CartesianSegment.Approximately(aSegment.p0, segments[segments.Count - 1].p1)) { segments.Add(aSegment); return; } aSegment.FlipPoints(); Contract.Assert(CartesianSegment.Approximately(aSegment.p0, segments[segments.Count - 1].p1), @"Added a segment to an outline that did not have matching end " + "to previous segment, Segments : {0}, {1}", aSegment.ToString(), segments[segments.Count - 1].ToString()); segments.Add(aSegment); }
public void InsertSegmentAtStart(CartesianSegment aSegment) { if (segments.Count == 0 || CartesianSegment.Approximately(aSegment.p1, segments[0].p0)) { segments.Insert(0, aSegment); return; } aSegment.FlipPoints(); Contract.Assert(CartesianSegment.Approximately(aSegment.p1, segments[0].p0), @"Insertion failure. s[0].p1 = {0}, {1}; aSegment.p0 = {0}, {1}", segments[0].p1.x, segments[0].p1.y, aSegment.p0.x, aSegment.p0.x); segments.Insert(0, aSegment); }
public List <Outline> CreateOutlines(List <CartesianSegment> layerSegments, Printer forPrinter) { List <Outline> layerOutlines = new List <Outline>(); List <List <CartesianSegment> > matLines = new List <List <CartesianSegment> >(); for (int mat = 1; mat < 5; mat++) { /// Grab all of the line segments for this material type matLines.Add(CollectMaterialSegments((byte)mat, layerSegments)); if (matLines[mat - 1].Count == 0) { continue; } // Create a quadtree for all of the line segments of mat type QuadTree qt = new QuadTree(matLines[mat - 1]); CartesianSegment currentSegment = null; PrinterExtruder[] extrudersForMaterial = forPrinter.GetExtrudersWithMaterial((byte)mat); float bestDistance = float.MaxValue; foreach (PrinterExtruder pe in extrudersForMaterial) { Vector2 extruderPosition = (Vector2)forPrinter.GetExtruderCartesianPosition(pe); extruderPosition += Vector2.one * forPrinter.platformRadiusInMm; CartesianSegment aSegment = qt.FindSegmentClosestToPoint(extruderPosition); //Debug.Log("Starting search with extruder " + pe.id + " at position " + extruderPosition + " and found best Segment = " + aSegment); if (aSegment != null && ((extruderPosition - aSegment.p0).sqrMagnitude < bestDistance || (extruderPosition - aSegment.p1).sqrMagnitude < bestDistance)) { bestDistance = Mathf.Min((extruderPosition - aSegment.p0).sqrMagnitude, (extruderPosition - aSegment.p1).sqrMagnitude); currentSegment = aSegment; //Debug.LogWarning("Started at ext pos = " + extruderPosition + " and selected " + currentSegment); } } // Make complete outlines by ordering connected segments layerOutlines.Add(new Outline((byte)mat)); if (currentSegment == null) { Text.Warning("Search for closest line segment returned null, grabbing first point in outline, " + qt.segments[0].ToString()); currentSegment = qt.segments[0]; } layerOutlines[layerOutlines.Count - 1].AddSegment(currentSegment); qt.RemoveSegmentFromTree(currentSegment); //Debug.Log("Starting at position " + aStartingPoint + " and found the closest point to be " + currentSegment); while (qt.segments.Count > 0) { CartesianSegment nextSegment = null; if (currentSegment != null) { nextSegment = qt.FindSegmentWithSharedEndPoint(currentSegment); } if (nextSegment != null && (CartesianSegment.Approximately(nextSegment.p0, currentSegment.p1) || CartesianSegment.Approximately(nextSegment.p1, currentSegment.p1))) { // If the quadtree returns a connected segment, add it to the current outline and then search again layerOutlines[layerOutlines.Count - 1].AddSegment(nextSegment); currentSegment = nextSegment; qt.RemoveSegmentFromTree(currentSegment); } else { // Check to see if there are any segments that match the initial segment nextSegment = qt.FindSegmentWithSharedEndPoint(layerOutlines[layerOutlines.Count - 1].segments[0]); if (nextSegment != null) { layerOutlines[layerOutlines.Count - 1].InsertSegmentAtStart(nextSegment); currentSegment = null; qt.RemoveSegmentFromTree(nextSegment); } else // Start a new outline! { currentSegment = qt.FindSegmentClosestToPoint( layerOutlines[layerOutlines.Count - 1].segments[layerOutlines[layerOutlines.Count - 1].segments.Count - 1].p1); if (currentSegment == null) { currentSegment = qt.segments[0]; } layerOutlines.Add(new Outline((byte)mat)); layerOutlines[layerOutlines.Count - 1].AddSegment(currentSegment); qt.RemoveSegmentFromTree(currentSegment); } } } } layerOutlines = CollapseOutlines(layerOutlines); return(layerOutlines); }