Verificați dacă vreun punct al segmentului aparține unui anumit cerc (presetat) - suprapunere stivă

Buna ziua. Îți cer ajutorul. În general, problema este: pe planul de coordonate, un segment este definit cu originea în punctul A și sfârșitul punctului B. Sunt date cercuri (poate fi și un cerc) cu centrele în punctele M1, M2, M3. M100 și cu raze R1, R2, R3. R100. Este necesar să verificăm dacă un punct al unui segment aparține unui cerc dat (dat).







În general, programul funcționează, dar probabil nu întotdeauna bine. Deja o mulțime au încercat exemplele de testare, totul determină în mod corect. Dar, când trimit soluția la serverul Olimpiadei, serverul spune: "Răspunde greșit". Toți păcătuiesc pe tipuri. Puteți să vă ajutați?

Figura prezintă două cazuri de neintersecție de către un segment dintr-un cerc:

  1. Atunci când o linie nu intersectează un cerc.
  2. Atunci când o linie dreaptă traversează un cerc și linia nu se intersectează.






Verificați dacă vreun punct al segmentului aparține unui anumit cerc (presetat) - suprapunere stivă

Pentru fiecare cerc (R, M) și segment AB, se poate aplica următorul algoritm:

  1. Calculam coeficienții ecuației
    (A + qB) / (1 + q) pe (R, M). sau
    (1 + q) * xm) 2 + (ya + q * yb - (1 + q) * ym) 2 =
    C2 q2 + 2C1 q + C0 = 0, unde
    C0 = (xa-xm) 2 + (ya-ym) 2-R2,
    (Ya - ym) * (yb - ym) - R2,
    C2 = (xb-xm) 2 + (yb-ym) 2-R2.
  2. Dacă C0 <= 0, точка A попала в круг.
  3. Dacă C2 <= 0, точка B попала в круг.
  4. Dacă det = C1 2 - C0 C2 <= 0, прямая АB с кругом не пересекается.
  5. Calculăm rădăcinile ecuațiilor q1 și q2 (dacă există).
  6. Dacă q1> = 0 sau q2> = 0. atunci au lovit. În caz contrar, nu au făcut-o.






Articole similare

Trimiteți-le prietenilor: