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); }