コード例 #1
0
		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;
		}
コード例 #2
0
		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;
		}
コード例 #3
0
		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;
		}
コード例 #4
0
ファイル: Volume.cs プロジェクト: tcchau/ClearCanvas
		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]);
		}
コード例 #5
0
ファイル: Volume.cs プロジェクト: tcchau/ClearCanvas
		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]);
		}
コード例 #6
0
ファイル: Volume.cs プロジェクト: tcchau/ClearCanvas
		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;
		}
コード例 #7
0
ファイル: Volume.cs プロジェクト: tcchau/ClearCanvas
		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;
		}
コード例 #8
0
		/// <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;
		}