예제 #1
0
 public override bool ProcessMouseMove(CanonicalMouseEventArgs e, InteractionContext context)
 {
     if (this.IsActive)
     {
         Point2D     position    = e.Position;
         QuaternionD quaternionD = this.quaternionD_1;
         if (this.bool_2)
         {
             Vector2D vector2D = position - this.point2D_0;
             if (vector2D != Vector2D.Zero)
             {
                 double   num  = System.Math.Sqrt(vector2D.X * vector2D.X + vector2D.Y * vector2D.Y);
                 Vector3D axis = new Vector3D(vector2D.Y, vector2D.X, 0.0);
                 axis.Normalize();
                 quaternionD = QuaternionD.FromAxisAngle(axis, num / 100.0) * quaternionD;
             }
         }
         else
         {
             Point2D  point2D   = this.method_0(context.CanvasRectangle.Size);
             Vector2D vector2D1 = this.point2D_0 - point2D;
             double   num1      = System.Math.Atan2(vector2D1.Y, vector2D1.X);
             Vector2D vector2D2 = position - point2D;
             double   num2      = System.Math.Atan2(vector2D2.Y, vector2D2.X) - num1;
             quaternionD = QuaternionD.FromAxisAngle(Vector3D.ZAxis, -num2) * quaternionD;
         }
         quaternionD.Normalize();
         this.quaternionD_0 = quaternionD;
         this.OnOrientationChanged((EventArgs)e);
     }
     return(true);
 }
예제 #2
0
        public void WorldToLocalTest()
        {
            var o   = new Orient3D();
            var two = Math.Sqrt(2.0) * 0.5;

            o.Q = QuaternionD.FromAxisAngle(new Vector3D(1, 1, 1), 77 * Math.PI / 180.0);

            var tstVec1 = new Vector3D(4, 4, 4);
            var answ1   = tstVec1 - o.M_1 * tstVec1;

            Assert.AreEqual(0d, answ1.GetLength(), 0.000001);

            o.Q = QuaternionD.FromAxisAngle(Vector3D.XAxis, -45 * Math.PI / 180.0);

            var tstVec2 = Vector3D.YAxis;
            var answ2   = new Vector3D(0, two, two) - o.M_1 * tstVec2;

            Assert.AreEqual(0d, answ2.GetLength(), 0.000001);

            var tstVec3 = Vector3D.ZAxis;
            var answ3   = new Vector3D(0, -two, two) - o.M_1 * tstVec3;

            Assert.AreEqual(0d, answ3.GetLength(), 0.000001);

            o.Q = QuaternionD.FromAxisAngle(Vector3D.ZAxis, 45 * Math.PI / 180.0);

            tstVec2 = Vector3D.XAxis;
            answ2   = new Vector3D(two, -two, 0) - o.M_1 * tstVec2;
            Assert.AreEqual(0d, answ2.GetLength(), 0.000001);

            tstVec3 = Vector3D.YAxis;
            answ3   = new Vector3D(two, two, 0) - o.M_1 * tstVec3;
            Assert.AreEqual(0d, answ3.GetLength(), 0.000001);
        }
예제 #3
0
        public void FromAxisAngle_MainAxes(QuaternionD expected, double4 axisAngle)
        {
            var axis  = new double3(axisAngle.xyz);
            var angle = axisAngle.w;

            var actual = QuaternionD.FromAxisAngle(axis, angle);

            Assert.Equal(expected.x, actual.x, 7);
            Assert.Equal(expected.y, actual.y, 7);
            Assert.Equal(expected.z, actual.z, 7);
            Assert.Equal(expected.w, actual.w, 7);
        }
예제 #4
0
        public void LocalToWorldTest()
        {
            var o = new Orient3D();

            o.Q = QuaternionD.FromAxisAngle(Vector3D.XAxis, 45 * Math.PI / 180.0);
            var tstVec1 = Vector3D.XAxis;
            var answ1   = tstVec1 - o.M * tstVec1;

            Assert.AreEqual(0d, answ1.GetLength(), 0.000001);

            var tstVec2 = Vector3D.YAxis;
            var answ2   = new Vector3D(0, Math.Sqrt(2.0), Math.Sqrt(2.0)) / 2 - o.M * tstVec2;

            Assert.AreEqual(0d, answ2.GetLength(), 0.000001);

            var tstVec3 = Vector3D.ZAxis;
            var answ3   = new Vector3D(0, -Math.Sqrt(2.0), Math.Sqrt(2.0)) / 2 - o.M * tstVec3;

            Assert.AreEqual(0d, answ3.GetLength(), 0.000001);


            o.Q     = QuaternionD.FromAxisAngle(Vector3D.YAxis, 45 * Math.PI / 180.0);
            tstVec1 = Vector3D.YAxis;
            answ1   = tstVec1 - o.M * tstVec1;
            Assert.AreEqual(0d, answ1.GetLength(), 0.000001);

            tstVec2 = Vector3D.XAxis;
            answ2   = new Vector3D(Math.Sqrt(2.0), 0, -Math.Sqrt(2.0)) / 2 - o.M * tstVec2;
            Assert.AreEqual(0d, answ2.GetLength(), 0.000001);

            tstVec3 = Vector3D.ZAxis;
            answ3   = new Vector3D(Math.Sqrt(2.0), 0, Math.Sqrt(2.0)) / 2 - o.M * tstVec3;
            Assert.AreEqual(0d, answ3.GetLength(), 0.000001);

            o.Q     = QuaternionD.FromAxisAngle(Vector3D.ZAxis, 45 * Math.PI / 180.0);
            tstVec1 = Vector3D.ZAxis;
            answ1   = tstVec1 - o.M * tstVec1;
            Assert.AreEqual(0d, answ1.GetLength(), 0.000001);

            tstVec2 = Vector3D.XAxis;
            answ2   = new Vector3D(Math.Sqrt(2.0), Math.Sqrt(2.0), 0) / 2 - o.M * tstVec2;
            Assert.AreEqual(0d, answ2.GetLength(), 0.000001);

            tstVec3 = Vector3D.YAxis;
            answ3   = new Vector3D(-Math.Sqrt(2.0), Math.Sqrt(2.0), 0) / 2 - o.M * tstVec3;
            Assert.AreEqual(0d, answ3.GetLength(), 0.000001);
        }
예제 #5
0
        private void method_0(CanonicalMouseEventArgs e, InteractionContext context)
        {
            Point2D  point2D   = new Point2D(0.5 * context.CanvasRectangle.Size.X, 0.5 * context.CanvasRectangle.Size.Y);
            Point2D  position  = e.Position;
            Vector2D vector2D1 = position - point2D;

            if (!(vector2D1 != Vector2D.Zero))
            {
                return;
            }
            double num1 = System.Math.Atan2(-vector2D1.Y, vector2D1.X);

            if (this.nullable_0.HasValue)
            {
                Vector2D vector2D2 = this.nullable_0.Value - point2D;
                double   num2      = System.Math.Atan2(-vector2D2.Y, vector2D2.X);
                if (num1 != num2)
                {
                    this.TransformationProvider.ModelOrientation *= QuaternionD.FromAxisAngle(Vector3D.ZAxis, num1 - num2);
                }
            }
            this.nullable_0 = new Point2D?(position);
        }