예제 #1
0
  /**
   * Working ... This function is never used. It doesn't modify any parameters or data members and
   * returns void.
   *
   * @param image DOCUMENT ME!
   * @param doColor DOCUMENT ME!
   */
  public void calculatePrincipleAxis(ModelImage image, boolean doColor) {
    int x, y, z;
    int n = 0;
    Matrix3f mat2 = new Matrix3f(); // Row,Col
    Matrix3f meanProduct = new Matrix3f();
    Vector3f mean = new Vector3f(); // Column vector
    double voxVal = 0;
    double total = 0;
    double tot = 0;

    // Moments first and second order
    double mX = 0, mY = 0, mZ = 0, mXX = 0, mXY = 0, mXZ = 0, mYY = 0, mYZ = 0, mZZ = 0;

    float min = (float) image.getMin();

    int xEnd = image.getExtents()[0];
    int yEnd = image.getExtents()[1];
    int zEnd = image.getExtents()[2];

    int nLim = (int) Math.sqrt((double) xEnd * yEnd * zEnd);

    if (nLim < 1000) {
      nLim = 1000;
    }

    for (z = 0; z < zEnd; z++) {

      for (y = 0; y < yEnd; y++) {

        for (x = 0; x < xEnd; x++) {

          if (doColor) {
            voxVal =
                (double)
                    (image.getFloatC(x, y, z, 1)
                        + image.getFloatC(x, y, z, 2)
                        + image.getFloatC(x, y, z, 3));
          } else {
            voxVal = (double) (image.getFloat(x, y, z) - min);
          }

          mX += voxVal * x;
          mY += voxVal * y;
          mZ += voxVal * z;
          mXX += voxVal * x * x;
          mXY += voxVal * x * y;
          mXZ += voxVal * x * z;
          mYY += voxVal * y * y;
          mYZ += voxVal * y * z;
          mZZ += voxVal * z * z;
          tot += voxVal;
          n++;

          if (n > nLim) { // Lets not over run the buffers during summation
            n = 0;
            total += tot;
            mat2.M00 = (float) (mat2.M00 + mXX);
            mat2.M01 = (float) (mat2.M01 + mXY);
            mat2.M02 = (float) (mat2.M02 + mXZ);
            mat2.M11 = (float) (mat2.M11 + mYY);
            mat2.M12 = (float) (mat2.M12 + mYZ);
            mat2.M22 = (float) (mat2.M22 + mZZ);
            mean.X = (float) (mean.X + mX);
            mean.Y = (float) (mean.Y + mY);
            mean.Z = (float) (mean.Z + mZ);
            tot = 0;
            mX = 0;
            mY = 0;
            mZ = 0;
            mXX = 0;
            mXY = 0;
            mXZ = 0;
            mYY = 0;
            mYZ = 0;
            mZZ = 0;
          }
        }
      }
    }

    total += tot;

    if (Math.abs(total) < 1e-5) {
      total = 1.0f;
    }

    mat2.M00 = (float) ((mat2.M00 + mXX) / total);
    mat2.M01 = (float) ((mat2.M01 + mXY) / total);
    mat2.M02 = (float) ((mat2.M02 + mXZ) / total);
    mat2.M11 = (float) ((mat2.M11 + mYY) / total);
    mat2.M12 = (float) ((mat2.M12 + mYZ) / total);
    mat2.M22 = (float) ((mat2.M22 + mZZ) / total);
    mean.X = (float) ((mean.X + mX) / total);
    mean.Y = (float) ((mean.Y + mY) / total);
    mean.Z = (float) ((mean.Z + mZ) / total);

    // Now make it central (taking off the Center of Mass)
    meanProduct.MakeTensorProduct(mean, mean);
    mat2.M00 -= meanProduct.M00;
    mat2.M01 -= meanProduct.M01;
    mat2.M02 -= meanProduct.M02;
    mat2.M10 -= meanProduct.M10;
    mat2.M11 -= meanProduct.M11;
    mat2.M12 -= meanProduct.M12;
    mat2.M20 -= meanProduct.M20;
    mat2.M21 -= meanProduct.M21;
    mat2.M22 -= meanProduct.M22;
  }
