1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| clear;close all; A = [1, 3]; B = [-1, 2]; C = [0, 3]; R = -2
if (A(1) - B(1))*(A(1) - B(1)) + (A(2) - B(2))*(A(2) - B(2)) > 4*R*R Res = 'Error'
elseif abs(A(1) - B(1)) <= 1E-15 K1 = 1; K2 = 2*A(1); K3 = A(1)*A(1) + (A(2)*A(2) + B(2)*B(2) - 2*A(2)*B(2))/4 - R*R; O(1) = (-K2 - sqrt(K2*K2 - 4*K1*K3))/(2*K1); AB = B - A; AO = O - A; wedge = AB(1)*AO(2) - AO(1)*AB(2) if sign(wedge) ~= sign(R) O(1) = (-K2 + sqrt(K2*K2 - 4*K1*K3))/(2*K1); end O(2) = (A(2) + B(2))/2; else M = (B(1)*B(1) - A(1)*A(1) + B(2)*B(2) - A(2)*A(2))/(2*B(1)-2*A(1)); N = (B(2) - A(2))/(B(1) - A(1)); K1 = 1 + N*N; K2 = 2*(A(1) - M)*N - 2*A(2); K3 = (A(1) - M)*(A(1) - M) + A(2)*A(2) - R*R; O(2) = (-K2 - sqrt(K2*K2 - 4*K1*K3))/(2*K1); AB = B - A; AO = O - A; wedge = AB(1)*AO(2) - AO(1)*AB(2) if sign(wedge) ~= sign(R) O(2) = (-K2 + sqrt(K2*K2 - 4*K1*K3))/(2*K1); end O(1) = M - N*O(2); end
d = sqrt((C(1)-O(1))*(C(1)-O(1)) + (C(2)-O(2))*(C(2)-O(2))); if d > abs(R) d = d - abs(R) else d = abs(R) - d end
t = 0:0.01:2*pi; t = t'; X(:,1) = abs(R)*cos(t) + O(1); X(:,2) = abs(R)*sin(t) + O(2); figure(1); hold on; plot(A(1),A(2),'*r'); text(A(1),A(2),' A'); plot(B(1),B(2),'*r'); text(B(1),B(2),' B'); plot(C(1),C(2),'*k'); text(C(1),C(2),' C'); plot(O(1),O(2),'*b'); text(O(1),O(2),' O'); plot(X(:,1),X(:,2),':m');
|