论坛: 编程破解 标题: 三维旋转源程序 复制本贴地址    
作者: 286 [unique]    版主   登录
#include "graphics.h"
#include "conio.h"
#include "stdio.h"
#include "process.h"
#include "stdlib.h"
#include "dos.h"
#include "math.h"
#define UP    328
#define DOWN  336
#define LEFT  331
#define RIGHT 333
#define PGUP  329
#define PGDN  337
#define ESC    27
#define DELAY  1800  /*注意,不同主机速度不一样,可修改此值调整旋转速度*/

void InitGra();
void FillScr();
void Quit();
void DrawLine(int);
void SdToEd(int i,int x,int y,int z,float a1,float a2,float a3,int mx,int my,int
mz,int d);
int GetKey();
void Move(float,float,float,int);
void PutHz(int,int);

struct ThreeD
{/*8个点的三维坐标*/
int x;
int y;
int z;
} Sd[8]={{-70, 70,-70},{-70, 70, 70},
{-70,-70,-70},{-70,-70, 70},
{ 70, 70,-70},{ 70, 70, 70},
{ 70,-70,-70},{ 70,-70, 70}};
struct TwoD
{/*8个点的二维坐标*/
int x;
int y;
} Ed[8];
int i,j;
int Ch;
float a1=0.0,a2=0.0,a3=0.0;
int mx=200,my=200,mz=100,d=1;

