Exemple #1
0
        public bool ClipLine(ref Vector2 lineStart, ref Vector2 lineEnd)
        {
            Vector2 P = lineEnd - lineStart;
            float   tMinimum = 0, tMaximum = 1;

            ClippingHandler pqClip = delegate(float directedProjection,
                                              float directedDistance)
            {
                if (directedProjection == 0)
                {
                    if (directedDistance < 0)
                    {
                        return(false);
                    }
                }
                else
                {
                    float amount = directedDistance / directedProjection;
                    if (directedProjection < 0)
                    {
                        if (amount > tMaximum)
                        {
                            return(false);
                        }
                        else if (amount > tMinimum)
                        {
                            tMinimum = amount;
                        }
                    }
                    else
                    {
                        if (amount < tMinimum)
                        {
                            return(false);
                        }
                        else if (amount < tMaximum)
                        {
                            tMaximum = amount;
                        }
                    }
                }
                return(true);
            };

            if (pqClip(-P.X, lineStart.X - _clipMin.X))
            {
                if (pqClip(P.X, _clipMax.X - lineStart.X))
                {
                    if (pqClip(-P.Y, lineStart.Y - _clipMin.Y))
                    {
                        if (pqClip(P.Y, _clipMax.Y - lineStart.Y))
                        {
                            if (tMaximum < 1)
                            {
                                lineEnd.X = lineStart.X + tMaximum * P.X;
                                lineEnd.Y = lineStart.Y + tMaximum * P.Y;
                            }
                            if (tMinimum > 0)
                            {
                                lineStart.X += tMinimum * P.X;
                                lineStart.Y += tMinimum * P.Y;
                            }
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
        public bool ClipLine(ref Line line)
        {
            Point P = line.End - (Size)line.Start;
            float tMinimum = 0, tMaximum = 1;

            ClippingHandler pqClip = delegate(float directedProjection,
                                              float directedDistance)
            {
                if (directedProjection == 0)
                {
                    if (directedDistance < 0)
                    {
                        return(false);
                    }
                }
                else
                {
                    float amount = directedDistance / directedProjection;
                    if (directedProjection < 0)
                    {
                        if (amount > tMaximum)
                        {
                            return(false);
                        }
                        else if (amount > tMinimum)
                        {
                            tMinimum = amount;
                        }
                    }
                    else
                    {
                        if (amount < tMinimum)
                        {
                            return(false);
                        }
                        else if (amount < tMaximum)
                        {
                            tMaximum = amount;
                        }
                    }
                }
                return(true);
            };

            if (pqClip(-P.X, line.Start.X - _clipMin.X))
            {
                if (pqClip(P.X, _clipMax.X - line.Start.X))
                {
                    if (pqClip(-P.Y, line.Start.Y - _clipMin.Y))
                    {
                        if (pqClip(P.Y, _clipMax.Y - line.Start.Y))
                        {
                            if (tMaximum < 1)
                            {
                                line.End.X = (int)(line.Start.X + tMaximum * P.X);
                                line.End.Y = (int)(line.Start.Y + tMaximum * P.Y);
                            }
                            if (tMinimum > 0)
                            {
                                line.Start.X = (int)(line.Start.X + tMinimum * P.X);
                                line.Start.Y = (int)(line.Start.Y + tMinimum * P.Y);
                            }
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }