Curve Bézier

Algoritmi, discussioni sulle possibili implementazioni, matematica, fisica e tutti gli argomenti correlati alla programmazione
Rispondi
Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Curve Bézier

Messaggio da maz85 »

Curve di Bézier con GM

Visto che non è propriamente una lezione sono indeciso se postare qui oppure fare un botta e risposta sulle altre sezioni. Accetto consigli a tal proposito.

Approfondimento qui: http://it.wikipedia.org/wiki/Curva_di_B%C3%A9zier

Dati alcuni punti saremo in grado di custruire delle curve di Bézier che si possono distinguere in :
- curve lineari: si, sono linee e questa è la formula
Immagine

- curve quadratiche: sono dati 3 punti per tracciare una curva e questa è la formula
Immagine

- curve cubiche: dati 4 punti per tracciare una curva e questa è la formula
Immagine

- curve cubiche con più di 4 punti definiti

(invito Slascio a postare il codice delle ultime due anche qui)

Questo è il codice per richiamare lo script che useremo:

Codice: Seleziona tutto

//lineare
draw_bezier(0,x,y,mouse_x,mouse_y);


//quadratica
draw_bezier(1,x,y+250,x+200,y+150,mouse_x,mouse_y);
La funzione è così composta: tipologia di curva(0=lineare, 1=quadratica), punto iniziale x, punto iniziale y, ...,..., punto finale x, punto finale y.
Per comodità ho inserito le coordinate del mouse come punti finali.


Questo che segue è lo script in cui all'interno viene usato un for per far disegnare tutti i punti della curva.
Il for in questione fa assumere alla variabile condizione un valore da 0 a 1 (come espresso nelle formule sopra) attraverso uno step di 0.001 (esprimerà la densità dei punti disegnati).
Per ogni valore della variabile condizione "i" vengono trovate le coordinate bx e by ovvero ogni punto della curva.

Codice: Seleziona tutto

{
//Disegna una curva di bezier
//Modalità
//0 lineare
//1 quadratica
//altri argomenti: punti p0x,p0y,p1x,p1y,p2x,p2y

var mode;
mode=argument0;

//LINEARE
if(mode==0){
    for(i=0;i<=1;i+=0.001){
        bx=(1-i)*argument1 + i*argument3;
        by=(1-i)*argument2 + i*argument4;
        draw_point_color(bx,by,c_black);
}
}

//QUADRATICA
if(mode==1){
    for(i=0;i<=1;i+=0.001){
        bx=power((1-i),2)*argument1 + 2*i*(1-i)*argument3+power(i,2)*argument5;
        by=power((1-i),2)*argument2 + 2*i*(1-i)*argument4+power(i,2)*argument6;         
        draw_point_color(bx,by,c_black);
    }
}

}
Immagine


In un prossimo topic parleremo dell'antialiasing sulle linee disegnate.
(topic in aggiornamento)

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: Curve Bézier

Messaggio da guidox »

Le mie conoscenze da 3 media non mi permettono di capire. :cry:

Ma visto che l' argomento mi interessa, e la voglia di imparare non mi manca, chi è disposto a spiegarmi(anche solo in teoria), come si costruiscono le linee secondo questa tecnica? :)
Immagine

Immagine

Avatar utente
nightwish88
GMI Advanced
Messaggi: 1739
Iscritto il: 18/01/2009, 13:41
Contatta:

Re: Curve Bézier

Messaggio da nightwish88 »

maz85 ha scritto:Curve di Bézier con GM

bla bla bla.... tantissime cose interessanti... bla bla bla

In un prossimo topic parleremo dell'antialiasing sulle linee disegnate.
(topic in aggiornamento)
:banana:
Immagine

Web Site: AFGames

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: Curve Bézier

Messaggio da Sla »

Ci penso io guidox.
Esattamente cosa non capisci, immagini come questa?
Immagine
Si tratta di una funzione, che si chiama B. proprio come ad esempio draw_set_alpha(alpha).
L'argomento nella funzione della immagine è chiamato t, mentre quello del mio esempio è alpha.
P0 e P1 rappresentano i due punti della curva di bezier lineare.
Per definizione una funzione è tale quando per ogni valore passatogli sotto argomento ne restituisce un altro (non può in nessun caso non restituire valori). La parte finale, con t, il simbolo della E, e [0,1] indica che per argomento t dobbiamo inserire un valore tra 0 e 1 compresi gli estremi. (sarebbero esclusi in questo modo: ]0,1[, e quella E si può leggere "appartiene a...").
Possiamo anche usare valori all'esterno di 0 e 1 perchè è una funzione, solo otterremo dei valori restituiti che non ci interessano per ottenere i punti della curva.
Alternando le x e le y in P0 e P1 otterremo le x e le y dei punti della curva.
Ovvio che questi punti sono infiniti, come i numeri compresi tra 0 e 1, ma per comporre
la curva servirà trovarne qualcuno e unirli con dei draw_line.

