математический подход
Вы можете просто вычислить конечные точки линии. Так что просто переведите его внутрь через пересеченную часть прямоугольника и + некоторое расстояние между ними. для выровненного по оси прямоугольника должно быть довольно просто математика
, поэтому первая конечная точка 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|;