Jump to content
Nokioteca Forum

Creare Una Circonferenza Con Uno Spessore Desiderato


masmil1988
 Share

Recommended Posts

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

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

cerchio.png

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 by lento
Link to comment
Share on other sites

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

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

senzatitolo1wt.jpg

Grazie tanto per l'aiuto :lol:

Edited by masmil1988
Link to comment
Share on other sites

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

senzatitolo1wt.jpg

Grazie tanto per l'aiuto :mumble:

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 by lento
Link to comment
Share on other sites

  • 2 months later...

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 by Nick_7
Link to comment
Share on other sites

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

  • 2 weeks later...

Hai perfettamente ragione 'lento' scusa ma mi sono completamente dimenticato dell'allegato... :incazzato: 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... :thumbs:

Edited by Nick_7
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...

Important Information

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy