我正在做一个(可能是简单的)任务,其中我想让绘制的对象移动到用户控制(也绘制)。我所拥有的是球员X和Ycoördinate,分别定义为Xp和Yp。必须移动(触发后,不包含在此处的代码中)到'player-object'的对象在this.X和this.Y中定义了它的coördinates。
int xDirection = Xp - this.X;
int yDirection = Yp - this.Y;
int angleInDegrees = (int)Math.Atan2(xDirection, yDirection);
double radians = (Math.PI / 180) * angleInDegrees;
double xTmp = 3 * Math.Cos(radians);
int xSpeed = (int)xTmp;
double yTmp = 3 * Math.Sin(radians);
int ySpeed = (int)yTmp;
Console.WriteLine(xDirection);
Console.WriteLine(yDirection);
Console.WriteLine(xSpeed);
Console.WriteLine(ySpeed);
Console.ReadLine();
这不能给我正确的数字,所以我想知道可能出错的地方。
关于这一点最棘手的事实可能是,必须移动到玩家对象的物体可以从所有侧面(360度)接近但是没有可用的接近角度。
我希望完成我的问题, 添
答案 0 :(得分:1)
Math.Atan2以弧度为单位返回一个值,其他c#三角函数也是如此。
double angle = Math.Atan2(yDirection, xDirection);
还要确保强制类型转换为小数:
3.0 * Math.Cos(radians);
答案 1 :(得分:1)
我打赌你看到的主要问题是这一行:
int angleInDegrees = (int)Math.Atan2(xDirection, yDirection);
正如@catflier所提到的,Math.Atan2
以弧度为单位返回角度(因此数字范围为0到2pi)。但是,您执行转换为int
,截断小数位。因此,如果您的角度为45度,那实际上会返回~0.785398弧度。对int
的强制转换会将其转换为0
。类似地,在90度,即~1.570796弧度时,对int
的强制转换将导致1
。这是一个重大的舍入错误。正如我在评论中提到的,考虑将所有类型更改为双精度,并且只在最后一点执行整数强制转换(我假设您的对象基于整数定位)。