private void TryFindPerpendicularDistanceB() { //Try to get perpendicular float angleA = Vector3.Angle(MinDistance.Point1 - MinDistance.Point2, altDistance2.Point1 - altDistance2.Point2); float angleB = Vector3.Angle(MinDistance.Point1 - MinDistance.Point2, MinDistance.Point1 - altDistance2.Point1); if (angleB >= 90 || angleA + angleB <= 90) { // No correct perpendicular for this triangle } else { // Correct perpendicular exists float angleAnewRad = (180 - 90 - angleB) * Mathf.Deg2Rad; float distanceB = MinDistance.Distance * Mathf.Cos(angleAnewRad); float distanceA = distanceB * Mathf.Tan(angleAnewRad); Vector3 ship2sideVector = altDistance2.Point1 - MinDistance.Point1; float scale = distanceA / Vector3.Distance(MinDistance.Point1, altDistance2.Point1); Vector3 difference = ship2sideVector * scale; Vector3 nearestPoint = MinDistance.Point1 + difference; minDistancePerpB = new RangeHolder(MinDistance.Point2, nearestPoint); } }
private void FindNearestDistances() { List <RangeHolder> distances = new List <RangeHolder>(); // Check distances from all edges to all edges foreach (var ship1point in Ship1.ShipBase.GetBaseEdges()) { foreach (var ship2point in Ship2.ShipBase.GetBaseEdges()) { distances.Add(new RangeHolder(ship1point.Value, ship2point.Value)); } } distances = distances.OrderBy(n => n.Distance).ToList(); // MinDistance - shortest distance between edges MinDistance = distances.First(); distances.Remove(MinDistance); // Save alternative short distances for perpendicular distance calculations altDistance1 = distances.First(n => n.Point1 == MinDistance.Point1); altDistance2 = distances.First(n => n.Point2 == MinDistance.Point2); }