private bool bgriegebri(Vector2 start1, Vector2 end1) { Vector2 intersection = Vector2.zero; for (int i = 0; i < mModules.Count; ++i) { Vector2 start2 = new Vector2(mModules[i].mPosition.x, mModules[i].mPosition.z); Vector2 end2 = new Vector2(mModules[i].End.x, mModules[i].End.z); if (NeroUtilities.LineLineIntersection(start1, end1, start2, end2, out intersection) == true) { return(false); } } return(true); }
private bool TestExtending(RoadModule aRoadModule) { Vector2 closestIntersection = Vector2.one * float.MinValue; float shortestDistance = float.MaxValue; RoadModule intersectedRoad = null; Vector2 start1 = new Vector2(aRoadModule.mPosition.x, aRoadModule.mPosition.z); Vector2 end1 = new Vector2( aRoadModule.mPosition.x + Mathf.Cos(aRoadModule.mDirection * Mathf.Deg2Rad) * aRoadModule.mLength * 1.5f, aRoadModule.mPosition.z + Mathf.Sin(aRoadModule.mDirection * Mathf.Deg2Rad) * aRoadModule.mLength * 1.5f); start1 += (end1 - start1).normalized * 0.001f; Vector2 intersection = Vector2.zero; for (int i = 0; i < mModules.Count; ++i) { Vector2 start2 = new Vector2(mModules[i].mPosition.x, mModules[i].mPosition.z); Vector2 end2 = new Vector2(mModules[i].End.x, mModules[i].End.z); if (NeroUtilities.LineLineIntersection(start1, end1, start2, end2, out intersection) == true) { float distance = Vector2.Distance(start1, intersection); if (distance < shortestDistance) { closestIntersection = intersection; shortestDistance = distance; intersectedRoad = mModules[i]; } } } if (intersectedRoad != null) { aRoadModule.mLength = Vector3.Distance(aRoadModule.mPosition, new Vector3(closestIntersection.x, 0.0f, closestIntersection.y)); mCrossings.Add(aRoadModule.End); Debug.Log("TestExtending -> Creating crossing."); if (aRoadModule.mLength < 0.000001f) { Debug.LogWarning("TestExtending -> Road segment length is 0."); } float originalLength = intersectedRoad.mLength; float newLength = Vector3.Distance(intersectedRoad.mPosition, new Vector3(closestIntersection.x, 0.0f, closestIntersection.y)); intersectedRoad.mLength = newLength; RoadModule newModule = new RoadModule(0, intersectedRoad.End, originalLength - newLength, intersectedRoad.mDirection); mModules.Add(newModule); return(true); } return(false); }
private bool TestCrossing(RoadModule aRoadModule) { Vector2 closestPoint = Vector3.one * float.MinValue; float shortestDistance = float.MaxValue; Vector2 start = new Vector2(aRoadModule.mPosition.x, aRoadModule.mPosition.z); Vector2 end = new Vector2(aRoadModule.End.x, aRoadModule.End.z); Vector2 intersection = Vector2.zero; bool foundIntersection = false; for (int i = 0; i < mCrossings.Count; ++i) { Vector2 crossing = new Vector2(mCrossings[i].x, mCrossings[i].z); if (NeroUtilities.PointCircleIntersection(end, crossing, aRoadModule.mLength * 0.75f) == true) { float distance = Vector2.Distance(end, crossing); if (distance < shortestDistance && bgriegebri(start, crossing) == true) { foundIntersection = true; closestPoint = crossing; shortestDistance = distance; } } } if (foundIntersection == true) { aRoadModule.mLength = Vector2.Distance(start, closestPoint); Vector2 delta = closestPoint - start; aRoadModule.mDirection = Mathf.Atan2(delta.y, delta.x) * Mathf.Rad2Deg; Debug.Log("TestCrossing -> Snapping to crossing."); if (aRoadModule.mLength < 0.000001f) { Debug.LogWarning("TestCrossing -> Road segment length is 0."); } return(true); } return(false); }
private eRoadQueryResult LocalConstraints(RoadModule aRoadModule) { eRoadQueryResult result = eRoadQueryResult.SUCCESS; bool valid = false; int debugID = -1; if (aRoadModule.End.x < -mWorldSize || aRoadModule.End.x > mWorldSize || aRoadModule.End.z < -mWorldSize || aRoadModule.End.z > mWorldSize) { return(eRoadQueryResult.FAIL); } if (TestIntersection(aRoadModule) == true) { result = eRoadQueryResult.SUCCESS_AND_STOP; valid = true; debugID = 1; } if (valid == false && TestCrossing(aRoadModule) == true) { result = eRoadQueryResult.SUCCESS_AND_STOP; valid = true; debugID = 2; } if (valid == false && TestExtending(aRoadModule) == true) { result = eRoadQueryResult.SUCCESS_AND_STOP; valid = true; debugID = 3; } Vector2 start1 = new Vector2(aRoadModule.mPosition.x, aRoadModule.mPosition.z); Vector2 end1 = new Vector2(aRoadModule.End.x, aRoadModule.End.z); for (int i = 0; i < mModules.Count; ++i) { Vector2 start2 = new Vector2(mModules[i].mPosition.x, mModules[i].mPosition.z); Vector2 end2 = new Vector2(mModules[i].End.x, mModules[i].End.z); if ((start1 == start2 && end1 == end2) || (start1 == end2 && start2 == end1)) { valid = false; aRoadModule.mBadRoad = true; Debug.Log("OVERLAPPING ROAD"); } else { ShortenLine(ref start1, ref end1, 0.1f); ShortenLine(ref start2, ref end2, 0.1f); Vector2 intersection = Vector2.zero; if (NeroUtilities.LineLineIntersection(start1, end1, start2, end2, out intersection) == true) { valid = false; aRoadModule.mBadRoad = true; Debug.Log("BAD ROAD"); } } } return(result); }