Creare Una Circonferenza Con Uno Spessore Desiderato avete in mente qualcosa?
#1
Inviato 18 ottobre 2009 - 14:05
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?
#2
Inviato 18 ottobre 2009 - 17:24
masmil1988, il 18/10/2009 - 15:05, ha scritto:
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 (728bytes)
Numero di downloads: 6
che genera questo disegno
cerchio.png (1,82K)
Numero di downloads: 2
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().
Messaggio modificato da lento il 18 ottobre 2009 - 17:32
#3
Inviato 18 ottobre 2009 - 19:33
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?
#4
Inviato 18 ottobre 2009 - 22:41
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
Messaggio modificato da masmil1988 il 18 ottobre 2009 - 22:46
#5
Inviato 18 ottobre 2009 - 23:11
masmil1988, il 18/10/2009 - 23:41, ha scritto:
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.
Messaggio modificato da lento il 19 ottobre 2009 - 06:41
#6
Inviato 23 ottobre 2009 - 08:37
Questo pomeriggio comunque vedo di adattare l'algoritmo alle esigenze
Ti ringrazio tantissimo!!!
#7
Inviato 23 ottobre 2009 - 21:26
#8
Inviato 24 ottobre 2009 - 14:04
A proposito della miniguida, inserisco tra poco qualcosa sul modulo NET
#9
Inviato 24 ottobre 2009 - 17:01
#10
Inviato 30 dicembre 2009 - 21:29
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...
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?
Messaggio modificato da Nick_7 il 30 dicembre 2009 - 21:34
#11
Inviato 31 dicembre 2009 - 16:00
Nick_7, il 30/12/2009 - 21:29, ha scritto:
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.
#12
Inviato 31 dicembre 2009 - 18:14
Messaggio modificato da Nick_7 il 09 gennaio 2010 - 16:40
#13
Inviato 09 gennaio 2010 - 16:36
Download file
-
Figura.txt (209bytes)
Numero di downloads: 1
Messaggio modificato da Nick_7 il 09 gennaio 2010 - 18:16
#14
Inviato 09 gennaio 2010 - 17:21
#15
Inviato 09 gennaio 2010 - 18:17
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...
Messaggio modificato da Nick_7 il 09 gennaio 2010 - 18:21

Aiuto














Pubblicità