Advertisement
Guest User

Liang-Barsky C#

a guest
Jun 8th, 2011
2,416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.95 KB | None | 0 0
  1. internal sealed class LiangBarskyClipping : IClippingAlgorithm
  2. {
  3.     private Vector2 _clipMin, _clipMax;
  4.  
  5.     public IEnumerable<Vector2> GetBoundingPolygon()
  6.     {
  7.         yield return _clipMin;
  8.         yield return new Vector2(_clipMax.X, _clipMin.Y);
  9.         yield return _clipMax;
  10.         yield return new Vector2(_clipMin.X, _clipMax.Y);
  11.     }
  12.  
  13.     public void SetBoundingRectangle(Vector2 start, Vector2 end)
  14.     {
  15.         _clipMin = start;
  16.         _clipMax = end;
  17.     }
  18.  
  19.     public void SetBoundingPolygon(IEnumerable<Vector2> points)
  20.     {
  21.         throw new NotSupportedException("see Capabilities =)");
  22.     }
  23.  
  24.     private delegate bool ClippingHandler(float p, float q);
  25.  
  26.     public bool ClipLine(ref Line line)
  27.     {
  28.         Vector2 P = line.End - line.Start;
  29.         float tMinimum = 0, tMaximum = 1;
  30.  
  31.         ClippingHandler pqClip = delegate(float directedProjection,
  32.         float directedDistance)
  33.         {
  34.             if (directedProjection == 0)
  35.             {
  36.                 if (directedDistance < 0)
  37.                     return false;
  38.             }
  39.             else
  40.             {
  41.                 float amount = directedDistance / directedProjection;
  42.                 if (directedProjection < 0)
  43.                 {
  44.                     if (amount > tMaximum)
  45.                         return false;
  46.                     else if (amount > tMinimum)
  47.                         tMinimum = amount;
  48.                 }
  49.                 else
  50.                 {
  51.                     if (amount < tMinimum)
  52.                         return false;
  53.                     else if (amount < tMaximum)
  54.                         tMaximum = amount;
  55.                 }
  56.             }
  57.             return true;
  58.         };
  59.  
  60.         if (pqClip(-P.X, line.Start.X - _clipMin.X))
  61.         {
  62.             if (pqClip(P.X, _clipMax.X - line.Start.X))
  63.             {
  64.                 if (pqClip(-P.Y, line.Start.Y - _clipMin.Y))
  65.                 {
  66.                     if (pqClip(P.Y, _clipMax.Y - line.Start.Y))
  67.                     {
  68.                         if (tMaximum < 1)
  69.                         {
  70.                             line.End.X = line.Start.X + tMaximum * P.X;
  71.                             line.End.Y = line.Start.Y + tMaximum * P.Y;
  72.                         }
  73.                         if (tMinimum > 0)
  74.                         {
  75.                             line.Start.X += tMinimum * P.X;
  76.                             line.Start.Y += tMinimum * P.Y;
  77.                         }
  78.                         return true;
  79.                     }
  80.                 }
  81.             }
  82.         }
  83.         return false;
  84.     }
  85.  
  86.     public ClippingCapabilities Capabilities
  87.     {
  88.         get
  89.         {
  90.             return ClippingCapabilities.RectangleWindow;
  91.         }
  92.     }
  93.  
  94.     public override string ToString()
  95.     {
  96.         return "Liang-Barsky algorithm";
  97.     }
  98. }
  99. // This code was implemented by Grishul Eugeny as part of preparation
  100. // to exam in ITMO university
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement