我有一个带有图像的图片框。图像包含两个面对面的椭圆(黑色和蓝色)。
我想要的是在计时器中旋转图片框(为了效果),使图像变为"颠倒"看起来更像是他们改变了地方,基本上它只是旋转图片框,就像时代在它的轴周围移动一样。
答案 0 :(得分:0)
地球仪有各种旋转方式,具体取决于您的视角。
如果你从两极上方看它,它会像磁盘或齿轮一样旋转,你可以找到它的代码here。这样做的好处是可以使用任何图像并旋转它。
如果你从侧面看它,面对赤道你不能轻易使用位图,但只使用两种颜色它仍然看起来不错..
以下是'类球状'旋转旋转的示例:
float angle = 0f;
float aSpeed = 4f; // <-- set your speed
Brush brush1 = Brushes.CadetBlue; // and your..
Brush brush2 = Brushes.DarkSlateBlue; // ..colors
private void timer1_Tick(object sender, EventArgs e)
{
angle += aSpeed;
if (angle + aSpeed > 360)
{
angle -= 360f;
Brush temp = brush1;
brush1 = brush2;
brush2 = temp;
}
pictureBox1.Invalidate();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Rectangle r = pictureBox1.ClientRectangle;
Rectangle r2 = r; // see below..
r.Inflate(-20, -20); // a little smaller than the panel or pBox
if (angle < 180)
{
e.Graphics.FillEllipse(brush1, r);
e.Graphics.FillPie(brush2, r, 270, 180);
r.Inflate(-(int)(r.Width * angle / 360f), 0);
e.Graphics.FillEllipse(brush2, r);
}
else
{
e.Graphics.FillEllipse(brush2, r);
e.Graphics.FillPie(brush1, r, 90, 180);
r.Inflate(-(int)(r.Width * angle / 360f), 0);
e.Graphics.FillEllipse(brush1, r);
}
}
}
这是由三个DrawXXX
调用创建的:一个颜色的圆圈,一个椭圆和一个圆弧,设置为显示相同的第二种颜色的半圆。
注意:要使角速度均匀,您可能需要使用一点Math.Sin
和/或角度表...
如果你从任何其他角度看它,如果你需要在3D中显示旋转位图,你不能轻易地绘制它,但需要求助于显示帧..
但是你可以将链接中的磁盘旋转与上面的代码结合起来并获得相当复杂的旋转,看起来很像3D球体。只需在绘图之前添加代码..
float bw2 = r2.Width / 2f;
float bh2 = r2.Height / 2f;
e.Graphics.TranslateTransform(bw2, bh2);
e.Graphics.RotateTransform(angle / 3);
e.Graphics.TranslateTransform(-bw2, -bh2);
..使用上面的绘图而不是DrawImage
行,并将ResetTransform
移到最后。您将需要使用不同的或缩放的角度!