Ecco cosa ti consiglio per capire meglio, creati uno script e chiamalo B.
mettici dentro (ponendo per ipotesi che i due punti siano: P0(0,0) e P1(3,6))

return (1-argument0)*0+argument0*3
e richiamando B(t) da uno codice qualsiasi otterrai una coordinata X nella curva di bezier costituita dai punti P0 e P1. (se al posto di 0 e 3 mettevi 0 e 6 ottenevi la coordinata Y)
esempio in create:
t = 0;
while t <= 1
{
coord_x[t] = B(t);
t += 1/n_punti_totali;
}
eppure mi sembra tutto giusto...

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: Curve Bézier

Messaggio da BaronVsCorsar »

bravo slascio!
[vaneggiamenti teorici di poco interesse]
per precisione matematica bisogna far notare che B, P0 e P1 sono vettori (matematici, stessa cosa dei vettori in informatica).
Sono scritti in grossetto per questo (a mano si sarebbe fatto un segno orizzontale sopra il nome, freccetta se siamo nelle tre dimensioni spaziali).

Matematicamente si definisce "curva" un funzione con dominio in R (o sottoinsieme) e codominio in almeno R*R (spazio a due dimensioni o più...).

Quindi in genere ho che una curva è definita da DUE "funzioni monodimensionali" (o più), che restituiscono la x e la y del punto della cruva, in funzione di una variabile che possiamo immaginare come "posizione sulla curva".
Notate qualche somiglianza con i path di gm?
[/vaneggiamenti teorici di poco interesse]
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
Ghost
Membro super
Messaggi: 540
Iscritto il: 08/06/2010, 3:48
Specialità: Programmazione
Località: 63 69 76 69 74 61 76 65 63 63 68 69 61
Contatta:

Re: Curve Bézier

Messaggio da Ghost »

Come effetto è molto bello ma a cosa potrà mai servire ? :fapensare:

Avatar utente
PeppeAs95
GMI Advanced
Messaggi: 2231
Iscritto il: 24/06/2008, 16:10
Specialità: Modellazione[LD-HD]
Località: Sonosce (MO)
Contatta:

Re: Curve Bézier

Messaggio da PeppeAs95 »

Ghost ha scritto:Come effetto è molto bello ma a cosa potrà mai servire ? :fapensare:
:roll:

ghost, può servire riguardo la parte grafica. E' molto utilizzata nella computer grafica. :roll:
Immagine

Mario: Livello 51Immagine
Luigi: livello 51Immagine
Bowser: livello 40Immagine
Spoiler
Immagine
Immagine
Immagine
Immagine

Avatar utente
nightwish88
GMI Advanced
Messaggi: 1739
Iscritto il: 18/01/2009, 13:41
Contatta:

Re: Curve Bézier

Messaggio da nightwish88 »

oppure se vuoi avere un insieme di punti utili che formano una curva graficamente bella

in questo caso i campi applicabili possono essere svariati, per esempio ad ogni punto può essere applicato un effetto particellare, per creare un buon effetto visivo ( lancio di un incantesimo per esempio )
Immagine

Web Site: AFGames

Avatar utente
Ghost
Membro super
Messaggi: 540
Iscritto il: 08/06/2010, 3:48
Specialità: Programmazione
Località: 63 69 76 69 74 61 76 65 63 63 68 69 61
Contatta:

Re: Curve Bézier

Messaggio da Ghost »

figata

Avatar utente
CaMpIoN
Membro super
Messaggi: 684
Iscritto il: 17/11/2009, 16:20
Specialità: Programmatore
Uso: GM:Studio 1.4 Master
Contatta:

Re: Curve Bézier

Messaggio da CaMpIoN »

up, quoto Xeryan servirebbe anche a me..

EDIT: Ah, riguardo all'applicazione della curva, si può applicare nei movimenti, ad esempio in gioco senza usare for, creando la variabile t e facendola muovere per un tot ogni step si può far muovere un punto un oggetto sulla curva, in questo modo si possono creare anche path curvilinei, e altre robe del genere.

ecco un'esempio: qui
Giochi da me creati:
Spoiler
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 15 ospiti