public static bool LineSegmentsIntersect(CartezianLine line1, CartezianLine line2)
 {
     return(
         ((line2.pointB.y - line1.pointA.y) * (line2.pointA.x - line1.pointA.x) > (line2.pointA.y - line1.pointA.y) * (line2.pointB.x - line1.pointA.x)) !=
         ((line2.pointB.y - line1.pointB.y) * (line2.pointA.x - line1.pointB.x) > (line2.pointA.y - line1.pointB.y) * (line2.pointB.x - line1.pointB.x)) &&
         ((line2.pointA.y - line1.pointA.y) * (line1.pointB.x - line1.pointA.x) > (line1.pointB.y - line1.pointA.y) * (line2.pointA.x - line1.pointA.x)) !=
         ((line2.pointB.y - line1.pointA.y) * (line1.pointB.x - line1.pointA.x) > (line1.pointB.y - line1.pointA.y) * (line2.pointB.x - line1.pointA.x)));
 }
    public static bool IsAngleLessThan(CartezianLine line1, CartezianLine line2, float minAngle)
    {
        double theta1 = Math.Atan2(line1.pointA.y - line1.pointB.y, line1.pointA.x - line1.pointB.x);
        double theta2 = Math.Atan2(line2.pointA.y - line2.pointB.y, line2.pointA.x - line2.pointB.x);
        double diff   = Math.Abs(theta1 - theta2);
        double angle  = Math.Min(diff, Math.Abs(180 - diff));

        return(angle < minAngle);
    }
    void GenerateLanes()
    {
        foreach (Node node in graph.Vertices)
        {
            IOrderedEnumerable <Node> orderedNodes    = graph.Vertices.OrderBy(nodeToOrder => CartezianPosition.CalculateDistance(node.position, nodeToOrder.position));
            IEnumerator <Node>        enumeratorNodes = orderedNodes.GetEnumerator();
            enumeratorNodes.MoveNext();
            enumeratorNodes.MoveNext();
            if (CartezianPosition.CalculateDistance(enumeratorNodes.Current.position, node.position) > galaxy.maxDistanceBetweenNodesToConnect)
            {
                Node     reference = enumeratorNodes.Current;
                Starlane newEdge   = new Starlane(node, reference);
                graph.AddEdge(newEdge);
                edgeCosts.Add(newEdge, CartezianPosition.CalculateDistance(enumeratorNodes.Current.position, node.position));
                //node.starlanes.Add(new Starlane(new CartezianLine(node.position,orderedNodes.ElementAt(1).position),node, orderedNodes.ElementAt(1)));
                //orderedNodes.ElementAt(1).starlanes.Add(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(1).position), orderedNodes.ElementAt(1), node));
                //graph.AddEdge(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(1).position), node, orderedNodes.ElementAt(1)));
                //graph.AddEdge(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(1).position), orderedNodes.ElementAt(1), node));
            }
            else
            {
                for (int j = 1; j < 6; j++)
                {
                    if (graph.AdjacentEdges(node).Count() < galaxy.maxConnectionsPerNode && graph.AdjacentEdges(enumeratorNodes.Current).Count() < galaxy.maxConnectionsPerNode)
                    {
                        bool foundIntersection = false;

                        foreach (Node linkNode in graph.AdjacentVertices(enumeratorNodes.Current))
                        {
                            foreach (Node linkOfLinkNode in graph.AdjacentVertices(linkNode))
                            {
                                if (CartezianLine.LineSegmentsIntersect(new CartezianLine(node.position, enumeratorNodes.Current.position), new CartezianLine(linkNode.position, linkOfLinkNode.position)))
                                {
                                    foundIntersection = true;
                                }
                            }
                        }
                        foreach (Node linkNode in graph.AdjacentVertices(node))
                        {
                            foreach (Node linkOfLinkNode in graph.AdjacentVertices(linkNode))
                            {
                                if (CartezianLine.LineSegmentsIntersect(new CartezianLine(node.position, enumeratorNodes.Current.position), new CartezianLine(linkNode.position, linkOfLinkNode.position)))
                                {
                                    foundIntersection = true;
                                }
                            }
                        }

                        if (foundIntersection == false)
                        {
                            Node     reference = enumeratorNodes.Current;
                            Starlane newEdge   = new Starlane(node, reference);
                            graph.AddEdge(newEdge);
                            edgeCosts.Add(newEdge, CartezianPosition.CalculateDistance(enumeratorNodes.Current.position, node.position));
                            //node.starlanes.Add(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(j).position), node, orderedNodes.ElementAt(j)));
                            //orderedNodes.ElementAt(j).starlanes.Add(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(j).position), orderedNodes.ElementAt(j), node));
                            //graph.AddEdge(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(j).position), node, orderedNodes.ElementAt(j)));
                            //graph.AddEdge(new Starlane(new CartezianLine(node.position, orderedNodes.ElementAt(j).position), orderedNodes.ElementAt(j), node));
                        }
                    }
                    enumeratorNodes.MoveNext();
                }
            }
        }
    }