Ignore:
Timestamp:
Sep 19, 2010, 5:16:51 AM (11 years ago)
Author:
matkovic
Message:

-added PowerCollection library
-added QuadTree
-improved path finding performance

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/WorkspaceManager/View/VisualComponents/CryptoLineView/CryptoLineView.cs

    r1926 r1927  
    286286
    287287     
    288         private bool isConnectionPossible(Point p1, Point p2)
     288        private bool isConnectionPossible(Point p1, Point p2, QuadTreeLib.QuadTree<FakeNode> quadTree)
    289289        {
    290290            if (p1.X != p2.X && p1.Y != p2.Y)
    291291                throw new ArgumentException("only 90° allowed");
    292292
     293            System.Drawing.RectangleF queryRect;
    293294            if (p1.Y != p2.Y)
    294295            {
     
    296297                Point down = p2.Y < p1.Y?p1 : p2;
    297298
    298                 Panel parent = (Parent as Panel);
    299                 foreach (var element in parent.Children)
    300                 {
    301                     PluginContainerView plug1 = element as PluginContainerView;
    302                     if (plug1 == null)
    303                         continue;
    304                     Point pos = new Point((plug1.RenderTransform as TranslateTransform).X, (plug1.RenderTransform as TranslateTransform).Y);
    305 
    306                     if (!isBetween(pos.X, pos.X + plug1.ActualWidth, up.X))
    307                         continue;
    308 
    309                     // case 1: one point is inside the plugin
    310                     if (isBetween(pos.Y, pos.Y + plug1.ActualHeight, up.Y) ||
    311                         isBetween(pos.Y, pos.Y + plug1.ActualHeight, down.Y))
    312                     {
    313                         return false;
    314                     }
    315 
    316                     // case 2: goes through
    317                     if (pos.Y > up.Y && pos.Y + plug1.ActualHeight < down.Y)
    318                     {
    319                         return false;
    320                     }
    321                 }
     299                queryRect = new System.Drawing.RectangleF((float)up.X, (float)up.Y, 1, (float)(down.Y - up.Y));
    322300            }
    323301            else
    324302            {
    325303                Point left = p2.X < p1.X ? p2 : p1;
    326                 Point right = p2.X < p1.X ? p1 : p2;
    327 
    328                 Panel parent = (Parent as Panel);
    329                 foreach (var element in parent.Children)
    330                 {
    331                     PluginContainerView plug1 = element as PluginContainerView;
    332                     if (plug1 == null)
    333                         continue;
    334                     Point pos = new Point((plug1.RenderTransform as TranslateTransform).X, (plug1.RenderTransform as TranslateTransform).Y);
    335 
    336                     if (!isBetween(pos.Y, pos.Y + plug1.ActualHeight, left.Y))
    337                         continue;
    338 
    339                     // case 1: one point is inside the plugin
    340                     if(isBetween(pos.X, pos.X + plug1.ActualWidth, left.X) ||
    341                         isBetween(pos.X, pos.X + plug1.ActualWidth, right.X))
    342                     {
    343                         return false;
    344                     }
    345 
    346                     // case 2: goes through
    347                     if(pos.X > left.X && pos.X + plug1.ActualWidth < right.X)
    348                     {
    349                         return false;
    350                     }
    351                 }
    352             }
    353 
    354             return true;
     304                Point right = p2.X < p1.X ? p1 : p2;
     305
     306                queryRect = new System.Drawing.RectangleF((float)left.X, (float)left.Y, (float)(right.X-left.X), 1);
     307            }
     308
     309            return !quadTree.QueryAny(queryRect);
    355310        }
    356311
     
    380335        }
    381336
    382         private bool performOrthogonalPointConnection(Node n1, Point p2, Node n3, List<Node> nodeList)
    383         {
    384             if (isConnectionPossible(n1.Point, p2) && isConnectionPossible(p2, n3.Point))
     337        private bool performOrthogonalPointConnection(Node n1, Point p2, Node n3, List<Node> nodeList, QuadTreeLib.QuadTree<FakeNode> quadTree)
     338        {
     339            if (isConnectionPossible(n1.Point, p2, quadTree) && isConnectionPossible(p2, n3.Point, quadTree))
    385340            {
    386341                Node n2 = new Node() { Point = p2 };
     
    398353        }
    399354
    400         private void performOrthogonalPointConnection(Node p1, Node p2)
    401         {
    402             if (isConnectionPossible(p1.Point, p2.Point))
     355        private void performOrthogonalPointConnection(Node p1, Node p2, QuadTreeLib.QuadTree<FakeNode> quadTree)
     356        {
     357            if (isConnectionPossible(p1.Point, p2.Point, quadTree))
    403358            {
    404359                p1.Vertices.Add(p2);
     
    406361            }
    407362        }
    408 
     363        internal class FakeNode : QuadTreeLib.IHasRect
     364        {
     365            public System.Drawing.RectangleF Rectangle { get; set; }
     366        }
    409367        private void makeOrthogonalPoints()
    410368        {
     
    418376            nodeList.Add(endNode);
    419377
     378            QuadTreeLib.QuadTree<FakeNode> quadTree = new QuadTreeLib.QuadTree<FakeNode>(new System.Drawing.RectangleF(0,0,(float)parent.ActualWidth,(float) parent.ActualHeight));
     379
    420380            foreach (var element in parent.Children)
    421381            {
     
    427387                        nodeList.Add(new Node() { Point = routPoint });
    428388                    }
     389                    quadTree.Insert(new FakeNode() { Rectangle = new System.Drawing.RectangleF((float)(p1.RenderTransform as TranslateTransform).X,
     390                                                                                                (float)(p1.RenderTransform as TranslateTransform).Y,
     391                                                                                                (float)p1.ActualWidth,
     392                                                                                                (float)p1.ActualHeight)});
    429393                }
    430394            }
     
    466430                        p1.Point.Y == p2.Point.Y)
    467431                    {
    468                         performOrthogonalPointConnection(p1, p2);
     432                        performOrthogonalPointConnection(p1, p2, quadTree);
    469433                    }
    470434                    else
     
    472436                        Point help = new Point(p1.Point.X, p2.Point.Y);
    473437
    474                         if (!performOrthogonalPointConnection(p1, help, p2, nodeList))
     438                        if (!performOrthogonalPointConnection(p1, help, p2, nodeList, quadTree ))
    475439                        {
    476440                            help = new Point(p2.Point.X, p1.Point.Y);
    477                             if (!performOrthogonalPointConnection(p1, help, p2, nodeList))
     441                            if (!performOrthogonalPointConnection(p1, help, p2, nodeList, quadTree))
    478442                            {
    479443                                // optional todo: double edge helping routes
Note: See TracChangeset for help on using the changeset viewer.