internal static Point Point3DInViewport3D(Viewport3D viewport, Matrix3D viewportToWorld, Point3D point)
 {
   Camera camera = viewport.Camera;
   Point3D point1 = viewportToWorld.Transform(point);
   Point3D point3D = Helper3D.CameraRotationTranslationMatrix(camera).Transform(point1);
   Point4D point2 = new Point4D(point3D.X, point3D.Y, point3D.Z, 1.0);
   Point4D point4D = AdornedToolBehavior3D.ProjectionMatrix(viewport.ActualWidth, viewport.ActualHeight, camera).Transform(point2);
   Point point3 = Math.Abs(point4D.W) >= 0.0 / 1.0 ? new Point(point4D.X / point4D.W, point4D.Y / point4D.W) : new Point(0.0, 0.0);
   return new Point((point3.X + 1.0) * viewport.ActualWidth / 2.0, viewport.ActualHeight * ((1.0 - point3.Y) / 2.0));
 }
 internal static Point3D ProjectionPoint3DTranslatedToMatchingOrthographicPosition(Viewport3D viewport, Matrix3D pointToWorldTransform, OrthographicCamera ortho, Point3D point)
 {
   Camera camera = viewport.Camera;
   Point3D point1 = pointToWorldTransform.Transform(point);
   Point3D point3D = Helper3D.CameraRotationTranslationMatrix(camera).Transform(point1);
   Point4D point2 = new Point4D(point3D.X, point3D.Y, point3D.Z, 1.0);
   Point4D point4D1 = AdornedToolBehavior3D.ProjectionMatrix(viewport.ActualWidth, viewport.ActualHeight, camera).Transform(point2);
   Point4D point3 = new Point4D(point4D1.X / point4D1.W, point4D1.Y / point4D1.W, 0.0, 1.0);
   Matrix3D matrix3D1 = AdornedToolBehavior3D.ProjectionMatrix(viewport.ActualWidth, viewport.ActualHeight, (Camera) ortho);
   if (Math.Abs(matrix3D1.Determinant) > 1E-16)
     matrix3D1.Invert();
   Point4D point4D2 = matrix3D1.Transform(point3);
   Point3D point4 = new Point3D(point4D2.X / point4D2.W, point4D2.Y / point4D2.W, point3D.Z);
   Matrix3D matrix3D2 = Helper3D.CameraRotationTranslationMatrix((Camera) ortho);
   matrix3D2.Invert();
   return matrix3D2.Transform(point4);
 }