示例#1
0
        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();
        }
示例#2
0
        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));
        }