Module: Geometria


Problem

5 /7


Maestro del ritiro

Theory Click to read/hide

Incrocio

Punto di intersezione di linee

a1, b1, c1 - coefficienti della prima riga,
a2, b2, c2 - coefficienti della seconda riga,
x, y - punto di intersezione.

\(x = {-(c1 \cdot b2 - c2 \cdot b1) \over (a1 \cdot b2 - a2 \cdot b1)} \\ y = {-(a1 \ cdot c2 - a2 \cdot c1) \over (a1 \cdot b2 - a2 \cdot b1)} \)

Sappiamo già come controllare le linee per l'intersezione (non sono parallele) e trovare il loro punto di intersezione.

Ora impariamo come farlo con i segmenti

Innanzitutto, impariamo come verificarne semplicemente l'intersezione.

I segmenti si intersecano se le estremità di uno sono sui lati opposti dell'altro e viceversa (questo è facilmente verificabile dal prodotto incrociato).  L'unico caso in cui ciò non funzionerà: i segmenti si trovano su una linea retta. Per questo, è necessario verificare l'intersezione del cosiddetto. bounding box (bounding box del segmento) - controlla l'intersezione della proiezione dei segmenti su X e Y.

assi.

Ora che sappiamo come controllare i segmenti per l'intersezione, impariamo a trovare il punto (o segmento) della loro intersezione:
- se non si intersecano, allora è chiaro che tale punto non esiste;
- altrimenti, costruiremo linee rette su cui giacciono questi segmenti.

Se sono paralleli, allora i segmenti giacciono sulla stessa linea, e dobbiamo trovare il segmento di intersezione - dal massimo dei bordi di sinistra dei segmenti al minimo dei bordi di destra (il punto è minore dell'altro punto, se è a sinistra, in caso di uguaglianza X-coordinate - se è inferiore).

Se le linee non sono parallele, trova il punto della loro intersezione e restituiscilo.

Problem

Venceslav ha recentemente letto un nuovo libro sui pickup e ora vuole mettere alla prova le sue conoscenze nel parco. Per semplicità, immaginiamo il parco come un insieme di percorsi, che sono segmenti su un piano. Wenceslas ha già camminato in questo parco e sa quale ragazza sta camminando lungo quale sentiero. Il problema è che Wenceslas è molto pigro e percorre solo un sentiero. Ed è anche troppo pigro per scoprire che tipo di ragazze può incontrare lungo la strada, e quindi ha chiesto a te, il suo migliore amico, di aiutarlo in questa difficile questione.
 
Input
La prima riga contiene le coordinate degli estremi del percorso (X1, Y1) e ( X2, Y2), lungo cui cammina Venceslao (\(- 20 <= X1, Y1, X2, Y2 <= 20\)).
La seconda riga contiene un numero intero N - il numero di percorsi lungo i quali le ragazze camminano (\(0 <= N <= 5\) < /span>).
Nelle seguenti N righe, inserisci le coordinate degli estremi dei sentieri lungo i quali camminano le ragazze (Xi1, Yi1< /sub>) e (Xi2, Yi2 ), di i -esimo percorso che percorre i-esima ragazza (\(-20 <= X_{i1}, Y_ {i1}, X_{i2 }, Y_{i2} <= 20\))
 
Uscita
Nella prima riga stampa il numero M - il numero di ragazze i cui percorsi si intersecheranno con il percorso di Venceslao (toccare i percorsi è considerato un incrocio).
Nella seconda riga stampa i numeri M - i numeri delle ragazze che il nostro eroe incontrerà. Le ragazze sono numerate a partire da uno!
 
Esempi
# Input Uscita
1
0 0 2 2
1
0 2 2 0
1
1