Пример #1
0
        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;
                        }
                    }
                }
            }
        }
Пример #2
0
        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);
        }