private void HandleWithPoints(RotationTreeNode p, RotationTreeNode q)
        {
            if (p == null || q == null)
            {
                return;
            }

            if (p.X > q.X)
            {
                return;
            }

            if (p.IsSinglePoint && !q.IsSinglePoint && p.Obstacle == q.Obstacle)
            {
                p.VisibleSegment = q.VisibleSegment;
                //AddEdge(p, q);
            }
            else if (q.IsSinglePoint && !p.IsSinglePoint && q.Obstacle == p.Obstacle)
            {
                //AddEdge(p, q);
            }
            else if (q.IsSinglePoint && p.VisibleSegment != null && q.Obstacle == p.VisibleSegment.Obstacle)
            {
                AddEdge(p, q);
            }
            else if (p.IsAdjacent(q))
            {
                ObstacleSegment higher = GetHigherSegment(q, p);
                p.VisibleSegment = higher ?? q.VisibleSegment;
                if (!SameObstacle(p, q))
                {
                    AddEdge(p, q);
                }
            }
            else if (p.VisibleSegment != null && p.VisibleSegment.Contains(q))
            {
                ObstacleSegment left = GetLeftSegment(q, p);
                p.VisibleSegment = left ?? q.VisibleSegment;
                if (!SameObstacle(p, q))
                {
                    AddEdge(p, q);
                }
            }
            else if (PointLiesNearerThanSegment(p, q))
            {
                p.VisibleSegment = q.IsSinglePoint ? q.VisibleSegment : GetNearerSegment(q, p);
                if (!SameObstacle(p, q))
                {
                    AddEdge(p, q);
                }
            }
        }