private static Matrix CalcRotateMatrixFromOrthogonalBasis(Vector3D xAxis, Vector3D yAxis, Vector3D zAxis) { const float zeroTolerance = 1e-4f; Platform.CheckForNullReference(xAxis, "xAxis"); Platform.CheckForNullReference(yAxis, "yAxis"); Platform.CheckForNullReference(zAxis, "zAxis"); Platform.CheckFalse(xAxis.IsNull || yAxis.IsNull || zAxis.IsNull, "Input must be an orthogonal set of basis vectors (i.e. non-trivial vectors)."); Platform.CheckTrue(FloatComparer.AreEqual(xAxis.Dot(yAxis), 0, zeroTolerance) && FloatComparer.AreEqual(xAxis.Dot(zAxis), 0, zeroTolerance) && FloatComparer.AreEqual(yAxis.Dot(zAxis), 0, zeroTolerance), "Input must be an orthogonal set of basis vectors (i.e. mutually perpendicular)."); xAxis = xAxis.Normalize(); yAxis = yAxis.Normalize(); zAxis = zAxis.Normalize(); //TODO (CR Sept 2010): is this a rotation matrix, or the definition of a coordinate system? var basis = new Matrix(4, 4); basis.SetRow(0, xAxis.X, xAxis.Y, xAxis.Z, 0); basis.SetRow(1, yAxis.X, yAxis.Y, yAxis.Z, 0); basis.SetRow(2, zAxis.X, zAxis.Y, zAxis.Z, 0); basis.SetRow(3, 0, 0, 0, 1); return basis; }
public Vector3D ConvertToPatient(Vector3D volumePosition) { Platform.CheckForNullReference(volumePosition, "volumePosition"); // Set orientation transform var volumePatientTransform = _volumeOrientationPatient.Augment(); // Set origin translation volumePatientTransform.SetRow(3, VolumePositionPatient.X, VolumePositionPatient.Y, VolumePositionPatient.Z, 1); // Transform volume position to patient position var imagePositionMatrix = new Matrix(1, 4); imagePositionMatrix.SetRow(0, volumePosition.X, volumePosition.Y, volumePosition.Z, 1F); var patientPositionMatrix = imagePositionMatrix*volumePatientTransform; var patientPosition = new Vector3D(patientPositionMatrix[0, 0], patientPositionMatrix[0, 1], patientPositionMatrix[0, 2]); return patientPosition; }
public Vector3D ConvertToVolume(Vector3D patientPosition) { Platform.CheckForNullReference(patientPosition, "patientPosition"); // Set orientation transform var patientVolumeTransform = _volumeOrientationPatient.Augment(true); // Set origin translation var rotatedOrigin = RotateToVolumeOrientation(VolumePositionPatient); patientVolumeTransform.SetRow(3, -rotatedOrigin.X, -rotatedOrigin.Y, -rotatedOrigin.Z, 1); // Transform patient position to volume position var patientPositionMatrix = new Matrix(1, 4); patientPositionMatrix.SetRow(0, patientPosition.X, patientPosition.Y, patientPosition.Z, 1F); var imagePositionMatrix = patientPositionMatrix*patientVolumeTransform; var imagePosition = new Vector3D(imagePositionMatrix[0, 0], imagePositionMatrix[0, 1], imagePositionMatrix[0, 2]); return imagePosition; }
public Vector3D RotateToVolumeOrientation(Vector3D patientVec) { Matrix patientPos = new Matrix(1, 4); patientPos.SetRow(0, patientVec.X, patientVec.Y, patientVec.Z, 1F); Matrix volumePos = patientPos*OrientationPatientMatrix.Transpose(); return new Vector3D(volumePos[0, 0], volumePos[0, 1], volumePos[0, 2]); }
public Vector3D RotateToPatientOrientation(Vector3D volumeVec) { Matrix volumePos = new Matrix(1, 4); volumePos.SetRow(0, volumeVec.X, volumeVec.Y, volumeVec.Z, 1F); Matrix patientPos = volumePos*OrientationPatientMatrix; return new Vector3D(patientPos[0, 0], patientPos[0, 1], patientPos[0, 2]); }
public Vector3D ConvertToVolume(Vector3D patientPosition) { // Set orientation transform Matrix patientVolumeTransform = new Matrix(OrientationPatientMatrix.Transpose()); // Set origin translation Vector3D rotatedOrigin = RotateToVolumeOrientation(OriginPatient); patientVolumeTransform.SetRow(3, -rotatedOrigin.X, -rotatedOrigin.Y, -rotatedOrigin.Z, 1); // Transform patient position to volume position Matrix patientPositionMatrix = new Matrix(1, 4); patientPositionMatrix.SetRow(0, patientPosition.X, patientPosition.Y, patientPosition.Z, 1F); Matrix imagePositionMatrix = patientPositionMatrix*patientVolumeTransform; Vector3D imagePosition = new Vector3D(imagePositionMatrix[0, 0], imagePositionMatrix[0, 1], imagePositionMatrix[0, 2]); return imagePosition; }
public Vector3D ConvertToPatient(Vector3D volumePosition) { // Set orientation transform Matrix volumePatientTransform = new Matrix(OrientationPatientMatrix); // Set origin translation volumePatientTransform.SetRow(3, OriginPatient.X, OriginPatient.Y, OriginPatient.Z, 1); // Transform volume position to patient position Matrix imagePositionMatrix = new Matrix(1, 4); imagePositionMatrix.SetRow(0, volumePosition.X, volumePosition.Y, volumePosition.Z, 1F); Matrix patientPositionMatrix = imagePositionMatrix*volumePatientTransform; Vector3D patientPosition = new Vector3D(patientPositionMatrix[0, 0], patientPositionMatrix[0, 1], patientPositionMatrix[0, 2]); return patientPosition; }
/// <summary> /// Gets a rotation matrix that, when multiplied by a column matrix representing a /// position vector in patient coordinates, will rotate the position vector /// into a coordinate system matching that of the image plane. /// </summary> /// <returns>The rotation matrix, or null if the <see cref="Frame"/>'s position information is invalid.</returns> private Matrix GetRotationMatrix() { if (_rotationMatrix == null) { if (ImageOrientationPatient.IsNull) return null; Vector3D normal = GetNormalVector(); if (normal == null || normal.IsNull) return null; _rotationMatrix = new Matrix(3, 3); _rotationMatrix.SetRow(0, (float)ImageOrientationPatient.RowX, (float)ImageOrientationPatient.RowY, (float)ImageOrientationPatient.RowZ); _rotationMatrix.SetRow(1, (float)ImageOrientationPatient.ColumnX, (float)ImageOrientationPatient.ColumnY, (float)ImageOrientationPatient.ColumnZ); _rotationMatrix.SetRow(2, normal.X, normal.Y, normal.Z); } return _rotationMatrix; }