魔方吧·中文魔方俱乐部

 找回密码
 注册
搜索
热搜: 魔方
楼主: cube_master
打印 上一主题 下一主题

一个 java3D 魔方程序的源代码 [复制链接]

Rank: 10Rank: 10Rank: 10

积分
25143
帖子
4870
精华
33
UID
3
性别
兴趣爱好
结构
11#
发表于 2005-3-20 20:00:55 |只看该作者

//center点仅用来计算颜色 void add3DCube(int centerx,int centery,int centerz,TransformGroup myTransGroup) {

//System.out.println("正在画该块.....");

//颜色数据结构 int[]compare=new int[6]; compare[0]=centerx ; //x compare[1]=centerx ; //x compare[2]=centery ; //y compare[3]=centery ; //y compare[4]=centerz ; //z compare[5]=centerz ; //z

int[]compareWith=new int[6]; compareWith[0]=1 ; compareWith[1]=-1 ; compareWith[2]=1 ; compareWith[3]=-1 ; compareWith[4]=1 ; compareWith[5]=-1 ;

Color3f presentMianColor ;

//面图 String presentImageFile; mianImageFile[0]="IMG\\coverRight.jpg"; mianImageFile[1]="IMG\\coverLeft.jpg"; mianImageFile[2]="IMG\\coverUp.jpg"; mianImageFile[3]="IMG\\coverDown.jpg"; mianImageFile[4]="IMG\\coverFront.jpg"; mianImageFile[5]="IMG\\coverBehind.jpg"; mianImageFile[6]="IMG\\coverCenter.jpg";

//点数据结构 Vector3f mianxin=new Vector3f();

Vector3f[]mianxinpianyi=new Vector3f[6]; mianxinpianyi[0]=new Vector3f(1,0,0); mianxinpianyi[1]=new Vector3f(-1,0,0); mianxinpianyi[2]=new Vector3f(0,1,0); mianxinpianyi[3]=new Vector3f(0,-1,0); mianxinpianyi[4]=new Vector3f(0,0,1); mianxinpianyi[5]=new Vector3f(0,0,-1);

Vector3f[]dingdianPianyiX=new Vector3f[4];

dingdianPianyiX[0]=new Vector3f(0.0f,1.0f,1.0f); dingdianPianyiX[1]=new Vector3f(0.0f,-1.0f,1.0f); dingdianPianyiX[2]=new Vector3f(0.0f,-1.0f,-1.0f); dingdianPianyiX[3]=new Vector3f(0.0f,1.0f,-1.0f);

Vector3f[]dingdianPianyiY=new Vector3f[4]; dingdianPianyiY[0]=new Vector3f(1.0f,0.0f,1.0f); dingdianPianyiY[1]=new Vector3f(1.0f,0.0f,-1.0f); dingdianPianyiY[2]=new Vector3f(-1.0f,0.0f,-1.0f); dingdianPianyiY[3]=new Vector3f(-1.0f,0.0f,1.0f);

Vector3f[]dingdianPianyiZ=new Vector3f[4]; dingdianPianyiZ[0]=new Vector3f(1.0f,1.0f,0.0f); dingdianPianyiZ[1]=new Vector3f(-1.0f,1.0f,0.0f); dingdianPianyiZ[2]=new Vector3f(-1.0f,-1.0f,0.0f); dingdianPianyiZ[3]=new Vector3f(1.0f,-1.0f,0.0f);

//通过for,集合到三个数组 Point3f[][] vert=new Point3f[6][4]; Color3f[] color=new Color3f[6]; String[] imageFile=new String[6];

