?? mofang.java
字號(hào):
//System.in.read();//暫停
//
myThread.sleep(donghuaDelay);
}
catch(Exception e)
{
}
//在這里才放出令牌
selectDonghuaId++;
selectDonghuaId%=9;
}
}
void startDonghuaY()
{
//動(dòng)畫模塊
int chuJiao ;
int oneTime ;
int bianJiao ;
int nowJiao ;
//測試
//totateArg=90;
chuJiao=getChujiao(yuanz,yuanx);
if(totateArg==-90)
oneTime=-15 ;
else
oneTime=15 ;
//System.out.println("chuJiao="+chuJiao);
//System.out.println("totateArg="+totateArg);
//nowJiao=chuJiao+bianJiao ;
//這是目前角度公式,可見,據(jù)坐標(biāo)可以判斷它的角度嘛
for(bianJiao=0;bianJiao!=(totateArg+oneTime);bianJiao+=oneTime)
{
if(!closeDonghua)
{
while(myDonghuaId!=selectDonghuaId)//動(dòng)畫同步相關(guān)輪到自己時(shí)才執(zhí)行,把令牌交給下一個(gè)
{;//System.out.println("我是"+myDonghuaId+"號(hào),而令牌現(xiàn)在是"+selectDonghuaId+"號(hào),我要等...");
try
{
//System.in.read();//暫停
myThread.sleep(whileDelay);
}
catch(Exception e)
{
}
}
}
//計(jì)算x,y和角度輸出
float fx ;
float fy ;
float fz ;
//半徑
float r;
if(yuanz==0&&yuanx==0)
r=0;//(x,y)不變,故不用計(jì)算,直接給(0,0),初角返回任何值都可;
else
{
if(yuanz==0||yuanx==0)
r=1.0f;
else
r=1.414f;
}
nowJiao=chuJiao+bianJiao ;
//使用初角直為了計(jì)算當(dāng)前(x,y)位置,當(dāng)前jiaodu1與他無關(guān),只與老角有關(guān)
//(-1,-1)距離原點(diǎn)為根2,約1.732
//0.3指定了1點(diǎn)在0.3,-0.3處
fz=(float)kuaiZhongXinWeizhi*r*(float)Math.cos(Math.PI*nowJiao/180);
fx=(float)kuaiZhongXinWeizhi*r*(float)Math.sin(Math.PI*nowJiao/180);
fy=(float)kuaiZhongXinWeizhi*(yuany);
//z坐標(biāo)不變,這里的z早減過了1
//計(jì)算出了全部數(shù)據(jù),OK,開始刷新
//用變換量
//transz.rotZ(Math.toRadians(anglez));
//transy.rotY(Math.toRadians(bianJiao+oldJiaoDu));
//transx.rotX(Math.toRadians(anglex));
transp.setTranslation(new Vector3f(fx,fy,fz));
//生效
//transGroupz.setTransform(transz);
//transGroupy.setTransform(transy);
//transGroupx.setTransform(transx);
transGroupp.setTransform(transp);
//停不了,只能使用多線程或定時(shí)
//System.out.println("bianJiao="+bianJiao);
try
{
//System.in.read();//暫停
//
myThread.sleep(donghuaDelay);
}
catch(Exception e)
{
}
//在這里才放出令牌
selectDonghuaId++;
selectDonghuaId%=9;
}
}
void startDonghuaZ()
{
//動(dòng)畫模塊
int chuJiao ;
int oneTime ;
int bianJiao ;
int nowJiao ;
//測試
//totateArg=90;
chuJiao=getChujiao(yuanx,yuany);
if(totateArg==-90)
oneTime=-15 ;
else
oneTime=15 ;
//System.out.println("chuJiao="+chuJiao);
//System.out.println("totateArg="+totateArg);
//nowJiao=chuJiao+bianJiao ;
//這是目前角度公式,可見,據(jù)坐標(biāo)可以判斷它的角度嘛
for(bianJiao=0;bianJiao!=(totateArg+oneTime);bianJiao+=oneTime)
{
if(!closeDonghua)
{
while(myDonghuaId!=selectDonghuaId)//動(dòng)畫同步相關(guān)輪到自己時(shí)才執(zhí)行,把令牌交給下一個(gè)
{;//System.out.println("我是"+myDonghuaId+"號(hào),而令牌現(xiàn)在是"+selectDonghuaId+"號(hào),我要等...");
try
{
//System.in.read();//暫停
myThread.sleep(whileDelay);
}
catch(Exception e)
{
}
}
}
//計(jì)算x,y和角度輸出
float fx ;
float fy ;
float fz ;
//半徑
float r;
if(yuanx==0&&yuany==0)
r=0;//(x,y)不變,故不用計(jì)算,直接給(0,0),初角返回任何值都可;
else
{
if(yuanx==0||yuany==0)
r=1.0f;
else
r=1.414f;
}
nowJiao=chuJiao+bianJiao ;
//使用初角直為了計(jì)算當(dāng)前(x,y)位置,當(dāng)前jiaodu1與他無關(guān),只與老角有關(guān)
//(-1,-1)距離原點(diǎn)為根2,約1.732
//0.3指定了1點(diǎn)在0.3,-0.3處
fx=(float)kuaiZhongXinWeizhi*r*(float)Math.cos(Math.PI*nowJiao/180);
fy=(float)kuaiZhongXinWeizhi*r*(float)Math.sin(Math.PI*nowJiao/180);
fz=(float)kuaiZhongXinWeizhi*(yuanz);
//z坐標(biāo)不變,這里的z早減過了1
//計(jì)算出了全部數(shù)據(jù),OK,開始刷新
//用變換量
//transz.rotZ(Math.toRadians());
//transy.rotY(Math.toRadians());
//transx.rotX(Math.toRadians());
transp.setTranslation(new Vector3f(fx,fy,fz));
//生效
//transGroupz.setTransform(transz);
//transGroupy.setTransform(transy);
//transGroupx.setTransform(transx);
transGroupp.setTransform(transp);
//停不了,只能使用多線程或定時(shí)
//System.out.println("bianJiao="+bianJiao);
try
{
//System.in.read();//暫停
//
myThread.sleep(donghuaDelay);
}
catch(Exception e)
{
}
//在這里才放出令牌
selectDonghuaId++;
selectDonghuaId%=9;
}
}
//center點(diǎn)僅用來計(jì)算顏色
void add3DCube(int centerx,int centery,int centerz,TransformGroup myTransGroup)
{
//System.out.println("正在畫該塊.....");
//顏色數(shù)據(jù)結(jié)構(gòu)
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";
//點(diǎn)數(shù)據(jù)結(jié)構(gòu)
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,集合到三個(gè)數(shù)組
Point3f[][] vert=new Point3f[6][4];
Color3f[] color=new Color3f[6];
String[] imageFile=new String[6];
for(int i=0;i<=5;i++)
{
//計(jì)算該面 顏色和貼圖
if(compare[i]==compareWith[i])
{
presentMianColor=mianColor[i];
presentImageFile=mianImageFile[i];
}
else
{
presentMianColor=mianColor[6];
presentImageFile=mianImageFile[6];
//如果顏色為白色,不畫該面
//continue則跳過不畫
//continue ;
}
try
{
//System.in.read();//暫停
}
catch(Exception e)
{
}
//計(jì)算該面 面心
mianxin.x=mianxinpianyi[i].x ;
mianxin.y=mianxinpianyi[i].y ;
mianxin.z=mianxinpianyi[i].z ;
//計(jì)算該面 四個(gè)點(diǎn)
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 ;
}
}
//用頂點(diǎn)和顏色畫 該面
//建面方法一,把vector3D對(duì)象傳進(jìn)去,在里面轉(zhuǎn)化為float數(shù)組
//Shape3D shape=SomeShape3D.mian1of6CubeShape3D(observer,dingdian,presentImageFile,presentMianColor);
//建面方法二,把vector3D在這里轉(zhuǎn)化為point3f數(shù)組,再傳進(jìn)去,轉(zhuǎn)換更簡單
Point3f[] vert1=new Point3f[4];
Point3f[] vert2=new Point3f[4];
//4個(gè)點(diǎn)的信息
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);
//兩方法結(jié)果一樣
//消失現(xiàn)象 可以避免,原因是各面銜接點(diǎn)不重合,dingdian[k].x乘上SomeShape3D.fangKuaiBanJing后有數(shù)據(jù)問題
//掛到自己的坐標(biāo)系
myTransGroup.addChild(shape1);
myTransGroup.addChild(shape2);
//測試3
// for(int j=0;j<=3;j++)
// {
// vert[i][j]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[j].x ,SomeShape3D.fangKuaiBanJing*dingdian[j].y,SomeShape3D.fangKuaiBanJing*dingdian[j].z);
// }
//color[i]=presentMianColor;
// imageFile[i]=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
//為了方便計(jì)算,先平移(坐標(biāo)全減1),變換后,再平移還原(坐標(biāo)全加1)
//該塊改變位置
//Floor:0,1,2
//totateArg:90 180 -90
//為了方便計(jì)算,先平移(坐標(biāo)全減1),變換后,再平移還原(坐標(biāo)全加1)
void xyzChange(char doType,int mYtotateArg)
{
//
totateArg=mYtotateArg;
//在處理過程中,原坐標(biāo)先平移
x-=1 ;
y-=1 ;
z-=1 ;
//動(dòng)畫預(yù)處理
yuanx=x;
yuany=y;
yuanz=z;
if(closeDonghua)
{//startDonghuaX();
}
else
//換為用線程執(zhí)行
{
selectedC=doType;
myThread=new Thread(this,"Rotate");
myThread.start();
}
System.out.println("新軸點(diǎn)x計(jì)算并保存。。。");
//新軸點(diǎn)計(jì)算并保存
//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("新軸點(diǎn)y計(jì)算并保存。。。");
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("新坐標(biāo)計(jì)算并保存。。。");
//新坐標(biāo)計(jì)算
nexyz=jisuanNextXYZ(doType,totateArg,x,y,z) ;
//輸出處理結(jié)果
System.out.println("\n塊"+(blockIdX-1)+(blockIdY-1)+(blockIdZ-1)+"從"+x+y+z+" 變到 "+nexyz[0]+nexyz[1]+nexyz[2]);
//新坐標(biāo)保存
x=nexyz[0]+1;
y=nexyz[1]+1;
z=nexyz[2]+
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -