C#矢量数学问题

时间:2010-04-22 05:25:07

标签: c# math vector

我在一个与经典X / Y坐标空间不同的屏幕坐标空间中工作,其中我的Y方向向下而不是向上。

我还想弄清楚如何让我的屏幕上的圆圈始终背离屏幕的中心点。

如果我的屏幕中心点位于x(200)y(300)并且我的圆圈中心点位于x(150)和y(380)那么我想计算圆圈的角度面对。

目前我有这个:

        Point centerPoint = new Point(200, 300);
        Point middleBottom = new Point(200, 400);

        Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y);

        Vector vectorOfCircle = new Vector(centerPoint.X - 150, centerPoint.Y - 400);

        middleVector.Normalize();
        vectorOfCircle.Normalize();

        var angle = Math.Acos(Vector.CrossProduct(vectorOfCircle, middleVector));

        Console.WriteLine("Angle: {0}", angle * (180/Math.PI));

我没有得到我期望的结果。

我会说,当我进入我的圈子的x(150)和y(300)时,我希望看到旋转90度,但我没有得到那个......我得到180 !!

非常感谢任何帮助。

干杯, 标记

3 个答案:

答案 0 :(得分:1)

没关系,我想我现在明白了:

我读过这篇文章:

http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

确定我需要使用 Atan2 而不是 acos

        Point centerPoint = new Point(200, 300);
        Point middleBottom = new Point(200, 400);

        Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y);
        Vector vectorOfCircle = new Vector(centerPoint.X - 250, centerPoint.Y - 300);

        middleVector.Normalize();
        vectorOfCircle.Normalize();

        var angle = Math.Atan2(vectorOfCircle.Y, vectorOfCircle.X) - Math.Atan2(middleVector.Y, middleVector.X);

        Console.WriteLine("Angle: {0}", angle * (180/Math.PI));

答案 1 :(得分:1)

一句话:

cos积分函数用于点积。 交叉产品使用窦。

答案 2 :(得分:0)

不,这是正确的。零角度从origo(centerPoint)向右。由于圆圈位于origo的左侧,因此角度为180度。