#include <iostream>
#include <math.h>
#include <atlimage.h>
#include <gl\glut.h>
int width = 800, height = 600;
#define MAXVERT 100
int NumVert = 0;
int p[MAXVERT][3];
typedef struct tagPOINT3D {
float x, y, z;
} POINT3D;
#define MAXPOINT 101
POINT3D V[MAXPOINT][MAXPOINT];
float PI = 4.0*atan(1.0);
float gocquayx = 0, gocquayy = 0;
float Factorial(int n)
{
float result = 1.0;
for (int i=2; i<=n; i++)
result *= i;
return result;
}
float Combination(int L, int k)
{
return Factorial(L)/(Factorial(k)*Factorial(L-k));
}
float Blend(int L, int k, float t)
{
return Combination(L,k)*pow(1-t,L-k)*pow(t,k);
}
void VeDuongCongBezier(void)
{
int L = NumVert-1;
int N = 100;
float t, dt = 1.0/N;
float x, y, z;
int n, k;
glColor3f(1,0,0);
glLineWidth(1);
glBegin(GL_LINE_STRIP);
for (n=0; n<=N; n++) {
t = n*dt; x=0; y=0; z=0;
for (k=0; k<=L; k++) {
x += p[k][0]*Blend(L,k,t);
y += p[k][1]*Blend(L,k,t);
}
glVertex3f(x,y,z);
}
glEnd();
return;
}
void VeMatTronXoayBezier(void)
{
glPushMatrix();
glRotatef(gocquayx,1,0,0);
glRotatef(gocquayy,0,1,0);
int L = NumVert-1;
int N = 10;
float v, dv = 1.0/N;
int M = 20;
float u, du = 2*PI/M;
int n, m, k;
float x, y;
glColor3f(1,0,0);
glLineWidth(1);
// Ve duong ngang
for (n=0; n<=N; n++) {
v = n*dv; x=0; y=0;
for (k=0; k<=L; k++) {
x += p[k][0]*Blend(L,k,v);
y += p[k][1]*Blend(L,k,v);
}
glBegin(GL_LINE_STRIP);
for (m=0; m<=M; m++) {
u = m*du;
glVertex3f(x*cos(u),y,x*sin(u));
}
glEnd();
}
// Ve duong doc
N = 20;
dv = 1.0/N;
M = 10;
du = 2*PI/M;
for (m=0; m<=M; m++) {
u = m*du;
glBegin(GL_LINE_STRIP);
for (n=0; n<=N; n++) {
v = n*dv; x = 0; y = 0;
for (k=0; k<=L; k++) {
x += p[k][0]*Blend(L,k,v);
y += p[k][1]*Blend(L,k,v);
}
glVertex3f(x*cos(u),y,x*sin(u));
}
glEnd();
}
glPopMatrix();
return;
}
void KhoiTaoMatTronXoayBezier(void)
{
int L = NumVert-1;
int N = MAXPOINT-1;
float v, dv = 1.0/N;
int M = MAXPOINT-1;
float u, du = 2*PI/M;
int n, m, k;
float x, y;
for (n=0; n<=N; n++) {
v = n*dv; x=0; y=0;
for (k=0; k<=L; k++) {
x += p[k][0]*Blend(L,k,v);
y += p[k][1]*Blend(L,k,v);
}
for (m=0; m<=M; m++) {
u = m*du;
V[n][m].x = x*cos(u);
V[n][m].y = y;
V[n][m].z = x*sin(u);
}
}
return;
}
void ChuanHoa(POINT3D &v)
{
float dodai = sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
v.x = v.x/dodai;
v.y = v.y/dodai;
v.z = v.z/dodai;
return;
}
void PhapVector(POINT3D v1, POINT3D v2, POINT3D v3, POINT3D &N)
{
float A, B, C;
A = v1.y*(v2.z-v3.z) + v2.y*(v3.z-v1.z) + v3.y*(v1.z-v2.z);
B = v1.z*(v2.x-v3.x) + v2.z*(v3.x-v1.x) + v3.z*(v1.x-v2.x);
C = v1.x*(v2.y-v3.y) + v2.x*(v3.y-v1.y) + v3.x*(v1.y-v2.y);
N.x = A;
N.y = B;
N.z = C;
return;
}
bai nón
void KhoiTaoMatNon(float R, float A)
{
int n, N = MAXVERT-1;
float v, dv = 1.0/N;
int m, M = MAXVERT-1;
float PI = 4.0*atan(1.0);
float u, du = 2*PI/M;
for (n=0; n<=N; n++) {
v = n*dv;
for (m=0; m<=M; m++) {
u = m*du;
V[n][m].x = R*(1-v)*cos(u);
V[n][m].y = A*v;
V[n][m].z = R*(1-v)*sin(u);
}
}
return;
}
void VeMatNon(void)
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPushMatrix();
glRotatef(gocquayx,1,0,0);
glRotatef(gocquayy,0,1,0);
int n, N = MAXVERT-1;
int m, M = MAXVERT-1;
POINT3D NV;
for (n=0; n<=N-1; n++)
for (m=0; m<=M-1; m++) {
glBegin(GL_QUADS);
PhapVector(V[n][m],V[n+1][m],V[n+1][m+1],NV);
ChuanHoa(NV);
glNormal3f(NV.x,NV.y,NV.z);
glVertex3f(V[n][m].x,V[n][m].y,V[n][m].z);
glVertex3f(V[n+1][m].x,V[n+1][m].y,V[n+1][m].z);
glVertex3f(V[n+1][m+1].x,V[n+1][m+1].y,V[n+1][m+1].z);
glVertex3f(V[n][m+1].x,V[n][m+1].y,V[n][m+1].z);
glEnd();
}
glPopMatrix();
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
return;
}
void TaoBongMatNon(void)
{
float A=0,B=1,C=0,D=0;
float dx=1,dy=1,dz=1;
float MP[]={B*dy+C*dz,-A*dy,-A*dz,0,
-B*dx,A*dx+C*dz,-B*dz,0,
-C*dx,-C*dy,A*dx+B*dy,0,
-D*dx,-D*dy,-D*dz,A*dx+B*dy+C*dz};
glPushMatrix();
glRotatef(gocquayx,20,0,0);
glMultMatrixf(MP);
glTranslatef(0,100,0);
glRotatef(gocquayx,1,0,0);
glRotatef(gocquayy,0,1,0);
int n, N = MAXVERT-1;
int m, M = MAXVERT-1;
glColor3f(0.7,0.7,0.7);
for (n=0; n<=N-1; n++)
for (m=0; m<=M-1; m++) {
glBegin(GL_QUADS);
glVertex3f(V[n][m].x,V[n][m].y,V[n][m].z);
glVertex3f(V[n+1][m].x,V[n+1][m].y,V[n+1][m].z);
glVertex3f(V[n+1][m+1].x,V[n+1][m+1].y,V[n+1][m+1].z);
glVertex3f(V[n][m+1].x,V[n][m+1].y,V[n][m+1].z);
glEnd();
}
glPopMatrix();
return;
}
bài cầu
void KhoiTaoMatCau(float R, float A)
{
int n, N = MAXVERT-1;
float PI = 4.0*atan(1.0);
float v, dv = PI/N;
int m, M = MAXVERT-1;
float u, du = -2*PI/M;
for (n=-N/2; n<=N/2; n++) {
v = n*dv;
for (m=0; m<=M; m++) {
u = m*du;
V[n+N/2][m].x = R*cos(v)*cos(u);
V[n+N/2][m].y = R*sin(v);
V[n+N/2][m].z = R*cos(v)*sin(u);
}
}
return;
}
void VeMatCau(void)
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPushMatrix();
glRotatef(gocquayx,1,0,0);
glRotatef(gocquayy,0,1,0);
int n, N = MAXVERT-1;
int m, M = MAXVERT-1;
POINT3D NV;
for (n=0; n<=N-1; n++)
for (m=0; m<=M-1; m++) {
glBegin(GL_QUADS);
PhapVector(V[n][m],V[n][m+1],V[n+1][m+1],NV);
ChuanHoa(NV);
glNormal3f(NV.x,NV.y,NV.z);
glVertex3f(V[n][m].x,V[n][m].y,V[n][m].z);
glVertex3f(V[n][m+1].x,V[n][m+1].y,V[n][m+1].z);
glVertex3f(V[n+1][m+1].x,V[n+1][m+1].y,V[n+1][m+1].z);
glVertex3f(V[n+1][m].x,V[n+1][m].y,V[n+1][m].z);
glEnd();
}
glPopMatrix();
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
return;
}
bài trụ
void KhoiTaoMatTru(float R, float A)
{
int n, N = MAXVERT-1;
float v, dv = 1.0/N;
int m, M = MAXVERT-1;
float PI = 4.0*atan(1.0);
float u, du = -2*PI/M;
for (n=0; n<=N; n++) {
v = n*dv;
for (m=0; m<=M; m++) {
u = m*du;
V[n][m].x = R*cos(u);
V[n][m].y = A*v;
V[n][m].z = R*sin(u);
}
}
return;
}