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 + -
显示快捷键?