예제 #2
0
  /**
   * Call from the JPanelFlythruMove.
   *
   * @param command move command.
   */
  public void move(String command) {

    if (command.equals("lookup")) {
      // pitch - look up
      Vector3f kRight = new Vector3f();
      kRight.UnitCross(m_kViewDirection, m_kViewUp);
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(kRight, (float) Math.toRadians(1));
      kRotate.Mult(m_kViewDirection, m_kViewDirection);
      kRotate.Mult(m_kViewUp, m_kViewUp);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("lookdown")) {
      // pitch - look down
      Vector3f kRight = new Vector3f();
      kRight.UnitCross(m_kViewDirection, m_kViewUp);
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(kRight, (float) Math.toRadians(-1));
      kRotate.Mult(m_kViewDirection, m_kViewDirection);
      kRotate.Mult(m_kViewUp, m_kViewUp);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("lookleft")) {
      // yaw - look left
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(m_kViewUp, (float) Math.toRadians(1));
      kRotate.Mult(m_kViewDirection, m_kViewDirection);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("lookright")) {
      // case KeyEvent.VK_RIGHT:
      // yaw - look right
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(m_kViewUp, (float) Math.toRadians(-1));
      kRotate.Mult(m_kViewDirection, m_kViewDirection);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("counterclockwise")) {
      // case KeyEvent.VK_F3:
      // roll - counterclockwise
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(m_kViewDirection, (float) Math.toRadians(-1));
      kRotate.Mult(m_kViewUp, m_kViewUp);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("clockwise")) {
      // roll - clockwise
      Matrix3f kRotate = new Matrix3f();
      kRotate.FromAxisAngle(m_kViewDirection, (float) Math.toRadians(1));
      kRotate.Mult(m_kViewUp, m_kViewUp);
      // Notify listener that we are updated.
      notifyCallback(EVENT_CHANGE_POSITION);
    } else if (command.equals("escape")) {

      // VK_ESCAPE
      setIdentityViewOrientation();
    } else if (command.equals("home")) {

      // case KeyEvent.VK_HOME:
      // reset position to the beginning of the path
      if (!m_bChooseBranch && (null == m_akBranchChoice)) {
        setPathDist(0.0f);
      } else {
        beep();
      }
    } else if (command.equals("end")) {

      // case KeyEvent.VK_END:
      // reset position to the end of the path
      if (!m_bChooseBranch && (null == m_akBranchChoice)) {
        setPathDist(1.0f);
      } else {
        beep();
      }
    } else if (command.equals("forward")) {

      // case KeyEvent.VK_UP:
      // move forward along the path
      if (!m_bChooseBranch) {
        doPathStep(1);
      } else {
        beep();
      }
    } else if (command.equals("backward")) {

      // case KeyEvent.VK_DOWN:
      // move backward along the path
      if (!m_bChooseBranch) {
        doPathStep(-1);
      } else {
        beep();
      }
    } else if (command.equals("reverse")) {

      // case KeyEvent.VK_R:
      // follow path in reverse heading
      m_kBranchState.m_bMoveForward = !m_kBranchState.m_bMoveForward;
      setPathDist(m_kBranchState.m_fNormalizedPathDist);

    } else if (command.equals("prevAnnotatePt")) {

      // case KeyEvent.VK_F5:
      // go to previous annotate point
      if (!m_bChooseBranch && (m_kAnnotateList.getNumItems() > 0)) {

        if (--m_iAnnotateListItemSelected < 0) {
          m_iAnnotateListItemSelected = m_kAnnotateList.getNumItems() - 1;
        }

        setCurvePathAnnotateItem(m_iAnnotateListItemSelected);
      } else {
        beep();
      }
    } else if (command.equals("nextAnnotatePt")) {

      // case KeyEvent.VK_F6:
      // go to next annotate point
      if (!m_bChooseBranch && (m_kAnnotateList.getNumItems() > 0)) {

        if (++m_iAnnotateListItemSelected >= m_kAnnotateList.getNumItems()) {
          m_iAnnotateListItemSelected = 0;
        }

        setCurvePathAnnotateItem(m_iAnnotateListItemSelected);
      } else {
        beep();
      }
    } else if (command.equals("nextBranch")) {

      // case KeyEvent.VK_SPACE:
      // select next branch choice
      if (null != m_akBranchChoice) {
        setClosestChoiceBranch();
      } else {
        beep();
      }
    } else if (command.equals("stepDistanceIncrease")) {
      m_fPathStep += 0.1f;
      setPathDist(m_kBranchState.m_fNormalizedPathDist);
    } else if (command.equals("stepDistanceDecrease")) {
      m_fPathStep -= 0.1f;

      if (m_fPathStep < 0.1f) {
        m_fPathStep = 0.1f;
        beep();
      }

      setPathDist(m_kBranchState.m_fNormalizedPathDist);
    } else if (command.equals("gazeDistanceDecrease")) {
      m_fGazeDist -= 1.0f;

      if (m_fGazeDist < 0.0f) {
        m_fGazeDist = 0.0f;
        beep();
      }

      setPathDist(m_kBranchState.m_fNormalizedPathDist);
    } else if (command.equals("gazeDistanceIncrease")) {
      m_fGazeDist += 1.0f;
      setPathDist(m_kBranchState.m_fNormalizedPathDist);
    }
  }