Тогда вам просто нужно определить, какой из двух полученных ответов дает точку между A и B.
Давайте назовем два результата I1
и I2
.Чтобы определить, какой из них является ответом, необходимо проверить направления векторов A->I1
и A->I2
против A->B
, где A
- точка, расположенная внутри круга:
% line: y = mx + b
m = (yB - yA) / (xB - xA);
b = yA - m * xA;
% circle: x^2 + y^2 = r^2
% intersection: x^2 + (mx + b)^2 = r^2
% ... x^2 + m^2x^2 + b^2 + 2mbx - r^2 = 0
% ... (1 + m^2)x^2 + 2mbx + (b^2 - r^2) = 0
A = 1 + m^2;
B = 2 * m * b;
C = b^2 - r^2;
sqrtD = sqrt(B^2 - 4*A*C);
xI = (-B+sqrtD) / (2*A);
yI = m * xI + b;
if (abs(atan2(yB - yA, xB - xA)-atan2(yI - yA, xI - xA)) > 1e-5)
xI = (-B-sqrtD) / (2*A);
yI = m * xI + b;
end
Замечание # 1: Я не проверял дельту на предмет ее отрицательности, поскольку вы сказали, что одна точка находится внутри круга, а другая - вне его.
Замечание # 2: Вам необходимо покрыть особый случай, где A == B
.
Замечание № 3: Вам необходимо покрыть особый случай, когда xA == xB
.
Замечание # 4: Вы можете выбрать правильный ответ с гораздо меньшими затратами, чем найти наклон двух векторов, рассчитать абсолютную дисперсию между ними и сравнить результат с эпсилоном!:)