Tangenti di sen(x)

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1828
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Tangenti di sen(x)

Messaggio da Gianfranco »

Quelo ha scritto:
ven nov 01, 2024 3:10 pm
Ho aggiunto il canale alpha su Decimal Basic
Non è stato particolarmente complicato, si tratta infatti di miscelare il colore dello sfondo (cb) con quello che stiamo usando (cf) secondo una data percentuale (a)
L'unico limite è che ogni disegno deve essere fatto pixel per pixel
A Genova diciamo: belin! hai fatto davvero un ottimo lavoro, grazie a funzioni poco documentate del DECIMAL BASIC.
GRAZIE SERGIO!
Ci ho messo almeno due ore per capire come funziona e come usare la funzione ALPHA (compreso lo studio della documentazione del COLOR MODE "NATIVE") ma forse ci sono riuscito.
Se non sbaglio, bisogna disegnare le rette (o altro) un pixel alla volta e non come "segmenti", vero?
Allego un programmino di prova. Potresti verificare se ho usato correttamente la funzione ALPHA?

Codice: Seleziona tutto

DECLARE EXTERNAL FUNCTION ALPHA

SET COLOR MODE "NATIVE"
CLEAR                  
SET WINDOW 0,8,0,8
!'Coloro lo sfondo a striscie arcobaleno
FOR x=0 TO 7
   LET r=MOD(x,2)
   LET g1=INT(x/2)
   LET g=MOD(g1,2)
   LET b1=INT(g1/2)
   LET b=MOD(b1,2) 
   SET AREA COLOR ColorIndex(r,g,b)
   PLOT AREA: x,0; x+1,0; x+1,7; x,7
NEXT x

!'Disegno dei punti blu (0,0,1) sui colori di sfondo
!'Il blu sarà reso "in trasparenza" rispetto allo sfondo dietro ciascun punto
!'grazie alla funzione ALPHA

!'Inizializzo il randomizzatore
RANDOMIZE

!'Imposto i punti grandi, come bollini
SET POINT STYLE 7

!'Scelgo punti a caso
FOR i=1 TO 1000
   LET x=8*RND
   LET y=8*RND
   
   !'Chiedo il colore dello sfondo alle coordinate del punto
   ASK PIXEL VALUE (x,y) cback   
   
   !'Assegno colore blu al punto
   LET cforeg=colorindex(0,0,1) 
   
   !'Chiedo ad ALPHA di decidere il colore effettivo del punto da disegnare
   !'in base a foreground, background e un parametro di trasparenza
   SET POINT COLOR ALPHA(cforeg,cback,0.5)
   
   !'Disegno il punto
   PLOT POINTS: x,y
    
NEXT i  
 
END

EXTERNAL FUNCTION ALPHA(cf, cb, a)
LET fr=MOD(cf,256)
LET cf=(cf-fr)/256
LET fg=MOD(cf,256)
LET fb=(cf-fg)/256
LET br=MOD(cb,256)
LET cb=(cb-br)/256
LET bg=MOD(cb,256)
LET bb=(cb-bg)/256
LET r=(a*fr+(1-a)*br)/256
LET g=(a*fg+(1-a)*bg)/256
LET b=(a*fb+(1-a)*bb)/256
LET ALPHA=colorindex(r,g,b)      
END FUNCTION

Il risultato è questo.
AlphaBasic.PNG
AlphaBasic.PNG (36.45 KiB) Visto 2713 volte
Pace e bene a tutti.
Gianfranco

Quelo
Livello 8
Livello 8
Messaggi: 962
Iscritto il: ven giu 16, 2006 3:34 pm

Re: Tangenti di sen(x)

Messaggio da Quelo »

Ottimo lavoro Gianfranco

Io ho notato che si può usare anche la funzione PLOT LINES: x,y; che raccorda i punti in sequenza. A patto però di tracciare punti molto vicini
Ecco un esempio sul programma che hai scritto tu

Codice: Seleziona tutto

DECLARE EXTERNAL FUNCTION ALPHA

SET COLOR MODE "NATIVE"
CLEAR                  
SET WINDOW 0,8,0,8
!'Coloro lo sfondo a striscie arcobaleno
FOR x=0 TO 7
   LET r=MOD(x,2)
   LET g1=INT(x/2)
   LET g=MOD(g1,2)
   LET b1=INT(g1/2)
   LET b=MOD(b1,2) 
   SET AREA COLOR ColorIndex(r,g,b)
   PLOT AREA: x,0; x+1,0; x+1,7; x,7
NEXT x

!'Disegno una linea rossa (1,0,0) sui colori di sfondo
!'Il rosso sarà reso "in trasparenza" rispetto allo sfondo 
!'grazie alla funzione ALPHA

!'Inizializzo il randomizzatore
RANDOMIZE

!'Imposto la larghezza della linea
SET LINE width 2

!'Traccio una curva per punti
FOR i=1 TO 800
   LET x=8*i/800
   LET y=4+SIN(PI*i/100)
    
   !'Chiedo il colore dello sfondo alle coordinate del punto
   ASK PIXEL VALUE (x,y) cback   
    
   !'Assegno colore rosso alla linea
   LET cforeg=colorindex(1,0,0) 
    
   !'Chiedo ad ALPHA di decidere il colore effettivo del punto da disegnare
   !'in base a foreground, background e un parametro di trasparenza
   SET LINE COLOR ALPHA(cforeg,cback,0.5)
    
   !'Disegno la curva
   PLOT LINES: x,y;
    
NEXT i  

! Salvo il disegno
GSAVE "D:\alpha.gif"
 
END

EXTERNAL FUNCTION ALPHA(cf, cb, a)
LET fr=MOD(cf,256)
LET cf=(cf-fr)/256
LET fg=MOD(cf,256)
LET fb=(cf-fg)/256
LET br=MOD(cb,256)
LET cb=(cb-br)/256
LET bg=MOD(cb,256)
LET bb=(cb-bg)/256
LET r=(a*fr+(1-a)*br)/256
LET g=(a*fg+(1-a)*bg)/256
LET b=(a*fb+(1-a)*bb)/256
LET ALPHA=colorindex(r,g,b)      
END FUNCTION
alpha.gif
alpha.gif (13.5 KiB) Visto 2692 volte
[Sergio] / $17$

Rispondi