public void RoadPosition(Vector3 position, ICollection <NetworkItem> possibleItems, out NetworkLane networkLane, out NetworkItem networkItem) { var currentPosition = MMKExtensions.ToVector2(position); float minimalDistance = float.MaxValue; networkItem = null; networkLane = null; // Traverse all lanes and find the nearest foreach (NetworkItem item in possibleItems) { foreach (NetworkLane lane in item.GetAllLanes()) { List <Vector3> vertices = lane.vertices; for (int i = 0; i < vertices.Count - 1; i++) { var laneA = MMKExtensions.ToVector2(vertices [i]); var laneB = MMKExtensions.ToVector2(vertices [i + 1]); float currentDistance = Mathf.Abs(MMKExtensions.DistanceLineToPoint(laneA, laneB, currentPosition, true)); if (currentDistance < minimalDistance) { minimalDistance = currentDistance; networkLane = lane; networkItem = item; } } } } }
private List <Vector3> ExtractRoutePoints(List <NetworkLane> routeLanes, Vector3 start, Vector3 end) { var result = new List <Vector3> (); var startPosition = MMKExtensions.ToVector2(start); var endPosition = MMKExtensions.ToVector2(end); // Traverse all lanes and add their vertices to result; // Start and End lane are processed in the following different way: // We remove all vertices behind the start position and after the // end position. for (int i = 0; i < routeLanes.Count; i++) { var vertices = routeLanes [i].vertices; // Check if we handle the first or last lane if (i == 0 || i == routeLanes.Count - 1) { // If so, make a copy of the lane's vertices vertices = new List <Vector3> (routeLanes [i].vertices); int j; if (i == 0) { for (j = 0; j < vertices.Count - 1; j++) { var laneA = MMKExtensions.ToVector2(vertices [j]); var laneB = MMKExtensions.ToVector2(vertices [j + 1]); if (Vector2.Dot(laneB - laneA, startPosition - laneA) < 0) { break; // Start already is after/at laneA-laneB line } } vertices.RemoveRange(0, j); // Remove all vertices which are behind the start } if (i == routeLanes.Count - 1) { for (j = 0; j < vertices.Count - 1; j++) { var laneA = MMKExtensions.ToVector2(vertices [j]); var laneB = MMKExtensions.ToVector2(vertices [j + 1]); if (Vector2.Dot(laneB - laneA, endPosition - laneA) < 0) { break; // End is already behind/at laneA-laneB line } } vertices.RemoveRange(j, vertices.Count - j); // Remove all vertices which are after the end } } result.AddRange(vertices); } return(result); }