mysimpleuniverse.java
来自「java2参考大全上的例子的源码和自己的理解.」· Java 代码 · 共 1,951 行 · 第 1/5 页
JAVA
1,951 行
//返回结果
nextXYZ[0] = newx;
nextXYZ[1] = newy;
nextXYZ[2] = newz;
//System.out.println("\n变为位置:"+newx+newy+newz);
return nextXYZ;
}
//
//System.out.println("\n原位置:"+oldx+oldy+oldz);
//System.out.println("绕:"+doType+"转"+totateArg);
switch (doType) {
case 'Z':
newz = oldz;
if (totateArg == 90) {
myShunShiNext = quXiaYiGe(oldx, oldy, 1);
}
else if (totateArg == 180) {
myShunShiNext = quXiaYiGe(oldx, oldy, 2);
}
else if (totateArg == -90) {
myShunShiNext = quXiaYiGe(oldx, oldy, 3);
}
newx = myShunShiNext[0];
newy = myShunShiNext[1];
break;
case 'Y':
newy = oldy;
if (totateArg == 90) {
myShunShiNext = quXiaYiGe(oldz, oldx, 1);
}
else if (totateArg == 180) {
myShunShiNext = quXiaYiGe(oldz, oldx, 2);
}
else if (totateArg == -90) {
myShunShiNext = quXiaYiGe(oldz, oldx, 3);
}
newz = myShunShiNext[0];
newx = myShunShiNext[1];
break;
case 'X':
newx = oldx;
if (totateArg == 90) {
myShunShiNext = quXiaYiGe(oldy, oldz, 1);
}
else if (totateArg == 180) {
myShunShiNext = quXiaYiGe(oldy, oldz, 2);
}
else if (totateArg == -90) {
myShunShiNext = quXiaYiGe(oldy, oldz, 3);
}
newy = myShunShiNext[0];
newz = myShunShiNext[1];
break;
}
//返回结果
nextXYZ[0] = newx;
nextXYZ[1] = newy;
nextXYZ[2] = newz;
//System.out.println("\n变为位置:"+newx+newy+newz);
return nextXYZ;
}
boolean fangXiangCorrect(int argx, int argy, int argz) { //用三个差向量判断自转
//System.out.println("方向判断。。。");
//(blockIdX-1),(blockIdY-1),(blockIdZ-1)为初始点位置,分别加1得到三个初始向量
//xvec,yvec,zvec为保存的变化
//减去当前的方块位置,得到每个方向点当前向量chaxvec,chayvec,chazvec
//X点
int[] p1X = jisuanNextXYZ('X', argx, 1, 0, 0); //原始x点便移
int[] p2X = jisuanNextXYZ('Y', argy, p1X[0], p1X[1], p1X[2]);
int[] p3X = jisuanNextXYZ('Z', argz, p2X[0], p2X[1], p2X[2]); //新的x点便移
//Y点
int[] p1Y = jisuanNextXYZ('X', argx, 0, 1, 0);
int[] p2Y = jisuanNextXYZ('Y', argy, p1Y[0], p1Y[1], p1Y[2]);
int[] p3Y = jisuanNextXYZ('Z', argz, p2Y[0], p2Y[1], p2Y[2]);
//Z点
int[] p1Z = jisuanNextXYZ('X', argx, 0, 0, 1);
int[] p2Z = jisuanNextXYZ('Y', argy, p1Z[0], p1Z[1], p1Z[2]);
int[] p3Z = jisuanNextXYZ('Z', argz, p2Z[0], p2Z[1], p2Z[2]);
//System.out.println("坐标系:"+chaX+" "+chaY+" "+chaZ);
// 新的x点便移=当前位置x点的偏移
if (
( (p3X[0] == chaxvec.x) && (p3X[1] == chaxvec.y) &&
(p3X[2] == chaxvec.z)) &&
( (p3Y[0] == chayvec.x) && (p3Y[1] == chayvec.y) &&
(p3Y[2] == chayvec.z)) &&
( (p3Z[0] == chazvec.x) && (p3Z[1] == chazvec.y) &&
(p3Z[2] == chazvec.z))
) {
System.out.println("坐标轴到位了");
return true;
}
else {
//System.out.println("坐标轴没到位");
return false;
}
}
boolean weiZhiCorrect(int aidx, int aidy, int aidz, int argx, int argy,
int argz) {
int[] p1 = jisuanNextXYZ('X', argx, blockIdX - 1, blockIdY - 1,
blockIdZ - 1);
int[] p2 = jisuanNextXYZ('Y', argy, p1[0], p1[1], p1[2]);
int[] p3 = jisuanNextXYZ('Z', argz, p2[0], p2[1], p2[2]);
if ( (p3[0] == aidx) && (p3[1] == aidy) && (p3[2] == aidz)) {
System.out.println("位置对了");
return true;
}
else {
System.out.println("位置不对");
return false;
}
}
//仅计算逆时针旋转时的坐标变化,当转逆时针-90度时,转化为3个逆时针90度
int[] quXiaYiGe(int num1, int num2, int n) {
int[][] xiangXianZhi = {
{
1, 1}
, {
-1, 1}
, {
-1, -1}
, {
1, -1}
}; //一,二,三,四,0,1,2,3
int[][] zouShangZhi = {
{
1, 0}
, {
0, 1}
, {
-1, 0}
, {
0, -1}
}; //
int[] result = {
0, 0};
//System.out.println("旋转次数为:"+n);
//System.out.println(num1+" , "+num2+"旋转到:");
int temp = 0;
for (int i = 0; i < n; i++) {
//循环一次转一次
if (num1 == 0 && num2 == 0) { //
num1 = 0;
num2 = 0;
//System.out.println("0");
}
else if (num1 > 0 && num2 > 0) { //一象限转到二象限
temp = num1;
num1 = -num2;
num2 = temp;
//System.out.println("1");
}
else if (num1 < 0 && num2 > 0) { //二象限转到三象限
temp = num1;
num1 = -num2;
num2 = temp;
////System.out.println("2");
}
else if (num1 < 0 && num2 < 0) { //三象限转到四象限
temp = num1;
num1 = -num2;
num2 = temp;
////System.out.println("3");
}
else if (num1 > 0 && num2 < 0) { //四象限转到一象限
temp = num1;
num1 = -num2;
num2 = temp;
//System.out.println("4");
}
else if (num1 > 0 && num2 == 0) { //X上到Y上
temp = num1;
num1 = 0;
num2 = temp;
//System.out.println("5");
}
else if (num1 == 0 && num2 > 0) { //Y上到X上
temp = num1;
num1 = -num2;
num2 = 0;
//System.out.println("6");
}
else if (num1 < 0 && num2 == 0) { //
temp = num1;
num1 = 0;
num2 = temp;
//System.out.println("7");
}
else if (num1 == 0 && num2 < 0) { //
temp = num1;
num1 = -num2;
num2 = 0;
//System.out.println("8");
}
else {
System.out.println("no");
}
}
//System.out.println(num1+" , "+num2);
result[0] = num1;
result[1] = num2;
return result;
}
public void run() {
//System.out.println("我的动画开始了");
//动画协调,取一个id,并放出令牌
myDonghuaId = selectDonghuaId++;
selectDonghuaId %= 9;
yunXingThread++;
switch (selectedC) {
case 'Z': {
startDonghuaZ();
break;
}
case 'Y': {
startDonghuaY();
break;
}
case 'X': {
startDonghuaX();
break;
}
}
//最终位置
while (!canNew) { //System.out.println(" 我在等待计算出新值...");
}
//变换生效
transGroupp.setTransform(transp);
transGroupx.setTransform(transx);
transGroupy.setTransform(transy);
transGroupz.setTransform(transz);
canNew = false;
//System.out.println("我的动画完成了");
yunXingThread--;
}
//用来从一个原坐标和结果坐标来 搜索 3个x,y,z顺序的旋转操作,返回到needRotate[3]中
//使用了int[] jisuanNextXYZ(char doType,int totateArg,int oldx,int oldy,int oldz)
int[] shouSuoXYZRotate(int oldx, int oldy, int oldz, int aidx, int aidy,
int aidz) { //搜索自转,不看位置,只看三个向量对不对
System.out.println("块原始位置:" + oldx + "," + oldy + "," + oldz);
System.out.println("块目标位置:" + aidx + "," + aidy + "," + aidz);
//存放结果
int needRotatex = 0;
int needRotatey = 0;
int needRotatez = 0;
//转换返回
int[] needRotate = {
0, 0, 0};
int num = 0;
wancheng:
for (int j = 0; j <= 3; j++) {
int toArg = 0; //j=3时取0
if (j == 1) {
toArg = 90;
}
if (j == 2) {
toArg = -90;
}
if (j == 3) {
toArg = 180;
}
for (int jj = 0; jj <= 3; jj++) {
int ttoArg = 0;
if (jj == 1) {
ttoArg = 90;
}
if (jj == 2) {
ttoArg = -90;
}
if (jj == 3) {
ttoArg = 180;
}
for (int jjj = 0; jjj <= 3; jjj++) {
int tttoArg = 0;
if (jjj == 1) {
tttoArg = 90;
}
if (jjj == 2) {
tttoArg = -90;
}
if (jjj == 3) {
tttoArg = 180;
}
//System.out.println("验证xyz旋转.."+toArg+" "+ttoArg+" "+tttoArg);
// 这个打开 有的会找不到
//boolean myBoolean1=weiZhiCorrect(nexyz[0],nexyz[1],nexyz[2],toArg,ttoArg,tttoArg);
boolean myBoolean = fangXiangCorrect(toArg, ttoArg, tttoArg);
//MoFang.myWait();
if (myBoolean) {
needRotatex = toArg;
needRotatey = ttoArg;
needRotatez = tttoArg;
needRotate[0] = needRotatex;
needRotate[1] = needRotatey;
needRotate[2] = needRotatez;
num++;
System.out.println("*****找到了x,y,z旋转即可*****" + toArg + " , " +
ttoArg + " , " + tttoArg + "");
//return needRotate;
}
}
}
}
if (num == 0) {
System.out.println("没有适合的xyz旋转,不旋转..");
MoFang.myWait();
}
else if (num >= 2) {
System.out.println("###########################找到了num=" + num + "个");
}
return needRotate;
}
void startDonghuaX() {
//动画模块
int chuJiao;
int oneTime;
int bianJiao;
int nowJiao;
//测试
//totateArg=90;
chuJiao = getChujiao(yuany, yuanz);
if (totateArg == -90) {
oneTime = -15;
}
else {
oneTime = 15;
//System.out.println("chuJiao="+chuJiao);
//System.out.println("totateArg="+totateArg);
//nowJiao=chuJiao+bianJiao ;
//这是目前角度公式,可见,据坐标可以判断它的角度嘛
}
for (bianJiao = 0; bianJiao != (totateArg + oneTime); bianJiao += oneTime) {
if (!closeDonghua) {
while (myDonghuaId != selectDonghuaId) { //动画同步相关轮到自己时才执行,把令牌交给下一个
; //System.out.println("我是"+myDonghuaId+"号,而令牌现在是"+selectDonghuaId+"号,我要等...");
try {
//System.in.read();//暂停
myThread.sleep(whileDelay);
}
catch (Exception e) {
}
}
}
//计算x,y和角度输出
float fx;
float fy;
float fz;
//半径
float r;
if (yuany == 0 && yuanz == 0) {
r = 0; //(x,y)不变,故不用计算,直接给(0,0),初角返回任何值都可;
}
else {
if (yuany == 0 || yuanz == 0) {
r = 1.0f;
}
else {
r = 1.414f;
}
}
nowJiao = chuJiao + bianJiao;
//使用初角直为了计算当前(x,y)位置,当前jiaodu1与他无关,只与老角有关
//(-1,-1)距离原点为根2,约1.732
//0.3指定了1点在0.3,-0.3处
fy = (float) kuaiZhongXinWeizhi * r *
(float) Math.cos(Math.PI * nowJiao / 180);
fz = (float) kuaiZhongXinWeizhi * r *
(float) Math.sin(Math.PI * nowJiao / 180);
fx = (float) kuaiZhongXinWeizhi * (yuanx);
//z坐标不变,这里的z早减过了1
//计算出了全部数据,OK,开始刷新
//用变换量
//transz.rotZ(Math.toRadians(anglez));
//transy.rotY(Math.toRadians(angley));
//transx.rotX(Math.toRadians(bianJiao+oldJiaoDu));
transp.setTranslation(new Vector3f(fx, fy, fz));
//生效
//transGroupz.setTransform(transz);
//transGroupy.setTransform(transy);
//transGroupx.setTransform(transx);
transGroupp.setTransform(transp);
//停不了,只能使用多线程或定时
//System.out.println("bianJiao="+bianJiao);
try {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?