Messaggioda carlo23 » 08/06/2006, 15:55

stellacometa2003 ha scritto:Grazie Carlo...ora lo provo, vediamo che ne esce!!


Prova, intanto specifico una cosa importante al riguardo.

Per disegnare curve continue con Vb o qualche altro linguaggio che permetta di disegnare punti o linee si può ricorrere a due metodi.

Il primo è il seguente, basta mettere tutto in un ciclo for che disegna singolarmente i singoli punti della curva

Codice:
FOR t=0 to N
'Qua ci mettiamo le equazioni parametriche il t della curva
Picture1.pset(X,Y)
NEXT


ovvero dividiamo la curva in N punti che poi disegnamo, questo metodo funziona bene solo se i punti della curva sono molti vicini e quindi da l'impressione della continuità, altrimenti

Codice:
FOR t=0 to N
'Qua ci mettiamo le equazioni parametriche il t della curva X1 e Y1 saranno le coordinate della
'curva nel punto con parametro t e X2 Y2 le coordinate della curva nel punto con parametro t+1
Picture1.line(X1,Y1)-(X2,Y2)
NEXT


quest'altro codice divide la curva in N linette è quindi più indicato per disegnare curve di funzioni che crestono lentamente tipo $ln(x)$ altrimenti la curva diventa una linea spezzata. Importante se calcolare X e Y richiede parecchio sforzo al calcolatore non ha senso farli calcolare 2 volte ogni punto tanto vale memorizzare il suo ultimo valore per utilizzarlo nel ciclo successivo.

Codice:
STATIC X2,Y2 as single
FOR t=0 to N
'Qua ci mettiamo le equazioni parametriche il t della curva X1 e Y1 saranno le coordinate della
'curva nel punto con parametro t
Picture1.line(X1,Y1)-(X2,Y2)
X2=X1
X2=Y1
NEXT


ricordando solo che al primo ciclo X2 e Y2 saranno uguali a 0 e semmai impostarle diversamente prima del ciclo for.

Ciao Ciao :D
carlo23
Senior Member
Senior Member
 
Messaggio: 1086 di 1683
Iscritto il: 01/11/2005, 19:38

Messaggioda eugenio.amitrano » 08/06/2006, 16:32

IlaCrazy ha scritto:Ovviamente sono tornata,questa volta con una curiosità...è possibile disegnare con QB una spirale (magari anche in movimento,cioè che si avvita su stessa..)?????
Grazie a tutti!


Mi ha incuriosito e ci ho provato.
Ovviamente in QBasic la faccenda non e' molto semplice.

Codice:
CONST ESC = 27
CONST PI = 3.141592

'' Dati spirale
CONST kSpeed = 8: '' Velocita' avvitamento
CONST kNumberOfFrames = 8: '' Numero Frame Animazione per 360ø di avvitamento
CONST kNumberOfCoils = 10: '' Numero di spire della spirale
CONST kSizeX = 80, kSizeY = 80:  ''Dimensione X e Y della Spirale
CONST kColor = 14: '' Colore della spirale - 14 = Giallo

'' #################
'' # ATTENZIONE !! #
'' #################
''
'' Purtroppo il QBasic e' molto limitato sulla memoria:
'' Devi eseguire il seguente calcolo:
''
'' Valore = kNumberOfFrames * (4 + INT((kSizeX * kBitsOfPixel + 7) / 8) * kSizeY)
'' Il Risultato deve essere minore di 65536 (Valore < 65536)
''
'' In pratica piu' Frame vuoi e meno grande deve essere la spirale
''

'' Dati Schermo
CONST kMode = 12: '' Modalita Schermo 640x480
CONST kBitsOfPixel = 4: '' Bit per pixel - Max 2^4 = 16 colori

DIM iMemSize AS INTEGER: '' Memoria occupata da un frame

'' Formula per il calcolo della memoria occupata da ogni frame
iMemSize = 4 + INT((kSizeX * kBitsOfPixel + 7) / 8) * kSizeY

'' Un frame deve essere un vettore grafico di grandezza iMemSize
'' Dichiarazione degli n frames
DIM gFrame(iMemSize, kNumberOfFrames) AS INTEGER

'' Centro della spirale
DIM X0, Y0 AS INTEGER
X0 = kSizeX / 2
Y0 = kSizeY / 2

'' Coordinate Cartesiane del Generico Punto della Spirale
DIM Xp, Yp AS INTEGER

'' Coordinate Polari del Generico Punto della Spirale
DIM Angle, xRadius, yRadius AS DOUBLE

'' Angolo di avvitamento
DIM StartAngle AS DOUBLE

'' Altre variabili
DIM ch AS STRING
DIM iCount, iOldCount AS INTEGER

SCREEN kMode
CLS

