Si potrebbe provare a utilizzare un algoritmo scanline - Per ogni riga del poligono (quindi y = min (y) .. max (y)), ottenere l = min (x) e r = max (x). Calcola la pendenza sinistra/destra (deltax) e confrontala con la pendenza della linea precedente. Se è cambiato (usa un po 'di tolleranza qui), sei in un angolo del rettangolo (o vicino ad esso). Ciò non funzionerà in tutti i casi, poiché la pendenza non può essere quella esatta a causa della bassa risoluzione, ma per i rettangoli di grandi dimensioni e le pendenze non troppo simili, questo dovrebbe funzionare.
Almeno, funziona bene per il tuo esempio:
X0000000000X l = 0, r = 11
.00000000000 l = 1, r = 11, deltaxl = 1, deltaxr = 0
..X000000000 l = 2, r = 11, deltaxl = 1, deltaxr = 0
.....0000000 l = 5, r = 11, deltaxl = 3, deltaxr = 0
........0000 l = 8, r = 11, deltaxl = 3, deltaxr = 0
...........X l = 11, r = 11, deltaxl = 3, deltaxr = 0
Si inizia con la parte superiore del rettangolo in cui si ottengono due valori diversi per L e R, per cui si dispone già di due degli angoli. Sul lato sinistro, per le prime tre righe avrai deltax = 1, ma dopo di esso avrai deltax = 3, quindi c'è un angolo in (3, 3). Sul lato destro, nulla cambia, deltax = 0, in modo da ottenere solo il punto alla fine.
Nota che stai "raccogliendo" gli angoli qui, quindi se non hai 4 angoli alla fine, le pendenze erano troppo simili (o hai un'immagine di un triangolo) e puoi passare a un altro (più esatto) algoritmo o semplicemente dare un errore. Lo stesso se hai più di 4 angoli o altre strane cose come i buchi nel rettangolo. Sembra che sia coinvolto un qualche tipo di rilevamento delle immagini, quindi questi casi possono verificarsi, giusto?
ci sono casi in cui un semplice DeltaX = (x - lastx) non funziona bene, vedere questo esempio per il lato sinistro di un rettangolo:
xxxxxx
xxxxx deltax = 1 dy/dx = 1/1 = 1
xxxxx deltax = 0 dy/dx = 2/1 = 2
xxxx deltax = 1 dy/dx = 3/2 = 1.5
xxxx deltax = 0 dy/dx = 4/2 = 2
xxx deltax = 1 dy/dx = 5/3 = 1.66
volte DeltaX è 0, a volte è 1 È preferibile utilizzare la pendenza della linea dal punto effettivo al punto in alto a sinistra/destra (deltay/deltax). Usandolo, dovrai comunque mantenere una tolleranza, ma i tuoi valori diventeranno più precisi con ogni nuova riga.
Perché non avrebbe funzionato? Dovrai trovare il vero massimo e il minimo reale (esaminando tutti i punti che hai prima di decidere quale sia il massimo e il minimo) ma a un certo punto dovrai fare affidamento su alcuni dei dati per dirti come dovrebbe essere il rettangolo _should_. –
Come hai ottenuto la sagoma del rettangolo senza avere coordinate punto per gli angoli? – Stewbob
Ho un'immagine come input, con una funzione di soglia posso separare la parte interessante dallo sfondo. – dutchflyboy