旋转多边形

本文关键字:多边形 旋转 | 更新日期: 2023-09-27 18:35:40

我一直在搜索这个网页,我可以旋转多边形,但我可能会丢失一些东西或只是没有得到它。

我的画是一颗星星,但它只是一堆三角形,所以如果我能正确旋转其中一个,我也可以使其他三角形正确旋转。所以,这是一个三角形的代码

Point[] pico1 = new Point[3];
            pico1[0] = new Point(220, 240);   //Origin         
            pico1[1] = new Point(220, 40);
            pico1[2] = new Point(160, 140);
g.FillPolygon(Rojo2, pico2);

g 是一个全局图形变量,等于 e.Picture Box 上绘制事件的图形。

然后我有一个计时器,我希望多边形旋转的每个刻度。我尝试了每次 90° 的刻度,但我的三角形只是变形了。所以我真的不知道如何为这一点获得新的坐标。老师说我可以做这样的事情:

Point[] pico1 = new Point[3];
                pico1[0] = new Point(220, 240);   //Origin         
                pico1[1] = new Point(220+px, 40+py);
                pico1[2] = new Point(160+px, 140+py);
    g.FillPolygon(Rojo1, pico1);

px 和 py 是初始值为 0 的全局变量。我想这两个帮助我得到了新的观点,但我真的迷茫了。

有没有更简单的方法可以旋转三角形(220,240)?或者我如何使用 px 和 py 来做到这一点?我真的不知道该怎么办。我在这里找到了一些使用 sin 和 cos 的帖子,但是当我尝试在我的代码中使用它时,多边形仍然变形。

旋转多边形

最好的课程实际上取决于你应该做什么:

  • 由于您在课堂上,因此您应该找到一种涉及计算所有点的旋转位置的分析解决方案。

  • 在现实生活中,或者如果戏剧家没有明确要求数学解决方案,那么有一个古老的规则:

始终使用系统排序

这是指是编写冒泡排序还是快速排序或其他排序例程的问题。最好的解决方案是始终使用内置排序,因为它将快速可靠。

在这种情况下,最好和最有效的解决方案是使用 GDI+ 的内置旋转功能(如果这是你正在使用的)。插入这两行将完成这项工作:

g.TranslateTransform(220, 240);
g.RotateTransform(angle);
g.FillPolygon(Rojo2, pico1);

您将需要两个类级别变量来计算角度和一个Timer.Tick来执行动画中的旋转:

float angularSpeed = 1.5f;
float angle = 0f;
void timer_Tick(object sender, EventArgs e)
{
    angle = (angle + angularSpeed) % 360; 
    yourPictureBox.Invalidate(); 
}

我使用您命名的坐标作为原点。它们对于您的所有形状都需要相同,否则它们会漂移开来。您可以通过将多边形添加到GraphicsPath并计算边界矩形的中心来找到多边形的中心:gp.GetBounds() ..

顺便说一句:我希望你没有真正缓存Graphics对象,因为这是一个坏主意!!相反,始终使用Paint事件中的那个,从事件中传递它,但不保留它,因为它需要始终是最新的!

如果你需要计算,你将不得不做一些数学。 看看右边栏中的答案;它们大多是用java写的,但计算基本相同。

你引用的代码作为老师的提示对我来说没有意义;移动量将取决于每个点与原点的相对位置。所以对面的点会朝相反的方向移动。你可能误会了。