Bây giờ có hình thì mới thấy hơi khác với cái mà tôi tưởng tượng trước khi có hình. Nhưng ta đã biết:
- tọa độ của tâm O là (0; 0), tức tâm O nằm ở gốc tọa độ.
- điểm I nằm ở phần tư I của mặt phẳng tọa độ.
- tâm O và O' nằm ở 2 phía khác nhau của đường thẳng l.
- đường tròn O' tiếp xúc với l tại điểm I, tâm O' nằm trên đường thẳng song song với trục Ox và đi qua điểm I.
Theo tôi thì làm như sau ...
Gọi góc OO'A là α, góc IO'O là α'. α và α' đều tính bằng radian. Gọi bán kính đường tròn O' là R, bán kính đường tròn O là r.
TAN(α') = y/(x + R)
=> α' = ATAN(y/(x + R))
Theo định lý cos trong tam giác OO'A có: r² = R² + OO'² - 2*R*OO'*cos(α)
=> cos(α) = (R² + OO'² - r²) / (2*R*OO')
=> α = ACOS((R² + OO'² - r²) / (2*R*OO'))
Góc IO'A = α' + α = ATAN(y/(x + R)) + ACOS((R² + OO'² - r²) / (2*R*OO'))
*
Ta biết rằng góc ở tâm O' có độ lớn 1 radian thì chắn cung có chiều dài bằng bán kính đường tròn, vậy góc IO'A = α' + α chắn cung IA có độ lớn bằng R*(α' + α)
=>
cung_IA = R*(α' + α) = R*ATAN(y/(x + R)) + ACOS((R² + OO'² - r²) / (2*R*OO'))
**
Theo
Pitago thì OO'² = y² + ̣(x + R)² => OO' = √(y² + ̣(x + R)²)
Thay các giá trị OO'² và OO' vào
** ta có:
cung_IA = R*ATAN(y/(x + R)) + ACOS((R² + y² + ̣(x + R)² - r²) / (2*R*√(y² + ̣(x + R)²)))
***
Như vậy
cung_IA là hàm một biến R (x, y, r cho trước).
Công việc:
- Ta chọn giá trị R đủ lớn (hoặc R = r - x)
- Trong vòng lặp FOR giảm dần giá trị R (hoặc tăng dần giá trị R)
- Với mỗi vòng FOR tính giá trị
cung_IA theo công thức
***. Nếu giá trị
cung_IA khác giá trị cung IA cho trước không quá một sai số cho trước (đủ nhỏ) thì kết thức vòng lặp.
Gọi H là chân đường vuông góc hạ từ A xuống IO' ta có:
- HO' = R*cos(α' + α)
****
- AH = R*sin(α' + α)
*****
Tính được R rồi thì tính được α' + α theo
*, và theo
**** tính được HO', theo
***** tính được AH
Tọa độ x của A = x + R - HO'
Tọa độ y của A = -(AH - y)
Hi vọng không nhầm lẫn.
