private void btnClipLines_Click(object sender, EventArgs e) { var newLines = new List <Tuple <PointF, PointF> >(); foreach (var line in _lines) { var p1 = line.Item1; var p2 = line.Item2; var clipped = CohenSutherland.ClipSegment(_bounds, p1, p2); if (clipped != null) { newLines.Add(clipped); } } _lines = newLines; splitContainer1.Panel2.Invalidate(); }
public Tuple <PointF, PointF> GetClippedEnds(Rectangle bounds) { Site vertex0, vertex1; var xmin = bounds.X; var ymin = bounds.Y; var xmax = bounds.Right; var ymax = bounds.Bottom; float x0, x1, y0, y1; if (Math.Abs(A - 1.0) < Double.Epsilon && B >= 0.0) { vertex0 = RightVertex; vertex1 = LeftVertex; } else { vertex0 = LeftVertex; vertex1 = RightVertex; } if (Math.Abs(A - 1.0) < Double.Epsilon) { y0 = ymin; if (vertex0 != null && vertex0.Y > ymin) { y0 = vertex0.Y; } if (y0 > ymax) { return(null); } x0 = C - B * y0; y1 = ymax; if (vertex1 != null && vertex1.Y < ymax) { y1 = vertex1.Y; } if (y1 < ymin) { return(null); } x1 = C - B * y1; if ((x0 > xmax && x1 > xmax) || (x0 < xmin && x1 < xmin)) { return(null); } if (x0 > xmax) { x0 = xmax; y0 = (C - x0) / B; } else if (x0 < xmin) { x0 = xmin; y0 = (C - x0) / B; } if (x1 > xmax) { x1 = xmax; y1 = (C - x1) / B; } else if (x1 < xmin) { x1 = xmin; y1 = (C - x1) / B; } } else { x0 = xmin; if (vertex0 != null && vertex0.X > xmin) { x0 = vertex0.X; } if (x0 > xmax) { return(null); } y0 = C - A * x0; x1 = xmax; if (vertex1 != null && vertex1.X < xmax) { x1 = vertex1.X; } if (x1 < xmin) { return(null); } y1 = C - A * x1; if ((y0 > ymax && y1 > ymax) || (y0 < ymin && y1 < ymin)) { return(null); } if (y0 > ymax) { y0 = ymax; x0 = (C - y0) / A; } else if (y0 < ymin) { y0 = ymin; x0 = (C - y0) / A; } if (y1 > ymax) { y1 = ymax; x1 = (C - y1) / A; } else if (y1 < ymin) { y1 = ymin; x1 = (C - y1) / A; } } var clipped = CohenSutherland.ClipSegment(bounds, new PointF(x0, y0), new PointF(x1, y1)); //Console.WriteLine("cl {0} {1} {2} {3}", x0, y0, x1, y1); return((vertex0 == LeftVertex) ? new Tuple <PointF, PointF>(clipped.Item1, clipped.Item2) : new Tuple <PointF, PointF>(clipped.Item2, clipped.Item1)); }