【问题标题】:Rotate a polygon旋转多边形
【发布时间】:2016-02-22 01:48:15
【问题描述】:

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

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

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 上绘制事件的 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 的帖子,但是当我尝试在我的代码中使用它时,多边形仍然会变形。

【问题讨论】:

  • 使用SinCos 应该是您处理此类转换的方式。这毕竟是一个几何问题。如果有任何变形,很可能是您使用的几何公式​​错误造成的。您可以展示您如何使用SinCos 以及它如何冤枉您(展示变形)。
  • 您有两个选择:1) 使用 Math.Sin 等进行计算。 2) 将 Graphics 对象旋转一个角度。第一个是纯数学,不难,但使用一些三角公式或可能建立一个矩阵。后者就像执行 Graphics.RotateTransform 一样简单(在执行 TranslateTransform 以将原点移动到旋转中心之后)。这真的取决于你应该达到什么目标..

标签: c# timer rotation polygon points


【解决方案1】:

最好的课程真的取决于你应该做什么:

  • 由于您在课堂上,很可能您应该找到一个解析解决方案,该解决方案将涉及计算所有点的旋转位置。

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

始终使用系统排序

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

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

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

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多