我在WindowsForm上有两个矩形,我想检查它们是否发生碰撞。对于简单的非旋转碰撞,它看起来像这样:
Point newLocation; // upper-left corner of the object to check its collision
Size objectSize; // the object size
bool collision = false;
foreach (Object otherObject in otherObjects)
{
if (newLocation.X >= otherObject.location.X && newLocation.X <= otherObject.location.X + otherObject.size.width)
if (newLocation.Y >= otherObject.location.Y && newLocation.Y <= otherObject.location.Y + otherObject.size.height)
{
collision = true;
break;
}
}
但现在我用以下方式旋转了两个对象:
Matrix matrix = new Matrix();
matrix.RotateAt(angle, newLocation);
graphics.Transform = matrix;
如何检查旋转矩阵处的碰撞?我可以以某种方式获得翻译的X,Y坐标吗?
答案 0 :(得分:0)
我有一些代码可以将点从标准坐标系转移到特定的坐标系(但在这种情况下,Y会增加屏幕中的下降,因此会进行一些调整并进行评论。)
这里,double []表示一个点,其中索引0是X坐标,索引1是Y. 请注意,新坐标系的角度是逆时针和弧度。 (乘以Pi / 180将度数转换为弧度)。
/// <summary>
/// Implemented - Returns the point coordinates related to a new coordinate system
/// Does not change original point
/// </summary>
/// <param name="Point">Point to be returned in new coordinate system</param>
/// <param name="NewSystemCouterClockRotation">CounterClokWise Angle of rotation of the new coordinate system compared to the current, measured in radians</param>
/// <param name="NewSystemOrigin">Location of the new origin point in the current coordinate system</param>
/// <returns></returns>
public double[] ChangeCoordinateSystem(double[] Point, double NewSystemCouterClockRotation, double[] NewSystemOrigin)
{
//first adjust: fix that winform downwards increasing Y before applying the method
Point[1] = -Point[1];
NewSystemOrigin[1] = -NewSystemOrigin[1]
//end of first adjust
//original method
double[] Displacement = new double[2] { Point[0] - NewSystemOrigin[0], Point[1] - NewSystemOrigin[1] };
double[] Result = new double[2]
{
+ Displacement[0] * Math.Cos(NewSystemCouterClockRotation) + Displacement[1] * Math.Sin(NewSystemCouterClockRotation),
- Displacement[0] * Math.Sin(NewSystemCouterClockRotation) + Displacement[1] * Math.Cos(NewSystemCouterClockRotation)
};
//second adjust: reset Y of the result
Result[1] = - Result[1];
return Result;
}
但是,如果你的两个物体有不同的角度,你应该小心,最好的方法是检查第一个矩形的all four corners of the first
是否不在另一个物体内,如果the other object four corners
不在第一个内部。
可以在这里找到一些algorythm来找出一个点是否在多边形内: Point in polygon