masmil1988 Posted October 18, 2009 Report Share Posted October 18, 2009 Per il programma che sto realizzando mi serve creare una circonferenza di uno spessore compreso tra 1 e 75 pixel... Non riesco a creare questa circonferenza senza che all'interno mi compaiano dei punti bianchi (perchè creo in pratica tante circonferenze l'una dentro l'altra e i bordi non combaciano esattamente...) Avete idea di come si possa creare una circonferenza senza questi punti all'interno? Link to comment Share on other sites More sharing options...
lento Posted October 18, 2009 Report Share Posted October 18, 2009 (edited) Per il programma che sto realizzando mi serve creare una circonferenza di uno spessore compreso tra 1 e 75 pixel...Non riesco a creare questa circonferenza senza che all'interno mi compaiano dei punti bianchi (perchè creo in pratica tante circonferenze l'una dentro l'altra e i bordi non combaciano esattamente...) Avete idea di come si possa creare una circonferenza senza questi punti all'interno? Io ti consiglio di disegnarlo utilizzando il veloce algoritmo di Bresenham con questo disegni la circonferenza, solo che al posto di disegnare un puntino disegni dei cerchi pieni aventi diametro pari allo spessore della linea che vuoi ottenere. Ti allego in prog di esempio.Cerchione.txt che genera questo disegno Lascio a tè il compito di aggiustare il tutto dato che graph.circle() considera non il centro cerchio ma un vertice del quadrato che lo contiene. Và gia che è breve lo metto pure per esteso. // per la gioia altrui 2009-10-18 Ore 18.10 use graph as g,math as m; g.size(320,240); g.full(true); Larghezza = 240; Lunghezza = 320; function bcircle (xc, yc, r,sp) // cerca Algoritmo di Bresenham per linee e cerchi x = 0; d = 2 * (1 - r); W = 2 * m.trunc(.Lunghezza / .Larghezza); while r >= 0 do g.circle(xc + x, yc + r,sp); g.circle(xc + x, yc - r,sp); g.circle(xc - x, yc + r,sp); g.circle(xc - x, yc - r,sp); if (d + r) > 0 then r = r - 1; d = d - W * r - 1; end; if x > d then x = x + 1; d = d + 2 * x + 1; end; end; // while end; g.pen(g.black); g.text(50,80,"ci disegno sopra"); g.brush(g.black); bcircle(100,100,50,10); g.show(); sleep(5000); (non ho avuto il tempo di commentarlo..se qualcuno se la sente di spiegare l'algoritmo..) Se vuoi puoi disegnare vari cerchi concentrici di un pixel con questa formula non lascia buchi bianchi ma credo sia più veloce usare graph.circle(). Edited October 18, 2009 by lento Link to comment Share on other sites More sharing options...
lento Posted October 18, 2009 Report Share Posted October 18, 2009 Ripensandoci forse il metodo più veloce è quello di disegnare due cerchi, 1) il perimetro massimo 2) il perimetro minimo questa operazione viene fatta in simultanea in modo da avere in realta le coordinate x,y e x1,y1 per disegnare una retta. l'insieme di queste rette genera la corona che ti serve. Sempre sfruttando l'algoritmo sopra riportato. Questo dovrebbe essere il sistema più veloce. La risposta definitiva l'avrai provando le tre soluzioni. Se lo fai ci fai sapere anche a noi? Link to comment Share on other sites More sharing options...
masmil1988 Posted October 18, 2009 Author Report Share Posted October 18, 2009 (edited) Dall'immagine sembra che la circonferenza sia buona... Diciamo che più che una circonferenza è in generale un'ellisse quella che deve essere disegnata. Però vorrei capire bene cosa fa l'algoritmo. Ovviamente nello spazio centrale della circonferenza/ellisse (che rimane vuoto) deve continuare a vedersi quel che c'era prima che venisse disegnata la circonferenza... Questo è quello che ottengo io Grazie tanto per l'aiuto Edited October 18, 2009 by masmil1988 Link to comment Share on other sites More sharing options...
lento Posted October 18, 2009 Report Share Posted October 18, 2009 (edited) Dall'immagine sembra che la circonferenza sia buona... Diciamo che più che una circonferenza è in generale un'ellisse quella che deve essere disegnata.Però vorrei capire bene cosa fa l'algoritmo. Ovviamente nello spazio centrale della circonferenza/ellisse (che rimane vuoto) deve continuare a vedersi quel che c'era prima che venisse disegnata la circonferenza... Questo è quello che ottengo io Grazie tanto per l'aiuto Quello che vedo l'ai ottenuto con il programma cerchione.txt? Sei Sicuro? Cerchione.txt come vedi si sovrappone alla scritta o disegno esistente senza cancellare la parte interna all'anello. Per sapere come funziona fai una ricerca algoritmo Bresenham ( te lò scritto propri per permetterti di approfondire la cosa.) Chiedi cerchi e pensi ellissi? .....cambia solo l'algoritmo per generare i cerchi con quello per ellissi. Edited October 19, 2009 by lento Link to comment Share on other sites More sharing options...
masmil1988 Posted October 23, 2009 Author Report Share Posted October 23, 2009 Quello che vedi è ottenuto con le circle non col tuo algoritmo Questo pomeriggio comunque vedo di adattare l'algoritmo alle esigenze Ti ringrazio tantissimo!!! Link to comment Share on other sites More sharing options...
lento Posted October 23, 2009 Report Share Posted October 23, 2009 Grazie a tè. Pensa, ogni volta che devo schiarirmi le idee sull'uso di mShell la prima cosa che consulto è la tua miniguida. Link to comment Share on other sites More sharing options...
masmil1988 Posted October 24, 2009 Author Report Share Posted October 24, 2009 Eheh la consulto anch'io a volte, per ricordare magari qualcosa che non tocco da tempo! A proposito della miniguida, inserisco tra poco qualcosa sul modulo NET Link to comment Share on other sites More sharing options...
lento Posted October 24, 2009 Report Share Posted October 24, 2009 Eheh la consulto anch'io a volte, per ricordare magari qualcosa che non tocco da tempo!A proposito della miniguida, inserisco tra poco qualcosa sul modulo NET Moolto ma moolto bene! mi stai facendo un grosso favore. Link to comment Share on other sites More sharing options...
Nick_7 Posted December 30, 2009 Report Share Posted December 30, 2009 (edited) Ciao a tutti, l'idea mi è venuta proprio 5 minuti fa proprio mentre stavo cenando il tutto ispirato dal mio orologio analogico; non so se può essere d'aiuto ma la butto lì: l'idea è la seguente: disegniamo una circonferenza in questo modo: g.circle(100,100,100); //la prossima sarà: (si diminuiscono di 1 entrambe le coordinate ma si aumenta di 2 il diametro) g.circle(99,99,102); //e ancora: g.circle(98,98,104); //e così via... in realtà non so nemmeno se funziona... ma a livello teorico dovrebbe... Magari sulla base di questo si potrebbe creare una bella funzione che semplifichi il tutto come per esempio: function anello(min,max); for i=min to max by 1 do g.circle(100-i,100-i,100+2*i); ...ecc Che ne dite? Edited December 30, 2009 by Nick_7 Link to comment Share on other sites More sharing options...
lento Posted December 31, 2009 Report Share Posted December 31, 2009 Stando a quanto dice 'masmil1988' (a inizio discussione) questo sistema di dare spessore lascia delle striature come ben vedi nelle immagini sopra riportate. Il problema era quello di ottenere un anello di un certo spessore completamente pieno del colore scelto. Prova a postare la immagine che genera, forse la tua è una soluzione migliore. Link to comment Share on other sites More sharing options...
Nick_7 Posted December 31, 2009 Report Share Posted December 31, 2009 (edited) Hai ragione c'è lo stessa problema di masmil... Edited January 9, 2010 by Nick_7 Link to comment Share on other sites More sharing options...
Nick_7 Posted January 9, 2010 Report Share Posted January 9, 2010 (edited) Ecco un nuovo modo, che ho trovato quasi casualmente: copre bene ogni pixel anche se è mooolto lento nel generare l'immagine... Figura.txt Edited January 9, 2010 by Nick_7 Link to comment Share on other sites More sharing options...
lento Posted January 9, 2010 Report Share Posted January 9, 2010 Ecco un nuovo modo, che ho trovato quasi casualmente: copre bene ogni pixel anche se è mooolto lento nel generare l'immagine... Puoi renderci edotti del suo funzionamento? Link to comment Share on other sites More sharing options...
Nick_7 Posted January 9, 2010 Report Share Posted January 9, 2010 (edited) Hai perfettamente ragione 'lento' scusa ma mi sono completamente dimenticato dell'allegato... ora l'ho inserito nel mio post precedente assieme allo screenshot Più ci penso e più mi sembra inutile a questo scopo: infatti il mio script è adatto a creare una corona di linee magari distinguibili l'una dall'altra, ma se queste sono in un numero così elevato m ci mette troppo ad eseguire il disegno quindi anche questa mia intuizione non è proprio adatta a creare un anello... Edited January 9, 2010 by Nick_7 Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now