Не найдено совпадений между двумя коллекциями System.Windows.Points - PullRequest
0 голосов
/ 10 октября 2011

У меня есть функция, в которой я пытаюсь найти совпадающую точку между 2 наборами по 4 балла в каждой, но иногда функция сообщает, что коллекции не имеют общую точку, даже если в отладчике я вижуделать.Отладчик не показывает мне полную точность точек, поэтому я не вижу разницы?или здесь что-то еще происходит?Вот код для обвинения:

public static Point CorrectForAllowedDrawArea(Point previousDisplayLocation, Point newDisplayLocation, Rect displayLimitedArea, Rect newBoundingBox)
{
    // get area that encloses both rectangles
    Rect enclosingRect = Rect.Union(displayLimitedArea, newBoundingBox);
    // get corners of outer rectangle, index matters for getting opposite corner
    var outsideCorners = new[] { enclosingRect.TopLeft, enclosingRect.TopRight, enclosingRect.BottomRight, enclosingRect.BottomLeft }.ToList();
    // get corners of inner rectangle
    var insideCorners = new[] { displayLimitedArea.TopLeft, displayLimitedArea.TopRight, displayLimitedArea.BottomRight, displayLimitedArea.BottomLeft }.ToList();
    // get the first found corner that both rectangles share
    Point sharedCorner = outsideCorners.FirstOrDefault((corner) => insideCorners.Contains(corner));
    // find the index of the opposite corner
    int oppositeCornerIndex = (outsideCorners.IndexOf(sharedCorner) + 2) % 4;

в последней строке 'sharedCorner' иногда устанавливается в значение по умолчанию (Point), даже если обе коллекции Point имеют общую точку 1.

РЕДАКТИРОВАТЬ: Я должен упомянуть, если я помещаю отладчик обратно в верхнюю часть функции и перезапускаю его все равно не находит точку соответствия.Я должен также упомянуть, что эта функция использует класс Point пространства имен System.Windows и , а не пространства имен System.Drawing!Спасибо за указание на это в комментариях.

1 Ответ

1 голос
/ 10 октября 2011

Нам действительно нужно посмотреть, каково определение insideCorners.Contains(corner), но я подозреваю, что ваша проблема связана с внутренними неточностями с числами с плавающей точкой.

Вы не можете сравнивать два значения с плавающей запятой, как это:

if (a == b)
{
    // Values are equal
}

особенно, если a или b являются расчетными значениями.

Вам необходимо реализовать что-то вроде:

if (Math.Abs(a - b) < some_small_value)
{
    // Values are equal
}
...