魔方源代码Java Applet小程序.docx
《魔方源代码Java Applet小程序.docx》由会员分享,可在线阅读,更多相关《魔方源代码Java Applet小程序.docx(25页珍藏版)》请在冰豆网上搜索。
![魔方源代码Java Applet小程序.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4a8b2939-ea72-47ac-924a-6201c56d3ac6/4a8b2939-ea72-47ac-924a-6201c56d3ac61.gif)
魔方源代码JavaApplet小程序
importjava.awt.*;
importjava.applet.Applet;
publicfinalclassrubikextendsApplet
{
inti;
intj;
intk;
intn;
into;
intp;
intq;
intlastX;
intlastY;
intdx;
intdy;
intrectX[];
intrectY[];
ColorcolList[];
Colorbgcolor;
finaldoublesideVec[]={0.0,0.0,1.0,0.0,0.0,-1,0.0,-1,0.0,1.0,0.0,0.0,0.0,1.0,0.0,-1,0.0,0.0};
finaldoublecorners[]={-1,-1,-1,1.0,-1,-1,1.0,1.0,-1,-1,1.0,-1,-1,-1,1.0,1.0,-1,1.0,1.0,1.0,1.0,-1,1.0,1.0};
doubletopCorners[];
doublebotCorners[];
finalintsides[]={4,5,6,7,3,2,1,0,0,1,5,4,1,2,6,5,2,3,7,6,0,4,7,3};
finalintnextSide[]={2,3,4,5,4,3,2,5,1,3,0,5,1,4,0,2,1,5,0,3,2,0,4,1};
finalintmainBlocks[]={0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3};
finalinttwistDir[]={-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1};
finalintcolDir[]={-1,-1,1,-1,1,-1};
finalintcircleOrder[]={0,1,2,5,8,7,6,3};
inttopBlocks[];
intbotBlocks[];
intsideCols[];
intsideW;
intsideH;
intdragReg;
inttwistSide;
intnearSide[];
intbuffer[];
doubledragCorn[];
doubledragDir[];
doubleeye[]={0.3651,0.1826,-0.9129};
doubleeX[]={0.9309,-0.0716,0.3581};
doubleeY[];
doubleTeye[];
doubleTeX[];
doubleTeY[];
doublelight[];
doubletemp[]={0.0,0.0,0.0};
doubletemp2[]={0.0,0.0,0.0};
doublenewCoord[];
doublesx;
doublesy;
doublesdxh;
doublesdyh;
doublesdxv;
doublesdyv;
doubled;
doublet1;
doublet2;
doublet3;
doublet4;
doublet5;
doublet6;
doublephi;
doublephibase;
doubleCphi;
doubleSphi;
doublecurrDragDir[];
booleannaturalState;
booleantwisting;
booleanOKtoDrag;
doublelocal0;
Mathm;
GraphicsoffGraphics;
ImageoffImage;
publicvoidinit()
{
offImage=createImage(120,120);
offGraphics=offImage.getGraphics();
rectX=newint[4];
rectY=newint[4];
newCoord=newdouble[16];
dragDir=newdouble[24];
dragCorn=newdouble[96];
topCorners=newdouble[24];
botCorners=newdouble[24];
topBlocks=newint[24];
botBlocks=newint[24];
buffer=newint[12];
nearSide=newint[12];
light=newdouble[3];
Teye=newdouble[3];
TeX=newdouble[3];
TeY=newdouble[3];
currDragDir=newdouble[2];
eY=newdouble[3];
vecProd(eye,0,eX,0,eY,0);
normalize(eY,0);
colList=newColor[120];
for(i=0;i<20;i++)
{
colList[i]=newColor(103+i*8,103+i*8,103+i*8);
colList[i+20]=newColor(i*6,i*6,84+i*9);
colList[i+40]=newColor(84+i*9,i*5,i*5);
colList[i+60]=newColor(i*6,84+i*9,i*6);
colList[i+80]=newColor(84+i*9,84+i*9,i*6);
colList[i+100]=newColor(84+i*9,55+i*8,i*3);
}
sideCols=newint[54];
for(i=0;i<54;i++)
sideCols[i]=i/9;
bgcolor=findBGColor();
resize(125,125);
repaint();
}
publicColorfindBGColor()
{
Colorcolor;
Stringstring2="0123456789abcdef";
intan[]=newint[6];
Stringstring1=getParameter("bgcolor");
if(string1!
=null&&string1.length()==6)
{
for(i=0;i<6;i++)
for(j=0;j<16;j++)
if(string1.charAt(i)==string2.charAt(j))
an[i]=j;
color=newColor(an[0]*16+an[1],an[2]*16+an[3],an[4]*16+an[5]);
}
else
color=Color.lightGray;
returncolor;
}
publicdoublescalProd(doublead1[],inti,doublead2[],intj)
{
returnad1[i]*ad2[j]+ad1[i+1]*ad2[j+1]+ad1[i+2]*ad2[j+2];
}
publicdoublevNorm(doublead[],inti)
{
returnMath.sqrt(ad[i]*ad[i]+ad[i+1]*ad[i+1]+ad[i+2]*ad[i+2]);
}
publicdoublecosAng(doublead1[],inti,doublead2[],intj)
{
returnscalProd(ad1,i,ad2,j)/(vNorm(ad1,i)*vNorm(ad2,j));
}
publicvoidnormalize(doublead[],inti)
{
local0=vNorm(ad,i);
ad[i]=ad[i]/local0;
ad[i+1]=ad[i+1]/local0;
ad[i+2]=ad[i+2]/local0;
}
publicvoidscalMult(doublead[],inti,doubled)
{
ad[i]=ad[i]*d;
ad[i+1]=ad[i+1]*d;
ad[i+2]=ad[i+2]*d;
}
publicvoidaddVec(doublead1[],inti,doublead2[],intj)
{
ad2[j]+=ad1[i];
ad2[j+1]+=ad1[i+1];
ad2[j+2]+=ad1[i+2];
}
publicvoidsubVec(doublead1[],inti,doublead2[],intj)
{
ad2[j]-=ad1[i];
ad2[j+1]-=ad1[i+1];
ad2[j+2]-=ad1[i+2];
}
publicvoidcopyVec(doublead1[],inti,doublead2[],intj)
{
ad2[j]=ad1[i];
ad2[j+1]=ad1[i+1];
ad2[j+2]=ad1[i+2];
}
publicvoidvecProd(doublead1[],inti,doublead2[],intj,doublead3[],intk)
{
ad3[k]=ad1[i+1]*ad2[j+2]-ad1[i+2]*ad2[j+1];
ad3[k+1]=ad1[i+2]*ad2[j]-ad1[i]*ad2[j+2];
ad3[k+2]=ad1[i]*ad2[j+1]-ad1[i+1]*ad2[j];
}
publicvoidcutUpCube()
{
for(i=0;i<24;i++)
{
topCorners[i]=corners[i];
botCorners[i]=corners[i];
}
copyVec(sideVec,3*twistSide,temp,0);
copyVec(temp,0,temp2,0);
scalMult(temp,0,1.3333);
scalMult(temp2,0,0.6667);
for(i=0;i<8;i++)
{
booleanflag=false;
for(j=0;j<4;j++)
if(i==sides[twistSide*4+j])
flag=true;
if(flag)
subVec(temp2,0,botCorners,i*3);
else
addVec(temp,0,topCorners,i*3);
}
for(i=0;i<24;i++)
{
topBlocks[i]=mainBlocks[i];
botBlocks[i]=mainBlocks[i];
}
for(i=0;i<6;i++)
{
if(i==twistSide)
{
botBlocks[i*4+1]=0;
botBlocks[i*4+3]=0;
}
else
{
k=-1;
for(j=0;j<4;j++)
if(nextSide[i*4+j]==twistSide)
k=j;
switch(k)
{
case0:
topBlocks[i*4+3]=1;
botBlocks[i*4+2]=1;
break;
case1:
topBlocks[i*4]=2;
botBlocks[i*4+1]=2;
break;
case2:
topBlocks[i*4+2]=2;
botBlocks[i*4+3]=2;
break;
case3:
topBlocks[i*4+1]=1;
botBlocks[i*4]=1;
break;
case-1:
topBlocks[i*4+1]=0;
topBlocks[i*4+3]=0;
break;
}
}
}
}
publicbooleankeyDown(Eventevent,inti)
{
if(i==114)
{
twisting=false;
naturalState=true;
for(this.i=0;this.i<54;this.i++)
sideCols[this.i]=this.i/9;
repaint();
}
elseif(i==115)
{
twisting=false;
naturalState=true;
for(this.i=0;this.i<20;this.i++)
colorTwist((int)(Math.random()*6),(int)(Math.random()*3+1.0));
repaint();
}
returnfalse;
}
publicbooleanmouseDrag(Eventevent,inti,intj)
{
if(!
twisting&&OKtoDrag)
{
OKtoDrag=false;
booleanflag=false;
for(this.i=0;this.i{
doubled1=dragCorn[this.i*8+1]-dragCorn[this.i*8];
doubled2=dragCorn[this.i*8+5]-dragCorn[this.i*8+4];
doubled3=dragCorn[this.i*8+3]-dragCorn[this.i*8];
doubled4=dragCorn[this.i*8+7]-dragCorn[this.i*8+4];
doubled5=(d4*((double)lastX-dragCorn[this.i*8])-d3*((double)lastY-dragCorn[this.i*8+4]))/(d1*d4-d3*d2);
doubled6=(-d2*((double)lastX-dragCorn[this.i*8])+d1*((double)lastY-dragCorn[this.i*8+4]))/(d1*d4-d3*d2);
if(d5>0.0&&d5<1.0&&d6>0.0&&d6<1.0)
{
currDragDir[0]=dragDir[this.i*2];
currDragDir[1]=dragDir[this.i*2+1];
d=currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY);
d=d*d/((currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1])*((i-lastX)*(i-lastX)+(j-lastY)*(j-lastY)));
if(d>0.6)
{
flag=true;
twistSide=nearSide[this.i];
this.i=100;
}
}
}
if(flag)
{
if(naturalState)
{
cutUpCube();
naturalState=false;
}
twisting=true;
phi=0.02*(currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY))/Math.sqrt(currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1]);
repaint();
returnfalse;
}
}
OKtoDrag=false;
if(!
twisting)
{
dx=lastX-i;
copyVec(eX,0,temp,0);
scalMult(temp,0,(double)dx*0.016);
addVec(temp,0,eye,0);
vecProd(eY,0,eye,0,eX,0);
normalize(eX,0);
normalize(eye,0);
dy=j-lastY;
copyVec(eY,0,temp,0);
scalMult(temp,0,(double)dy*0.016);
addVec(temp,0,eye,0);
vecProd(eye,0,eX,0,eY,0);
normalize(eY,0);
normalize(eye,0);
lastX=i;
lastY=j;
repaint();
}
else
{
phi=0.02*(currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY))/Math.sqrt(currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1]);
repaint();
}
returnfalse;
}
publicbooleanmouseDown(Eventevent,inti,intj)
{
lastX=i;
lastY=j;
OKtoDrag=true;
returnfalse;
}
publicbooleanmouseUp(Eventevent,inti,intj)
{
if(twisting)
{
doubled;
twisting=false;
phibase+=phi;
phi=0.0;
for(d=phibase;d<0.0;d+=125.662)/*nullbody*/;
intk=(int)(d*3.183);
if(k%5==0||k%5==4)
{
k=(k+1)/5%4;
if(colDir[twistSide]<0)
k=(4-k)%4;
phibase=0.0;
naturalState=true;
colorTwist(twistSide,k);
}
repaint();
}
returnfalse;
}
publicvoidcolorTwist(inti1,intj1)
{
intk4=0;
intj4=j1*2;
for(intk1=0;k1<8;k1++)
{
buffer[j4]=sideCols[i1*9+circleOrder[k1]];
j4=(j4+1)%8;
}
for(inti2=0;i2<8;i2++)
sideCols[i1*9+circleOrder[i2]]=buffer[i2];
j4=j1*3;
for(intj2=0;j2<4;j2++)
{
for(inti3=0;i3<4;i3++)
if(nextSide[nextSide[i1*4+j2]*4+i3]==i1)
k4=i3;
for(intj3=0;j3<3;j3++)
{
switch(k4)
{
case0:
buffer[j4]=sideCols[nextSide[i1*4+j2]*9+j3];
break;
case1:
buffer[j4]=sideCols[nextSide[i1*4+j2]*9+2+3*j3];
break;
case2:
buffer[j4]