for(int i=0;i<=5;i++) {

//计算该面 颜色和贴图 if(compare==compareWith) { presentMianColor=mianColor; presentImageFile=mianImageFile; } else { presentMianColor=mianColor[6]; presentImageFile=mianImageFile[6]; //如果颜色为白色,不画该面 //continue则跳过不画 //continue ; }

try { //System.in.read();//暂停 } catch(Exception e) { }

//计算该面 面心 mianxin.x=mianxinpianyi.x ; mianxin.y=mianxinpianyi.y ; mianxin.z=mianxinpianyi.z ;

//计算该面 四个点 Vector3f[]dingdian=new Vector3f[4];

for(int j=0;j<=3;j++) {

dingdian[j]=new Vector3f();

if(i==0||i==1) { dingdian[j].x=mianxin.x+dingdianPianyiX[j].x ; dingdian[j].y=mianxin.y+dingdianPianyiX[j].y ; dingdian[j].z=mianxin.z+dingdianPianyiX[j].z ; } else if(i==2||i==3) { dingdian[j].x=mianxin.x+dingdianPianyiY[j].x ; dingdian[j].y=mianxin.y+dingdianPianyiY[j].y ; dingdian[j].z=mianxin.z+dingdianPianyiY[j].z ; } else if(i==4||i==5) { dingdian[j].x=mianxin.x+dingdianPianyiZ[j].x ; dingdian[j].y=mianxin.y+dingdianPianyiZ[j].y ; dingdian[j].z=mianxin.z+dingdianPianyiZ[j].z ; }

}

//用顶点和颜色画 该面

//建面方法一,把vector3D对象传进去,在里面转化为float数组 //Shape3D shape=SomeShape3D.mian1of6CubeShape3D(observer,dingdian,presentImageFile,presentMianColor);

//建面方法二,把vector3D在这里转化为point3f数组,再传进去,转换更简单 Point3f[] vert1=new Point3f[4]; Point3f[] vert2=new Point3f[4]; //4个点的信息 for(int k=0;k<=3;k++) { vert1[k]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[k].x ,SomeShape3D.fangKuaiBanJing*dingdian[k].y,SomeShape3D.fangKuaiBanJing*dingdian[k].z); vert2[3-k]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[k].x ,SomeShape3D.fangKuaiBanJing*dingdian[k].y,SomeShape3D.fangKuaiBanJing*dingdian[k].z); } Shape3D shape1=SomeShape3D.shapeMaker(observer,presentImageFile,vert1); Shape3D shape2=SomeShape3D.shapeMaker(observer,presentImageFile,vert2); //两方法结果一样

//消失现象 可以避免,原因是各面衔接点不重合,dingdian[k].x乘上SomeShape3D.fangKuaiBanJing后有数据问题

//挂到自己的坐标系 myTransGroup.addChild(shape1); myTransGroup.addChild(shape2);

//测试3

// for(int j=0;j<=3;j++) // { // vert[j]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[j].x ,SomeShape3D.fangKuaiBanJing*dingdian[j].y,SomeShape3D.fangKuaiBanJing*dingdian[j].z); // } //color=presentMianColor; // imageFile=presentImageFile;

}

//测试3

// SomeShape3D.box3D(observer,myTransGroup,vert,color,imageFile);

//System.out.println("第"+whickBlockPainted+"块完毕。"); System.out.print('.'); whickBlockPainted++; }

//该块改变位置 //Floor:0,1,2 //totateArg:90 180 -90 //为了方便计算,先平移(坐标全减1),变换后,再平移还原(坐标全加1)

//该块改变位置 //Floor:0,1,2 //totateArg:90 180 -90 //为了方便计算,先平移(坐标全减1),变换后,再平移还原(坐标全加1) void xyzChange(char doType,int mYtotateArg) {

// totateArg=mYtotateArg;

//在处理过程中,原坐标先平移 x-=1 ; y-=1 ; z-=1 ;

//动画预处理 yuanx=x; yuany=y; yuanz=z;

if(closeDonghua) {//startDonghuaX(); } else //换为用线程执行 { selectedC=doType; myThread=new Thread(this,"Rotate"); myThread.start(); }

System.out.println("新轴点x计算并保存。。。"); //新轴点计算并保存 //System.out.println("。。。"+xvec.x+xvec.y+xvec.z); int[] newvecx=jisuanNextXYZ(doType,totateArg,xvec.x,xvec.y,xvec.z); //System.out.println("。。。"); xvec.x=newvecx[0]; xvec.y=newvecx[1]; xvec.z=newvecx[2];

System.out.println("新轴点y计算并保存。。。"); int[] newvecy=jisuanNextXYZ(doType,totateArg,yvec.x,yvec.y,yvec.z); yvec.x=newvecy[0]; yvec.y=newvecy[1]; yvec.z=newvecy[2];

int[] newvecz=jisuanNextXYZ(doType,totateArg,zvec.x,zvec.y,zvec.z); zvec.x=newvecz[0]; zvec.y=newvecz[1]; zvec.z=newvecz[2];

System.out.println("新坐标计算并保存。。。"); //新坐标计算 nexyz=jisuanNextXYZ(doType,totateArg,x,y,z) ;

//输出处理结果 System.out.println("\n块"+(blockIdX-1)+(blockIdY-1)+(blockIdZ-1)+"从"+x+y+z+" 变到 "+nexyz[0]+nexyz[1]+nexyz[2]);

//新坐标保存 x=nexyz[0]+1; y=nexyz[1]+1; z=nexyz[2]+1;

System.out.println("搜寻旋转角度量。。。"); //搜寻旋转角度量

//当前位置x点的偏移 chaxvec=new MyPoint(xvec.x-nexyz[0],xvec.y-nexyz[1],xvec.z-nexyz[2]); //当前位置y点的偏移 chayvec=new MyPoint(yvec.x-nexyz[0],yvec.y-nexyz[1],yvec.z-nexyz[2]); //当前位置z点的偏移 chazvec=new MyPoint(zvec.x-nexyz[0],zvec.y-nexyz[1],zvec.z-nexyz[2]);

System.out.println("---------x点的偏移"+(xvec.x-nexyz[0])+" "+(xvec.y-nexyz[1])+" "+(xvec.z-nexyz[2])); System.out.println("---------y点的偏移"+(yvec.x-nexyz[0])+" "+(yvec.y-nexyz[1])+" "+(yvec.z-nexyz[2])); System.out.println("---------z点的偏移"+(zvec.x-nexyz[0])+" "+(zvec.y-nexyz[1])+" "+(zvec.z-nexyz[2])); //MoFang.myWait();

int[] xZJD=shouSuoXYZRotate(yuanx,yuany,yuanz,nexyz[0],nexyz[1],nexyz[2]);

//重新在3D界面中输出

//1,计算坐标 float fx ; float fy ; float fz ; fx=(float)kuaiZhongXinWeizhi*(x-1); fy=(float)kuaiZhongXinWeizhi*(y-1); fz=(float)kuaiZhongXinWeizhi*(z-1);

//变换量

transp.setTranslation(new Vector3f(fx,fy,fz)); //MoFang.myWait(); transx.rotX(Math.toRadians(xZJD[0]));//anglex transy.rotY(Math.toRadians(xZJD[1])); transz.rotZ(Math.toRadians(xZJD[2]));

//生效 if(closeDonghua) { //变换生效 transGroupx.setTransform(transx); transGroupy.setTransform(transy); transGroupz.setTransform(transz); transGroupp.setTransform(transp); }

//不刷新,在动画后刷新,可以输出了,但在动画后 canNew=true;

//同时更改positionArray MoFang.positionArray[(nexyz[0]+1)][(nexyz[1]+1)][(nexyz[2]+1)].setBlockId(blockIdX,blockIdY,blockIdZ);

}

int getChujiao(int xyzQian,int xyzHou) { int value=0; if((xyzQian==-1)&&(xyzHou==-1)) { value= 3*(-1)*45 ; } else if((xyzQian==-1)&&(xyzHou==1)) { value= 5*(-1)*45 ; } else if((xyzQian==1)&&(xyzHou==-1)) { value= 1*(-1)*45 ; } else if((xyzQian==1)&&(xyzHou==1)) { value= 7*(-1)*45 ; } else if((xyzQian==0)&&(xyzHou==-1)) { value= 2*(-1)*45 ; } else if((xyzQian==0)&&(xyzHou==1)) { value= 6*(-1)*45 ; } else if((xyzQian==-1)&&(xyzHou==0)) { value= 4*(-1)*45 ; } else if((xyzQian==1)&&(xyzHou==0)) { value= 0*(-1)*45 ; } else if((xyzQian==0)&&(xyzHou==0)) System.out.println("中间块,返回任意初角"); else System.out.println("参数错误x="+xyzQian+" y="+xyzHou); return value;

}

}

class Position { int x ; int y ; int z ;

int newx ; int newy ; int newz ; boolean haveNew=false ;

public Position(int i,int j,int k) { x=i ; y=j ; z=k ; }

void setBlockId(int blockIdX,int blockIdY,int blockIdZ) { newx=blockIdX ; newy=blockIdY ; newz=blockIdZ ;

haveNew=true ; //只要设为true,马上会执行newToOld,使他回到false }

void newToOld() { x=newx ; y=newy ; z=newz ;

haveNew=false ; //保证了每一次操作后全为false }

//得到某块u位置 public static int[] getPxyzFromPositionAy(int x,int y,int z,Position[][][] positionArray) { int[] p={0,0,0};

for(int i=0;i<=2;i++) for(int j=0;j<=2;j++) for(int k=0;k<=2;k++) { if ((positionArray[j][k].x==x)&&(positionArray[j][k].y==y)&&(positionArray[j][k].z==z)) {

p[0]=i; p[1]=j; p[2]=k;

return p; }

}

System.out.println("该方块没有对应的位置"); return p; //这里不该返回任何东西,该抛出异常 } }

//Point3f,Vector3f不好用,我自定义的三维变量 class MyPoint {int x; int y; int z; //构造函数一 MyPoint(int getx,int gety,int getz) { x=getx; y=gety; z=getz;

} //构造函数二,转化float为int MyPoint(float getx,float gety,float getz) { x=(int)getx; y=(int)gety; z=(int)getz;

} }

-,'''╭⌒╮⌒╮.',''',,',.'',,','',.,,'
.╱◥██◣''o┈ 魔方吧 ┄o.'',,',.
︱田︱田田︱ '',,',.o┈ 欢迎您光临 ┄o
╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|魔方吧·中文魔方俱乐部

GMT+8, 2025-2-20 06:50

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部