如何更新旋转矩形边上的x,y坐标

时间:2012-11-18 17:56:10

标签: c# coordinates rectangles rotatetransform

好的,所以我搜索并搜索了我的问题的解决方案,但似乎没有解决它。

我需要用旋转的“大炮”制作一个游戏,我的大炮是一个放在我面板中间的简单矩形,我可以用键盘旋转。它围绕一个边缘旋转。我想从另一边射出边缘。我找到了使用以下方法射击子弹的起点:

x = a + dia * (float)Math.Cos(angle);
y = b + dia * (float)Math.Sin(angle)

其中“a,b”是中心坐标我旋转它,“dia”是矩形的对角线,“angle”是我矩形的一半的角度。

public float rotate = 0.0f; 
g.TranslateTransform(a , b);
        g.RotateTransform(rotate);

我有一个自己的子弹,我把它放在一个List中。 到现在为止还挺好。但是当我旋转我的大炮时,子弹不再从尖端出来......它们刚刚开始出现在我想要的地方。这是因为这段代码:

x = (float)((x * Math.Cos(rotate)) - (y * Math.Sin(rotate)));
        y = (float)((x * Math.Sin(rotate)) + (y * Math.Cos(rotate)));

应该更新大炮尖端的x,y坐标。 如果我删除它,它只是从同一个地方发射(没有狗屎)。 有人可以向我解释一下我需要写什么代码来更新X,Y以便它们从我的矩形边缘出来?这让我发疯了......

编辑: 在清晨找到了我的答案,盯着屏幕。我不需要任何“找到新的x,y坐标”。我只是制作了一个更新器,用每次旋转时移动一点所需的浮点数更新原始角度。 哈!这么简单,但很难看到。

1 个答案:

答案 0 :(得分:0)

首先,

x = (float)((x * Math.Cos(rotate)) - (y * Math.Sin(rotate)));
y = (float)((x * Math.Sin(rotate)) + (y * Math.Cos(rotate)));

需要像:

float oldx = x;
float oldy = y; 
x = (float)((oldx * Math.Cos(rotate)) - (oldy * Math.Sin(rotate)));
y = (float)((oldx * Math.Sin(rotate)) + (oldy * Math.Cos(rotate)));

你的新价值必须纯粹基于旧价值。

如果修复此问题后还有其他任何问题,可能与矩形在平面上的翻译方式有关。

编辑:如果这是代码审查,我会说我刚给出的解决方案也不是最好的解决方案(它只是没有因为使用x的新值来计算你所引入的错误y)的新价值。与乘法和加法相比,参见Math.Cos和Math.Sin通常是昂贵的操作。如果您有一堆需要以相同方式变换的点,最好一次计算Math.Sin(rotate)Math.Cos(rotate),并为每个点使用这些值。这可能是使用Flyweight pattern并定义一个类的好地方,其中实例将保存给定对象/上下文的所有点,以便可以聚合完成操作。