0%

Bezir Eğrisi üretimi ( C ve OpenGL, glut ile )

bezier

bezier.cview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdlib.h>
#include <GL/glut.h>

#define EKRAN 720

/*
### CC BY-SA Lisansı ###
http://ozgurlisanslar.org.tr/creative-commons/attribution-sharealike-cc-by-sa/
Faruk Can tarafından geliştirildi.
Hakları Saklıdır. ve Faruk Can'a aittir
Lütfen alıntı yaptığınızı belirtiniz.
[email protected]
*/

GLfloat p[4][2] = {
    {-0.9f,0}, // p0
    {0.1f,0.9f}, // p1
    {0.5,0.9f}, // p2
    {0.9f,0} // p3
}; // 4 adet bezier noktası

int hassasiyet = 5; // bezier eğirisinin kaç çizgiden oluşacağını belirler

// fonk - draw - görüntüyü çizer
void draw (void)
{

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // önceki görüntüyü temizle

   bezierEgrisi(hassasiyet);
   bezierNoktalari();

   glFlush();

}//enddraw

// fonk - c - bezier noktalarını oluşturan formül c(t) = p0*(1-t)^3 + 3p1*t*(1-t)^2 + 3p2t^2(1-t) + p3t^3
GLfloat c (
    /* in */ GLfloat t,
    /* in */ int y)
{

    /*out*/ return p[0][y]*(1.0f-t)*(1.0f-t)*(1.0f-t) +
            3*p[1][y]*t*(1.0f-t)*(1.0f-t) +
            3*p[2][y]*t*t*(1.0f-t) +
            p[3][y]*t*t*t;
} //endc

// fonk - bezierEgrisi - bezir egrisi çizer
void bezierEgrisi (
   /* in */        int hassasiyet )
{
   /* cache */    int i;

   glColor3f(1.0, 1.0, 1.0); // beyaz renkte çiz

   glBegin(GL_LINE_STRIP);

    for(i = 0 ; i<=hassasiyet ; i++)
        glVertex3f(c(1.00f*i/hassasiyet,0),c(1.00f*i/hassasiyet,1),0.0f);

   glEnd();
}

// fonk - bezierNoktalari - bezir noktalarını çizer
void bezierNoktalari (
    /* - */ void)
{
   /* cache */ int i;

   glColor3f(1.0, 0.0, 0.0); // kırmızı renkte çiz
   glPointSize(5.0f); // 5kat büyük nokta
   glBegin(GL_POINTS);
    for (i = 0; i < 4; i++)
        glVertex3f(p[i][0],p[i][1],0.0f);
   glEnd();

}

// fonk - farkkare - iki nokta arası farkın karesidir
float farkkare(float x,float y,float m,float n){
    return (m-x)*(m-x) + (n-y)*(n-y);
}

// mouse ün koordinat düzlemini, opengl koordinat düzlemi çevirirler.
float ekran2koorx(float x){
    return (((float)x/(float)EKRAN))*2 -1;
}
float ekran2koory(float x){
    return (((float)x/(float)EKRAN))*-2 + 1;
}

// yeri değiştirmek üzere seçilen noktadır
int secili_nokta=0;
// fonk - mousea tıklandığında en yakın noktayı seçer
void bezir_noktasi_sec( int x, int y){
    float min=2.0f,d;
    int i;
    for (i = 0; i < 4; i++){
        d = farkkare(ekran2koorx(x),ekran2koory(y),p[i][0],p[i][y]);
        printf("fark nokta %f\n",d );

        if( d < min){
            min = d;
            secili_nokta = i;            
        }
    }
    printf("secili nokta %i\n",secili_nokta );
}

// fonk - seçili noktanın koordinatlarını değiştirir
void bezir_noktasi_degistir(int x, int y){
 p[secili_nokta][0] = ekran2koorx(x);
 p[secili_nokta][1] = ekran2koory(y);
}

void keyboard(unsigned char key, int x, int y){
    printf("%c %i | %i %i \n",key,key,x,y );
    if(key==43) hassasiyet+=1; // hassasiyeti arttır + tuşu
    if(key==45) hassasiyet-=1; // hassasiyeti azalt - tuşu
    if(key==104) printf("hassasiyet : %i\n",hassasiyet ); // h tuşu
}
void skeyboard(unsigned char key, int x, int y){
    printf("skey %i | %i %i \n",key,key,x,y );
}

void mouse(int buton,int durum,int x,int y){
    printf("mouse %i %i %i %i\n",buton,durum,x,y );
    if(buton==0 &amp;&amp; durum==0) bezir_noktasi_sec(x,y); // mouse tıklmasında en yakın nokta sec
    else if((buton==0 &amp;&amp; durum==1) ) bezir_noktasi_degistir(x,y); // en yakın noktayı değiştir
}

int main(int argc, char** argv)
{
   glutInit(&amp;argc, argv);
   glutInitDisplayMode (GLUT_ALPHA | GLUT_RGBA);

   glutInitWindowSize (EKRAN, EKRAN); //pencere boyutu
   glutInitWindowPosition (100, 100); // pencerenin ana konumu

   glutCreateWindow (argv[0]);

   glutIdleFunc(draw);
   glutKeyboardFunc(keyboard);
   glutSpecialFunc(skeyboard);
   glutMouseFunc(mouse);

   glutMainLoop();

   return 0;
}