'' Memorizzazione dell'avvitamento nei vari frame
FOR iFrame = 0 TO kNumberOfFrames - 1
   LOCATE 24, 1
   PRINT "Creazione del Frame N."; iFrame + 1
   CIRCLE (kSizeX / 2, kSizeY / 2), kSizeX / 2 - 1, kColor, , , kSizeY / kSizeX
 
   '' Calcolo dell'angolo di avvitamento
   StartAngle = 2 * PI * iFrame / kNumberOfFrames
   FOR Angle = 0 TO 2 * PI * kNumberOfCoils STEP PI / 180
      xRadius = Angle * kSizeX / (2 * PI * kNumberOfCoils)
      yRadius = Angle * kSizeY / (2 * PI * kNumberOfCoils)
      Xp = X0 + xRadius * COS(Angle + StartAngle) / 2
      Yp = Y0 + yRadius * SIN(Angle + StartAngle) / 2
      PSET (Xp, Yp), kColor
   NEXT Angle
 
   GET (1, 1)-(kSizeX, kSizeY), gFrame(0, iFrame)
   PUT (1, 1), gFrame(0, iFrame), XOR

NEXT iFrame


SCREEN kMode
CLS
LOCATE 24, 42
PRINT "Premere ESC per terminare l'animazione"

''Esecuzione dell'animazione finche' non e' premuto il tasto Esc
dPause = 1 / kSpeed ''Pausa in secondi
DO
   PUT (1, 1), gFrame(0, iCount), PSET
   SOUND 32767, dPause * 18.2
   ch = INKEY$
   iOldCount = iCount
   iCount = iCount + 1
   iCount = iCount MOD kNumberOfFrames
   PUT (1, 1), gFrame(0, iOldCount), XOR
LOOP UNTIL ch = CHR\$(ESC)


A presto,
Eugenio
Avatar utente
eugenio.amitrano
Senior Member
Senior Member
 
Messaggio: 281 di 1375
Iscritto il: 15/02/2006, 16:16

Messaggioda lorven » 08/06/2006, 19:13

eugenio.amitrano ha scritto:
IlaCrazy ha scritto:Ovviamente sono tornata,questa volta con una curiosità...è possibile disegnare con QB una spirale (magari anche in movimento,cioè che si avvita su stessa..)?????
Grazie a tutti!


Mi ha incuriosito e ci ho provato.
Ovviamente in QBasic la faccenda non e' molto semplice.
....
A presto,
Eugenio

:shock: :shock: :shock:
pure l'animazione ha inserito Eugenio :!:
Complimenti, davvero :D

A questo punto, preceduto dia in QB che in VB, posto qualcosina in Pascal, anche se siamo in ambito Basic.

Codice:
program spirale;
(* disegna la spirale di Archimede e
   la spirale logaritmica *)

uses crt, graph;
const
      ns=30; (* numero spire *)
      Ox=512; (* ascissa origine: num_pix_orizz/2 *)
      Oy=384; (* ordinata origine: num_pix_vert/2 *)
      c=3; (* colore pixel *)
      ds=2; (* distanza tra le spire per spirale di Archimede *)
      d=1; (* ritardo emissione pixel *)
      sr= 1; (* senso di rotazione: 1 orario, -1 antiorario *)
      it=0.01; (* incremento parametro t *)
      A = 0.2; (* angolo di curvatura della sp. logaritmica *)
      B = 0.05; (*                ''                         *)
      sl = 1; (* 1 spirale logaritmica; 0 di archimede *)
var r,t:real;
var gd,gm:smallint;
px,py:integer;

procedure init;
begin
gd:=detect; (*Rileva la scheda video*)
InitGraph(gd,gm,''); (*Inizializza la modalità grafica*)
if graphresult<>grOK then (*Se si sono verificati errori*)
  halt(1); (*termina il programma*)
end;

begin (**** M A I N ****)
init;
t:=0;
while abs(t)<ns*2*pi do
   begin
   if sl=1 then r:= A * EXP(B * abs(T))
      else r:=ds*t;
   px:=trunc(r*cos(t))+Ox;
   py:=trunc(r*sin(t))+Oy;
   PutPixel(px,py,c);
   delay(d);
   t:=t+it*sr;
   end;
CloseGraph;
readln;
end.

Disegna la spirale di Archimede o la spirale logaritmica (senza animazione) :(

:-)
Un giorno senza sorriso è un giorno perso.
Charlie Chaplin
Avatar utente
lorven
Junior Member
Junior Member
 
Messaggio: 162 di 369
Iscritto il: 06/12/2005, 20:55

Messaggioda IlaCrazy » 08/06/2006, 19:38

Grazie infinite a tutti siete grandissimi!!
@Eugenio: my God,è bellizzzzimo molto più di quanto avevo immaginato di fare!!!!!
www.heartagram.com
"Quando la musica è alchimia con l'arte..."
Immagine
Avatar utente
IlaCrazy
Junior Member
Junior Member
 
Messaggio: 220 di 449
Iscritto il: 01/04/2006, 14:01
Località: ITALY

Messaggioda stellacometa2003 » 09/06/2006, 11:50

WooooW..complimenti sia a Eugenio che a lorven..Vedere certe cose in Pascal fa un certo effetto!!! :D
Avatar utente
stellacometa2003
Senior Member
Senior Member
 
Messaggio: 1430 di 1844
Iscritto il: 03/10/2005, 21:11
Località: Cinisi (PA)

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite