Алгоритмы рисования линии в направлении прямоугольника, но заканчивающиеся непосредственно перед прямоугольником - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть два квадрата, и я хочу нарисовать линию между ними, но линии должны заканчиваться непосредственно перед достижением периметра прямоугольника. Посмотрите на рисунок ниже, чтобы понять, что я имею в виду. Если вы продолжите линии, они будут исходить из центра каждого квадрата. У меня вопрос: есть ли стандартный способ решения этой проблемы в компьютерной графике?

enter image description here

В прошлом я рисовал невидимый прямоугольник большего размера. вокруг видимого прямоугольника, а затем найдите, какой край невидимого прямоугольника пересекает линия. Я использую точки пересечения в качестве начальной и конечной координат, чтобы нарисовать линию. Мне также нужна одна из точек пересечения, на которой можно нарисовать стрелку, но я знаю, как это сделать, учитывая наклон линии et c. Это означает, что я не могу просто нарисовать линию от центра к центру, а затем нарисовать прямоугольники сверху. Если нет лучшего способа, я использую то, что я делаю в настоящее время.

1 Ответ

1 голос
/ 19 апреля 2020
  1. математический подход

    Вы можете просто вычислить конечные точки линии. Так что просто переведите его внутрь через пересеченную часть прямоугольника и + некоторое расстояние между ними. для выровненного по оси прямоугольника должно быть довольно просто математика

    sketch

    , поэтому первая конечная точка E может быть вычислена так:

    a = rectangle A width
    d = B-A; // line direction
    C = A + d*dot( d , (0,a/2) );
    E = C + gap*d/|d|;
    

    другая конечная точка может быть выполнена аналогичным образом. Вам просто нужно знать, с какой стороны проходит линия. Так что выберите ту, для которой это точка >=0, но минимальная:

    dot( d , (0,+a/2) )
    dot( d , (0,-a/2) )
    dot( d , (+b/2,0) )
    dot( d , (-b/2,0) )
    

    , где b - высота прямоугольника ... поэтому, если сложить вместе:

    a = rectangle A width
    b = rectangle A height
    t = 1.0;
    d = B-A; // line direction
    x = dot( d , (0,+a/2) ); if ((x>=0)&&(x<t)) t=x;
    x = dot( d , (0,-a/2) ); if ((x>=0)&&(x<t)) t=x;
    x = dot( d , (+b/2,0) ); if ((x>=0)&&(x<t)) t=x;
    x = dot( d , (-b/2,0) ); if ((x>=0)&&(x<t)) t=x;
    C = A + d*t;
    E = C + gap*d/|d|;
    
  2. графический подход

    1. линия рендеринга
    2. рендеринг увеличенных прямоугольников с помощью промежутка, заполненного только цветом фона
    3. рендеринг ваших прямоугольников

    этот подход мерцает, поэтому вам нужно использовать любой метод обратной / двойной буферизации. Это также медленнее, поскольку нужно визуализировать прямоугольники дважды во время выполнения. Кроме того, линия обрезается стороной прямоугольника, поэтому если это толстая линия, она может выглядеть не так, как ожидалось

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