Инвариантные против вариантных координат при изменении ориентации оси - PullRequest
0 голосов
/ 18 декабря 2018

Для алгоритмов, включающих координаты объекта в декартовой системе координат (например, координаты ограниченного интервала в одномерной декартовой системе координат), каковы преимущества или недостатки их выражения в координатах независимо * от ориентации оси (например, x_min и x_max), против в координатах зависит ** от ориентации оси (например, x_left и x_right или, альтернативно, x_left и width)?

Например, для алгоритма, который проверяет, перекрываются ли два ограниченных интервала, вы бы написали

def test_overlap(x_min_1, x_max_1, x_min_2, x_max_2):
    """Test if two bounded intervals overlap.
    Coordinates are independent from axis orientation.
    """
    assert x_min_1 <= x_max_1
    assert x_min_2 <= x_max_2
    return x_min_1 <= x_max_2 and x_min_2 <= x_max_1

или либо

def test_overlap(x_left_1, x_right_1, x_left_2, x_right_2):
    """Test if two bounded intervals overlap.
    Coordinates are dependent on axis orientation.
    """
    assert (x_left_1 <= x_right_1 and x_left_2 <= x_right_2
            or x_left_1 >= x_right_1 and x_left_2 >= x_right_2)

    if x_left_1 <= x_right_1:  # x-axis oriented to the right
        return x_left_1 <= x_right_2 and x_left_2 <= x_right_1
    else:                      # x-axis oriented to the left
        return x_left_1 >= x_right_2 and x_left_2 >= x_right_1

или

# Here the orientation of the x-axis cannot be deduced from the arguments,
# so you need to pass it explicitly to the algorithm.
def test_overlap(x_left_1, width_1, x_left_2, width_2, x_orientation):
    """Test if two bounded intervals overlap.
    Coordinates are dependent on axis orientation.
    """
    assert width_1 >= 0
    assert width_2 >= 0
    assert x_orientation in ["right", "left"]

    if x_orientation == "right":  # x-axis oriented to the right
        x_right_1 = x_left_1 + width_1
        x_right_2 = x_left_2 + width_2
        return x_left_1 <= x_right_2 and x_left_2 <= x_right_1
    else:                         # x-axis oriented to the left
        x_right_1 = x_left_1 - width_1
        x_right_2 = x_left_2 - width_2
        return x_left_1 >= x_right_2 and x_left_2 >= x_right_1

* Координаты указывают конкретную точку и зависят от системы координат.Когда я говорю «координаты, не зависящие от ориентации оси», это означает, что рассматриваемая точка изменяется, чтобы оставить координаты неизменными при изменении ориентации оси.

** КогдаЯ говорю «координаты, зависящие от ориентации оси», это означает, что координаты изменяются, чтобы оставить рассматриваемую точку неизменной при изменении ориентации оси.Это стандартное использование.

1 Ответ

0 голосов
/ 19 декабря 2018

Я не знаю, «лучше» ли это, но способ, которым я сделал это в одном проекте, который работал очень хорошо, заключался в определении class, подобном следующему:

class Interval(object):
    """ Representation of a closed interval.

    "a" & "b" can be any numeric type, or any other type than can be
    compared. If the type can also be incremented by 1, then it
    will be possible to iterate between the two values in
    ascending order.
    """
    def __init__(self, a, b):
        self.lowerbound, self.upperbound = (a, b) if a < b else (b, a)

    def __contains__(self, val):
        return self.lowerbound <= val <= self.upperbound

    # Implemented as a generator (so no 'next' method is needed)
    def __iter__(self):
        nextvalue = self.lowerbound  # Initialize iteration state.
        while nextvalue <= self.upperbound:
            yield nextvalue
            nextvalue += 1

Метод __contains__() контролирует, как выражения типа if x in interval: проверяют значение x по верхним и нижним границам Interval.(В моем собственном приложении я использовал Date s в качестве границ интервала.)

Делая это таким образом, вы получаете контроль над тем, как почти все работает, плюс вы также сможете добавлять к нему специализированные методы при желании.,Например: метод test_overlap() может делать то, что вы хотите, так, как вы решите.Фактически, такой метод мог бы быть написан так, чтобы он возвращал результат как Interval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...