Code:
#include "graphics.h"
#include "math.h"
#include "conio.h"
#include "dos.h"
#define pi 3.141592
typedef struct R2 {
int x,y;
};
typedef struct R3{
float x,y,z;
};
typedef R3 VatThe[39];
float xd,yd,zd;
void ToaDoDiemVatThe(float k,float l,float i,VatThe p) {
p[1].x=0; ;p[1].y=0 ;p[1].z=0-2*i;
p[2].x=0 ;p[2].y=60-k ;p[2].z=20-i;
p[3].x=-30+k ;p[3].y=50-k ;p[3].z=20-i;
p[4].x=-50+k ;p[4].y=30-k ;p[4].z=20-i;
p[5].x=-60+k ;p[5].y=0 ;p[5].z=20-i;
p[6].x=-50+k ;p[6].y=-30+k ;p[6].z=20-i;
p[7].x=-30+k ;p[7].y=-50+k ;p[7].z=20-i;
p[8].x=0 ;p[8].y=-60+k ;p[8].z=20-i;
p[9].x=30-k ;p[9].y=-50+k ;p[9].z=20-i;
p[10].x=50-k ;p[10].y=-30+k ;p[10].z=20-i;
p[11].x=60-k ;p[11].y=0 ;p[11].z=20-i;
p[12].x=50-k ;p[12].y=30-k ;p[12].z=20-i;
p[13].x=30-k ;p[13].y=50-k ;p[13].z=20-i;
p[14].x=0 ;p[14].y=60-l ;p[14].z=50;
p[15].x=-30+l ;p[15].y=50-l ;p[15].z=50;
p[16].x=-50+l ;p[16].y=30-l ;p[16].z=50;
p[17].x=-60+l ;p[17].y=0 ;p[17].z=50;
p[18].x=-50+l ;p[18].y=-30+l ;p[18].z=50;
p[19].x=-30+l ;p[19].y=-50+l ;p[19].z=50;
p[20].x=0 ;p[20].y=-60+l ;p[20].z=50;
p[21].x=30-l ;p[21].y=-50+l ;p[21].z=50;
p[22].x=50-l ;p[22].y=-30+l ;p[22].z=50;
p[23].x=60-l ;p[23].y=0 ;p[23].z=50;
p[24].x=50-l ;p[24].y=30-l ;p[24].z=50;
p[25].x=30-l ;p[25].y=50-l ;p[25].z=50;
p[26].x=0 ;p[26].y=60-k ;p[26].z=80+i;
p[27].x=-30+k ;p[27].y=50-k ;p[27].z=80+i;
p[28].x=-50+k ;p[28].y=30-k ;p[28].z=80+i;
p[29].x=-60+k ;p[29].y=0 ;p[29].z=80+i;
p[30].x=-50+k ;p[30].y=-30+k ;p[30].z=80+i;
p[31].x=-30+k ;p[31].y=-50+k ;p[31].z=80+i;
p[32].x=0 ;p[32].y=-60+k ;p[32].z=80+i;
p[33].x=30-k ;p[33].y=-50+k ;p[33].z=80+i;
p[34].x=50-k ;p[34].y=-30+k ;p[34].z=80+i;
p[35].x=60-k ;p[35].y=0 ;p[35].z=80+i;
p[36].x=50-k ;p[36].y=30-k ;p[36].z=80+i;
p[37].x=30-k ;p[37].y=50-k ;p[37].z=80+i;
p[38].x=0 ;p[38].y=0 ;p[38].z=100+2*i;
}
void PhepChieu() {
xd=0.4;
yd=-0.894;
zd=0.224;
}
void BienDoi(VatThe p,int x,int y){
for(int i=1;i<=38;i++) {
p[i].x=p[i].y*(xd/yd) +p[i].x+x;
p[i].z=p[i].y*(zd/yd) +p[i].z+y;
}
}
void PhepXoay(int l,VatThe p, VatThe v) {
float k;
k=l*pi/180;
for(int i=1; i<=38; i++) {
v[i].x = cos(k)*p[i].x +sin(k)*p[i].y;
v[i].y = -sin(k)*p[i].x +cos(k)*p[i].y;
v[i].z = p[i].z;
}
}
void VeVatThe(VatThe v) {
for(int i=2; i<=13; i++) {
line(v[1].x,v[1].z,v[i].x,v[i].z);
line(v[38].x,v[38].z,v[i+24].x,v[i+24].z);
line(v[i].x,v[i].z,v[i+12].x,v[i+12].z);
line(v[i+12].x,v[i+12].z,v[i+24].x,v[i+24].z);
if (i<=12) {
line(v[i].x,v[i].z,v[i+1].x,v[i+1].z);
line(v[i+12].x,v[i+12].z,v[i+1+12].x,v[i+1+12].z);
line(v[i+24].x,v[i+24].z,v[i+1+24].x,v[i+1+24].z);
}
}
line(v[2].x,v[2].z,v[13].x,v[13].z);
line(v[2+12].x,v[2+12].z,v[13+12].x,v[13+12].z);
line(v[2+24].x,v[2+24].z,v[13+24].x,v[13+24].z);
}
/*********** Mot so ham su ly chuot ***********/
void MouseReset() {
asm {
mov ax,0h
int 33h
}
}
void MouseShow() {
asm {
mov ah,0
mov al,1
int 33h
}
}
void MouseHide() {
asm {
mov ah,0
mov al,2
int 33h
}
}
char LeftMouseOnDown() {
char k=0;
asm {
mov ah,0
mov al,3
int 33h
and bx,0000000000000001b
mov k,bl
}
return k;
}
char RightMouseOnDown() {
char k=0;
asm {
mov ah,0
mov al,3
int 33h
shr bx,1
and bx,0000000000000001b
mov k,bl
}
return k;
}
R2 GetMousePostion() {
R2 p;
int x,y;
asm {
mov ah,3
int 33h
mov x,cx
mov y,dx
}
p.x = x;
p.y = y;
return p;
}
/****************************************/
void main() {
clrscr();
int gm,gd= DETECT;
R2 getMouse,getMouseSave;
char Thoat = 0, TaoVat = 0, KhoiTao =1, Tao =0, Xoay = 0;
char ThoatXoay=0;
initgraph(&gd,&gm,"c:\\tc\\bgi");
VatThe Vat,Vat1;
PhepChieu();
setfillstyle(6,2);
bar3d(5,5,75,25,2,2);
outtextxy(10,10,"Tao Vat");
bar3d(5,30,75,50,2,2);
outtextxy(10,35,"Dung");
bar3d(5,55,75,75,2,2);
outtextxy(10,60,"Xoay Vat");
bar3d(5,80,75,100,2,2);
outtextxy(10,85,"Khoi Tao");
bar3d(5,105,75,125,2,2);
outtextxy(10,110,"Ket Thuc");
MouseReset();
MouseShow();
while( Thoat == 0) {
getMouse = GetMousePostion();
//ket thuc
if ((LeftMouseOnDown()!=0)&& ((getMouse.x >5)
&&(getMouse.x<75)&&(getMouse.y>105)&&(getMouse.y<125)))
Thoat = 1;
//khoi tao
if ((LeftMouseOnDown()!=0)&&(KhoiTao==0)&&(Thoat==0)&&(Tao==1)&&((getMouse.x>5)
&&(getMouse.x<75)&&(getMouse.y>80)&&(getMouse.y<100)))
{
setcolor(0);
VeVatThe(Vat1);
setcolor(15);
outtextxy(10,10,"Tao Vat");
outtextxy(10,35,"Dung");
outtextxy(10,85,"Khoi Tao");
outtextxy(10,110,"Ket Thuc");
ThoatXoay = 0;
TaoVat = 0;
KhoiTao = 1;
Tao =0;
Xoay = 0;
}
//Khoi tao chon vat
if ((LeftMouseOnDown()!=0)&&(Thoat==0)&&(TaoVat==0)&&
(KhoiTao==1)&&((getMouse.x>5)
&&(getMouse.x<75)&&(getMouse.y>5)&&(getMouse.y<125)))
{
setcolor(14);
outtextxy(10,10,"Tao Vat");
TaoVat = 1;
KhoiTao =0;
}
//Tao Vat khi click chuot
if ((LeftMouseOnDown()!=0)&&(TaoVat==1)&&(Tao==0)&&(Xoay ==0)&& !((getMouse.x >0)
&&(getMouse.x<75)&&(getMouse.y>0)&&(getMouse.y<125))) {
ToaDoDiemVatThe(0,-20,10,Vat);
BienDoi(Vat,getMouse.x,getMouse.y+40);
getMouseSave.x=getMouse.x;
getMouseSave.y=getMouse.y+40;
setcolor(RED);
VeVatThe(Vat);
Tao = 1;
}
/*if ((LeftMouseOnDown()!=0)&&(Xoay==0)&&(TaoVat==1)&&(Tao==1)&&((getMouse.x >0)
&&(getMouse.x<75)&&(getMouse.y>55)&&(getMouse.y<75)))
{
Xoay = 1;
} */
if ((LeftMouseOnDown()!=0)&&(Xoay==0)&&(TaoVat==1)&&(Tao==1)&&
((getMouse.x >0)&&(getMouse.x<75)&&(getMouse.y>55)&&(getMouse.y<75)))
{
setcolor(14);
outtextxy(10,60,"Xoay Vat");
outtextxy(10,85,"Khoi Tao");
int arg =0;
ToaDoDiemVatThe(0,-20,10,Vat);
ToaDoDiemVatThe(0,-20,10,Vat1);
BienDoi(Vat1,getMouseSave.x,getMouseSave.y);
while(ThoatXoay==0) {
getMouse = GetMousePostion();
if ((LeftMouseOnDown()!=0)&& (getMouse.x >5)
&&(getMouse.x<75)&&(getMouse.y>30)&&(getMouse.y<50)) {
ThoatXoay =1;
}
if ((LeftMouseOnDown()!=0)&& ((getMouse.x >5)
&&(getMouse.x<75)&&(getMouse.y>105)&&(getMouse.y<125)))
{
Thoat = 1;
ThoatXoay =1;
}
if(RightMouseOnDown()!=0) ThoatXoay =1;
setcolor(0);
VeVatThe(Vat1);
arg++;
PhepXoay(arg,Vat,Vat1);
BienDoi(Vat1,getMouseSave.x,getMouseSave.y);
setcolor(RED);
VeVatThe(Vat1);
delay(20);
if (arg == 360) arg = 0;
}
TaoVat = 0;
}
}
closegraph();
MouseHide();
}