// TODO: keep dry private int ComputeDistance(TConfiguration configuration1, TConfiguration configuration2) { var distance = roomShapeGeometry.GetCenterDistance(configuration1, configuration2); if (distance < 0) { throw new InvalidOperationException(); } return(distance); }
/// <inheritdoc /> /// <summary> /// Checks if two layouts are different enough by comparing positions of corresponding nodes. /// </summary> public virtual bool AreDifferentEnough(TLayout layout1, TLayout layout2, IList <TNode> chain) { // TODO: make better var diff = 0d; foreach (var node in chain) { if (layout1.GetConfiguration(node, out var c1) && layout2.GetConfiguration(node, out var c2)) { // Changed //diff += (float)(Math.Pow( // 5 * IntVector2.ManhattanDistance(c1.Shape.BoundingRectangle.Center + c1.Position, // c2.Shape.BoundingRectangle.Center + c2.Position) / (float)AverageSize, 2) * (ReferenceEquals(c1.Shape, c2.Shape) ? 1 : 4)); diff += (float)(Math.Pow( 5 * RoomShapeGeometry.GetCenterDistance(c1, c2) / (float)AverageSize, 2) * (ReferenceEquals(c1.RoomShape, c2.RoomShape) ? 1 : 4)); } } diff = diff / (chain.Count()); return(DifferenceFromAverageScale * diff >= 1); }