public VectorPath(VectorPath vp)
 {
     list = new List <Vector>(vp.list.Count);
     for (int i = 0; i < vp.list.Count; i++)
     {
         list.Add(vp.list[i]);
     }
 }
            private void findPath(int from, int to, List <VectorLine> lines, List <VectorPath> vp)
            {
                VectorPath tp     = new VectorPath();
                List <int> startl = new List <int>();

                tp.addPoint(lines[from].A);
                startl.Add(from);
                tracePath(from, to, lines, vp, tp, startl);
            }
            private void tracePath(int from, int to, List <VectorLine> lines, List <VectorPath> vp, VectorPath start, List <int> startl)
            {
                if (from == to)
                {
                    // On the final line
                    VectorPath ep = new VectorPath(start);
                    ep.addPoint(lines[to].B);
                    vp.Add(ep);
                    return;
                }

                // Check for intersections
                for (int i = 0; i < lines.Count; i++)
                {
                    if ((i != from) && (startl.IndexOf(i) < 0))
                    {
                        Vector ip = Vector.Zero;
                        if (VectorLine.intersect(lines[from], lines[i], ref ip))
                        {
                            // Lines intersect!
                            bool isavalidline = true;
                            if (isavalidline && (startl.Count > 1) && _VA.nonZero && _VA.inside(ip))
                            {
                                isavalidline = false;
                            }
                            if (isavalidline && _VB.nonZero && _VB.inside(ip))
                            {
                                isavalidline = false;
                            }
                            VectorLine nl = new VectorLine(start.list.Last(), ip, VectorLine.LineType.AB);
                            if (isavalidline && (startl.Count > 1) && _VA.nonZero && _VA.Intersects(nl))
                            {
                                isavalidline = false;
                            }
                            if (isavalidline && _VB.nonZero && _VB.Intersects(nl))
                            {
                                isavalidline = false;
                            }
                            if (isavalidline)
                            {
                                VectorPath ep      = new VectorPath(start);
                                List <int> startlx = new List <int>(startl);
                                startlx.Add(i);
                                ep.addPoint(ip);
                                tracePath(i, to, lines, vp, ep, startlx);
                            }
                        }
                    }
                }
            }
 private void fallback()
 {
     if (_A == _B)
     {
         return;           // This is no line
     }
     pointlist = new VectorPath();
     pointlist.addPoint(_A);
     if (_Adir.nonZero)
     {
         pointlist.addPoint(_A + _Adir * _stdgapA);
     }
     if (_Bdir.nonZero)
     {
         pointlist.addPoint(_B + _Bdir * _stdgapB);
     }
     pointlist.addPoint(_B);
     valid = true;
 }
            private void calcConnection(Graphics g, Pen q)
            {
                try
                {
                    if (_A == _B)
                    {
                        return;           // No Line
                    }

                    /*
                     * VectorLine LA = new VectorLine(new Vector(0, 20), new Vector(10, 20), VectorLine.LineType.Infinite);
                     * VectorLine LB = new VectorLine(new Vector(10, 0), new Vector(10, 50), VectorLine.LineType.Infinite);
                     * Vector ip = Vector.Zero;
                     * VectorLine.intersect(LA, LB, ref ip);
                     */

                    List <VectorLine> vl = new List <VectorLine>();
                    int[]             sp;
                    int[]             ep;
                    if (_Adir.isZero)
                    {
                        sp = new int[4] {
                            vl.Count, vl.Count + 1, vl.Count + 2, vl.Count + 3
                        };
                        vl.Add(new VectorLine(_A, _A + Vector.X, VectorLine.LineType.AInf));
                        vl.Add(new VectorLine(_A, _A - Vector.X, VectorLine.LineType.AInf));
                        vl.Add(new VectorLine(_A, _A + Vector.Y, VectorLine.LineType.AInf));
                        vl.Add(new VectorLine(_A, _A - Vector.Y, VectorLine.LineType.AInf));
                    }
                    else
                    {
                        Vector p = _A + _Adir * _stdgapA;
                        sp = new int[1] {
                            vl.Count
                        };
                        vl.Add(new VectorLine(_A, p, VectorLine.LineType.AInf));
                        //vl.Add(new VectorLine(p, p + _Adir, VectorLine.LineType.AInf));
                        //vl.Add(new VectorLine(p, p + _Adir.vrot90(), VectorLine.LineType.AInf));
                        //vl.Add(new VectorLine(p, p + _Adir.vrot270(), VectorLine.LineType.AInf));
                    }
                    if (_Bdir.isZero)
                    {
                        ep = new int[4] {
                            vl.Count, vl.Count + 1, vl.Count + 2, vl.Count + 3
                        };
                        vl.Add(new VectorLine(_B - Vector.X, _B, VectorLine.LineType.InfB));
                        vl.Add(new VectorLine(_B - Vector.X, _B, VectorLine.LineType.InfB));
                        vl.Add(new VectorLine(_B - Vector.Y, _B, VectorLine.LineType.InfB));
                        vl.Add(new VectorLine(_B - Vector.Y, _B, VectorLine.LineType.InfB));
                    }
                    else
                    {
                        Vector p = _B + _Bdir * _stdgapB;
                        ep = new int[1] {
                            vl.Count
                        };
                        vl.Add(new VectorLine(p, _B, VectorLine.LineType.InfB));
                        //vl.Add(new VectorLine(p, p + _Bdir, VectorLine.LineType.AInf));
                        //vl.Add(new VectorLine(p, p + _Bdir.vrot90(), VectorLine.LineType.AInf));
                        //vl.Add(new VectorLine(p, p + _Bdir.vrot270(), VectorLine.LineType.AInf));
                    }
                    if (_VA.nonZero)
                    {
                        // Add four Lines surrounding the rectangle
                        vl.Add(_VA.LineAbove(_stdgapA));
                        vl.Add(_VA.LineBelow(_stdgapA));
                        vl.Add(_VA.LineLeft(_stdgapA));
                        vl.Add(_VA.LineRight(_stdgapA));
                    }
                    if (_VB.nonZero && (_VB == _VA))
                    {
                        _VB = new VectorRect();
                    }
                    if (_VB.nonZero)
                    {
                        // Add four Lines surrounding the rectangle
                        vl.Add(_VB.LineAbove(_stdgapB));
                        vl.Add(_VB.LineBelow(_stdgapB));
                        vl.Add(_VB.LineLeft(_stdgapB));
                        vl.Add(_VB.LineRight(_stdgapB));
                    }

                    /*
                     * for (int i=0;i<vl.Count;i++)
                     * {
                     *  vl[i].draw(g, q);
                     * }
                     * for (int i=0;i<vl.Count-1;i++)
                     *  for (int j=i+1;j<vl.Count;j++)
                     *  {
                     *      Vector vi = Vector.Zero;
                     *      if (VectorLine.intersect(vl[i],vl[j],ref vi))
                     *      {
                     *          g.DrawEllipse(q, VectorRect.FromCenterSize(vi, Vector.V(6, 6)).rectangle);
                     *      }
                     *  }
                     */

                    VectorPath vp = findPath(sp, ep, vl);
                    if (vp != null)
                    {
                        pointlist = vp;
                        valid     = true;
                    }
                    else
                    {
                        fallback();
                    }
                }
                catch (Exception e)
                {
                    fallback();
                }
            }