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(); } } } }