void main()
{

InitGra();/*初始化图形*/
FillScr();/*填充屏幕背景*/
for(j=0;j<103;j++)
{
a1+=0.0628319,a2+=0.0628319,a3+=0.0628319;
Move(a1,a2,a3,500);/*自动三维旋转*/
}
for(;;){
Ch=GetKey();/*printf("%d  ",Ch);*/
switch(Ch)
{/*上下水平转;左右上下转;PGUP,PGDN前后转.*/
  case ESC  :Quit();
  case UP    :for(j=0;j<10;j++){a2+=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
  case DOWN  :for(j=0;j<10;j++){a2-=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
  case LEFT  :for(j=0;j<10;j++){a1+=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
  case RIGHT :for(j=0;j<10;j++){a1-=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
  case PGUP  :for(j=0;j<10;j++){a3+=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
  case PGDN  :for(j=0;j<10;j++){a3-=0.628319;Move(a1,a2,a3,900);}delay(DELAY);break;
}
}
}
void Move(float a1,float a2,float a3,int time)
{
DrawLine(15);
for(i=0;i<8;i++) SdToEd(i,Sd[i].x,Sd[i].y,Sd[i].z,a1,a2,a3,mx,my,mz,d);
DrawLine(4);
delay(time);/*printf("%d ",j);*/
}
void SdToEd(int i,int x,int y,int z,float a1,float a2,float a3,int mx,int my,int
mz,int d)
{
int xa,ya,za;
int sx,sy;
xa=cos(a1)*x-sin(a1)*z;
za=sin(a1)*x+cos(a1)*z;
x=cos(a2)*xa+sin(a2)*y;
ya=cos(a2)*y-sin(a2)*xa;
z=cos(a3)*za-sin(a3)*ya;
y=sin(a3)*za+cos(a3)*ya;

x=x+mx;
y=y+my;
z=z+mz;

/*sx=d*x/z;
sy=d*y/z;*/

Ed[i].x=x;
Ed[i].y=y;
}
void DrawLine(int Color)
{
setcolor(Color);

line(Ed[0].x,Ed[0].y,Ed[1].x,Ed[1].y);
line(Ed[0].x,Ed[0].y,Ed[2].x,Ed[2].y);
line(Ed[1].x,Ed[1].y,Ed[3].x,Ed[3].y);
line(Ed[2].x,Ed[2].y,Ed[3].x,Ed[3].y);

line(Ed[4].x,Ed[4].y,Ed[5].x,Ed[5].y);
line(Ed[4].x,Ed[4].y,Ed[6].x,Ed[6].y);
line(Ed[5].x,Ed[5].y,Ed[7].x,Ed[7].y);
line(Ed[6].x,Ed[6].y,Ed[7].x,Ed[7].y);

line(Ed[0].x,Ed[0].y,Ed[4].x,Ed[4].y);
line(Ed[1].x,Ed[1].y,Ed[5].x,Ed[5].y);
line(Ed[2].x,Ed[2].y,Ed[6].x,Ed[6].y);
line(Ed[3].x,Ed[3].y,Ed[7].x,Ed[7].y);
}
void InitGra()
{
int GraphDriver=DETECT,GraphMode;
/*registerbgidriver(EGAVGA_driver);
registerbgifont(small_font);
registerbgifont(gothic_font);*/
initgraph(&GraphDriver,&GraphMode,"");
}
void FillScr()
{
setfillpattern(3,5);
bar(0,0,639,529);
setfillstyle(1,15);
bar(50,50,400,350);
setcolor(1);
line(55,55,395,55);
line(55,55,55,345);
line(55,345,395,345);
line(395,55,395,345);
setfillstyle(1,7);
bar(450,50,600,350);
setcolor(DARKGRAY);
line(455,55,595,55);
line(455,55,455,345);
setcolor(WHITE);
line(455,345,595,345);
line(595,55,595,345);
setfillstyle(1,7);
bar(50,375,600,450);
setfillpattern(9,1);
bar(113,383,537,441);
setcolor(14);
settextstyle(4,0,6);
outtextxy(220,380,"3-D stdio");
setcolor(1);
settextstyle(2,0,6);
outtextxy(470,100,"HotKey:");
setcolor(4);
settextstyle(2,0,4);
outtextxy(470,125,"Up  :Left  turn  ");
outtextxy(470,140,"Down :Right turn  ");
outtextxy(470,155,"Left :Left  rotate");
outtextxy(470,170,"Right:Right rotate");
outtextxy(470,185,"PgUP :Fore  turn  ");
outtextxy(470,200,"PgDn :Back  turn  ");
outtextxy(470,215,"ESC  :Quit        ");
setcolor(9);
settextstyle(2,0,4);
outtextxy(465,270,"copyright(c) by");
outtextxy(540,330,"1996.8.1");
PutHz(470,290);
}
void Quit()
{
closegraph();
exit(0);
}
int GetKey()
{
int Hig,Low,Ch;
Ch=bioskey(0);
Low=Ch&0x00ff;
Hig=(Ch&0xff00)>>8;
return(Low==0?Hig+256:Low);
}
void PutHz(int x,int y)
{
        setcolor(14);
settextstyle(4,0,4);
outtextxy(480,290,"Unique");
}

地主 发表时间: 10/17 09:49

回复: jilian [jilian]   论坛用户   登录
头都转大了

B1层 发表时间: 10/17 12:06

回复: ceo_8008 [ceo_8008]   论坛用户   登录
虽然那块东西有点粗糙

嘿嘿~~~286不知道什么是美女

但对程序却是十分的感谢

建议286课余时间去学美术欣赏

哈哈~~~~~

B2层 发表时间: 10/17 12:42

回复: flyfalcon [flyfalcon]      登录
同意啊,呵呵

B3层 发表时间: 10/18 19:27

回复: baixiankai [baixiankai]   论坛用户   登录
哈哈!~从TTY这里得知20CN,很就以前来过几次,想不到这么久没来变热闹啦
286 大哥 呕心励血 让大家看,大家应该尊重他啊!~(下面倒了一大片)
不过,写的这么长,别人一看这个长度就不敢恭维啦!~
建议以后一天公布一点点,免得让人看了害怕

B4层 发表时间: 10/18 21:20

回复: 286 [unique]   版主   登录
我这可是真刀真枪一点点算出来的,没任何图形驱动支持,所以是粗糙了点。
至于代码,如果你看过我系列程序,很多都是相同的,所以也不会感觉太长。
不过,说实在的,我看了长代码也头晕。

B5层 发表时间: 10/21 11:12

回复: ceo_8008 [ceo_8008]   论坛用户   登录
宏定义就那么一大堆

其实是很少的了

要搞工程的话・・・

B6层 发表时间: 10/21 12:00

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号