旋转多边形

时间:2016-02-22 01:48:16

标签: c# timer rotation polygon points

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

我的绘图是一颗星,但它只是一堆三角形,所以如果我能正确旋转其中一个,我也可以让其他人正确旋转。 那么,下面是一个三角形的代码

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是一个全局Graphics变量,它等于PictureBox上paint事件的e.Graphics。

然后我有一个计时器,我想要多边形旋转的每个刻度。我尝试了每个刻度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的帖子但是当我尝试在我的代码中使用它时,多边形仍然会变形。

1 个答案:

答案 0 :(得分:0)

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

  • 由于你在课堂上,你可能会找到一个分析解决方案来计算所有点的旋转位置。

  • 在现实生活中,或者如果教徒没有明确要求数学解决方案,那么就有一条旧规则:

  

始终使用系统排序

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

在这种情况下,最好和最有效的解决方案是使用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中,但计算基本相同..

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