Nokioteca [Nokia] Forum: Creare Una Circonferenza Con Uno Spessore Desiderato - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Creare Una Circonferenza Con Uno Spessore Desiderato avete in mente qualcosa?

#1 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 18 ottobre 2009 - 14:05

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?
0

#2 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 18 ottobre 2009 - 17:24

Visualizza Messaggimasmil1988, il 18/10/2009 - 15:05, ha scritto:

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.Download file  Cerchione.txt (728bytes)
Numero di downloads: 6
che genera questo disegno
Download file  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

0

#3 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 18 ottobre 2009 - 19:33

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?
0

#4 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 18 ottobre 2009 - 22:41

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
Immagine Postata


Grazie tanto per l'aiuto :lol:

Messaggio modificato da masmil1988 il 18 ottobre 2009 - 22:46

0

#5 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 18 ottobre 2009 - 23:11

Visualizza Messaggimasmil1988, il 18/10/2009 - 23:41, ha scritto:

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
Immagine Postata


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.

Messaggio modificato da lento il 19 ottobre 2009 - 06:41

0

#6 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 23 ottobre 2009 - 08:37

Quello che vedi è ottenuto con le circle :crying_anim02: non col tuo algoritmo ^_^
Questo pomeriggio comunque vedo di adattare l'algoritmo alle esigenze :P
Ti ringrazio tantissimo!!!
0

#7 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 23 ottobre 2009 - 21:26

Visualizza Messaggimasmil1988, il 23/10/2009 - 09:37, ha scritto:


Grazie a tè.
Pensa, ogni volta che devo schiarirmi le idee sull'uso di mShell la prima cosa che consulto è la tua miniguida.
0

#8 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 24 ottobre 2009 - 14:04

Eheh :thumbs: 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 :)
0

#9 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 24 ottobre 2009 - 17:01

Visualizza Messaggimasmil1988, il 24/10/2009 - 15:04, ha scritto:

Eheh :unsure: 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 :lol:

Moolto ma moolto bene! mi stai facendo un grosso favore. :lmaosmiley:
0

#10 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 30 dicembre 2009 - 21:29

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? :)

Messaggio modificato da Nick_7 il 30 dicembre 2009 - 21:34

0

#11 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 31 dicembre 2009 - 16:00

Visualizza MessaggiNick_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.
0

#12 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 31 dicembre 2009 - 18:14

Hai ragione c'è lo stessa problema di masmil...

Per visualizzare questo link registrati o esegui il log in.

Messaggio modificato da Nick_7 il 09 gennaio 2010 - 16:40

0

#13 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 09 gennaio 2010 - 16:36

Ecco un nuovo modo, che ho trovato quasi casualmente: :angry: copre bene ogni pixel anche se è mooolto lento nel generare l'immagine... :thumbs:

Per visualizzare questo link registrati o esegui il log in.

Download file


Messaggio modificato da Nick_7 il 09 gennaio 2010 - 18:16

0

#14 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 09 gennaio 2010 - 17:21

Visualizza MessaggiNick_7, il 09/01/2010 - 16:36, ha scritto:

Ecco un nuovo modo, che ho trovato quasi casualmente: :thumbs: copre bene ogni pixel anche se è mooolto lento nel generare l'immagine...

Puoi renderci edotti del suo funzionamento?
0

#15 L   Nick_7 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 339
  • Iscritto: 20 novembre 2008
  • Località:Luna
  • Cellulare:Omnia HD
  • Firmware:I8910XXJB1

Inviato 09 gennaio 2010 - 18:17

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:

Messaggio modificato da Nick_7 il 09 gennaio 2010 - 18:21

0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione