Rettangoli es 1 HW 3

a
alessio.palma (1480 points)
0 34 56
asked Dec 4, 2018 in Es1 by alessio.palma (1,480 points)
edited Dec 4, 2018 by alessio.palma
Non riesco a procedere nel trovare i rettangoli. In un doppio for scorro pixel per pixel e :

Se bianco, controllo se puó essere un vertice sinistro . Se puó esserlo controllo se esiste un vertice destro e se la linea che collega i due è tutta bianca. Se ció succede controllo se possono esistere i due vertici bassi (che avranno uno la x del primo vertice altosx e uno la x del vertice altodx) e se entrambe le linee che li congiungono ai due vertici alti sono tutte bianche. Infine controllo se la base minore è tutta bianca. Tutto ció è dentro il doppio for originario, per cercare di scorrere la matrice una volta sola. La mia domanda è: come faccio, una volta trovato il vertice corrispondente, ad evitare di cercare altri vertici con quel for innestato? E quando trovo che la linea che congiunge due vertici non è tutta bianca come faccio a smettere di cercare altri vertici e tornare al controllo sui singoli pixel? Inoltre non so se è bene fare tutte queste operazioni nel doppio for iniziale o se è meglio usare altri for FUORI dal doppio for iniziale che scorre i singoli pixel. Spero di essere stato chiaro, grazie.

EDIT: per base minore intendo base inferiore, sorry
255 views

2 Answers

a.capobianco1 (16770 points)
1 54 165
answered Dec 4, 2018 by a.capobianco1 (16,770 points)
Ciao. Io ho un doppio for annidato, proprio come te. Una volta trovato il V alto SX imposto una variabile di stato (prima era 0 dopo è un 1) continuo verso destra... Se trovo secondo vertice aggiorno variabile stato a 2 altrimenti se trovo un 'buco' nel bordo settola variabile di stato a 0. Dopo il secondo vertice ho un terzo for (o due?) che mi completa e mi controlla il rettangolo
a
alessio.palma (1480 points)
0 34 56
commented Dec 4, 2018 by alessio.palma (1,480 points)
Dopo aver settato la variabile di nuovo a 0 come fai a dire al tuo programma di ricominciare a cercare un vertice alto sx?
a.capobianco1 (16770 points)
1 54 165
commented Dec 4, 2018 by a.capobianco1 (16,770 points)
con una clausola if all'interno del doppio ciclo for gestisco tutte le fasi di ricerca.. se è 0 cerca il sinistro, se è 1 cerca il destro.. se non lo trovi vai a di nuovo a 0 e così via... ad ogni nuovo ciclo ti entra nella sezione condizionale definita dalla variabile di stato... e' importante definire, in ogni sezione condizionale, le istruzioni di ricerca adatte all'azione da compiere: casa fare per verificare se è un Vsx,cosa fare per verificare se è un Vdx e cosi via...
gian- (1170 points)
0 7 17
answered Dec 4, 2018 by gian- (1,170 points)
io ho fatto tutto dentro i due for iniziali per scorrere.

Non mi è molto chiaro che intendi per base minore del rettangolo, tuttavia posso dirti che:  scorrendo(1 sola volta con quel doppio for) ti trovi un vertice che sarà ovviamente quello alto a sinistra. Allora che fai, continui a ciclare a destra finché non trovi un vertice che abbia come direzione sinistra(direzione da cui vieni)-basso.

A quel punto inizi a scendere, finché non trovi un vertice con direzione alto(direzione da cui vieni)- sinistra. Ora scorri a sinistra tante volte quante hai scorso la prima volta, e, se sono tutti bianchi e se trovi un vertici destra-alto procedi in salita, per tornare al punto di partenza e chiudere il rettangolo. Quest'ultimo passaggio lo fai in modo analogo al penultimo!
a
alessio.palma (1480 points)
0 34 56
commented Dec 4, 2018 by alessio.palma (1,480 points)
e una volta trovato il rettangolo posso subito controllare se è tutto nero e colorarlo oppure mi conviene salvare i vertici a parte e pensare dopo al controllo sull'interno e all'eventuale "colorazione"?
gian- (1170 points)
0 7 17
commented Dec 4, 2018 by gian- (1,170 points)

Fallo subito. Tanto ti basta giusto qualche istruzione in più che vale per ogni rettangolo.. se lo fai separato appesantisci di tanto il programma. Hai le coordinate del perimetro, cerca dentro di esso con due for  wink

A
AxelPower (1510 points)
1 9 22
commented Dec 4, 2018 by AxelPower (1,510 points)
Il problema è che solo fare 2 for mi manda in timeout 2 esercizi , anche se l'esercizio più dispendioso ci mette 150ms su spyder ( con %time ) sul test ci mette 700ms , e sulla virtual machine 2000 , questo perchè il grader conta anche il tempo che ci mette lui a verificare se l'immagine è corretta.
Quel tempo neanche dipende da me , cosa diamine dovrei fare ?
a
alessio.palma (1480 points)
0 34 56
commented Dec 4, 2018 by alessio.palma (1,480 points)
edited Dec 4, 2018 by alessio.palma

@AxelPower

Mi trovo d'accordo con te, questo è un bel problema indecision

EDIT: ho migliorato il mio codice ed ora i tempi sono buoni, non posso lamentarmi