mysimpleuniverse.java~2~

来自「java2参考大全上的例子的源码和自己的理解.」· JAVA~2~ 代码 · 共 1,950 行 · 第 1/5 页

JAVA~2~
1,950
字号
      //transGroupy.setTransform(transy);
      //transGroupx.setTransform(transx);
      transGroupp.setTransform(transp);
      //停不了,只能使用多线程或定时
      //System.out.println("bianJiao="+bianJiao);
      try {
        //System.in.read();//暂停
        //
        myThread.sleep(donghuaDelay);
      }
      catch (Exception e) {
      }
      //在这里才放出令牌
      selectDonghuaId++;
      selectDonghuaId %= 9;
    }
  }

  void startDonghuaY() {
    //动画模块
    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 ;
      //这是目前角度公式,可见,据坐标可以判断它的角度嘛
    }
    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 (yuanz == 0 && yuanx == 0) {
        r = 0; //(x,y)不变,故不用计算,直接给(0,0),初角返回任何值都可;
      }
      else {
        if (yuanz == 0 || yuanx == 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处
      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坐标不变,这里的z早减过了1
      //计算出了全部数据,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);
      //停不了,只能使用多线程或定时
      //System.out.println("bianJiao="+bianJiao);
      try {
        //System.in.read();//暂停
        //
        myThread.sleep(donghuaDelay);
      }
      catch (Exception e) {
      }
      //在这里才放出令牌
      selectDonghuaId++;
      selectDonghuaId %= 9;
    }
  }

  void startDonghuaZ() {
    //动画模块
    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 ;
      //这是目前角度公式,可见,据坐标可以判断它的角度嘛
    }
    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 (yuanx == 0 && yuany == 0) {
        r = 0; //(x,y)不变,故不用计算,直接给(0,0),初角返回任何值都可;
      }
      else {
        if (yuanx == 0 || yuany == 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处
      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坐标不变,这里的z早减过了1
      //计算出了全部数据,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);
      //停不了,只能使用多线程或定时

      //System.out.println("bianJiao="+bianJiao);
      try {
        //System.in.read();//暂停
        //
        myThread.sleep(donghuaDelay);
      }
      catch (Exception e) {
      }
      //在这里才放出令牌
      selectDonghuaId++;
      selectDonghuaId %= 9;

    }
  }

  //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[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) {
      }
      //计算该面 面心
      mianxin.x = mianxinpianyi[i].x;
      mianxin.y = mianxinpianyi[i].y;
      mianxin.z = mianxinpianyi[i].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[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
  //为了方便计算,先平移(坐标全减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("搜寻旋转角度量。。。

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?