/** * 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; }
/** * 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); } }