【发布时间】:2017-06-15 09:39:59
【问题描述】:
我正在尝试使用计时器随机旋转多边形。我必须绘制正多边形并将其旋转到一个方向。但我不确定如何使用角度或计时器间隔将多边形旋转到随机方向。
我的代码如下:
int sides = 5;
Graphics g = e.Graphics;
nPoints = CalculateVertices(sides, radius, angle, center);
g.DrawPolygon(navypen, nPoints);
g.FillPolygon(BlueBrush, nPoints);
Point center = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
for(int i = 0; i < sides; i++) {
g.DrawLine(new Pen(Color.Navy), center.X, center.Y, nPoints[i].X, nPoints[i].Y);
}
private PointF[] CalculateVertices(int sides, int radius, float startingAngle, Point center)
{
if (sides < 3) {
sides = 3;
}
List<PointF> points = new List<PointF>();
float step = 360.0f / sides;
float angle = startingAngle; //starting angle
for (double i = startingAngle; i < startingAngle + 360.0; i += step) //go in a circle
{
points.Add(DegreesToXY(angle, radius, center));
angle += step;
}
return points.ToArray();
}
private PointF DegreesToXY(float degrees, float radius, Point origin)
{
PointF xy = new PointF();
double radians = degrees * Math.PI / 180.0;
xy.X = (int)(Math.Cos(radians) * radius + origin.X);
xy.Y = (int)(Math.Sin(-radians) * radius + origin.Y);
return xy;
}
private void timer2_Tick(object sender, EventArgs e){
angle += 1;
angle_tri -= 1;
Invalidate();
}
【问题讨论】:
-
您究竟在寻求什么帮助?计时器?生成随机数?旋转多边形?目前尚不清楚您的问题是什么。并且要明确我问这个的原因是因为你的问题应该集中在一个特定的问题上,而不是一个包含许多其他问题的更广泛的问题。
-
如果改为旋转图形对象会容易得多。用 Graphics.TranslateTransform 移动到旋转中心,然后用 Graphics.RotateTransform 旋转,向后移动并绘制多边形。然后 ResetTranform.. - 您还可以将点填充到 GraphicsPath 并使用旋转矩阵对其进行变换..
-
@Taw 我可以在不改变角度的情况下使用随机计时器间隔执行此操作吗?
-
随机?是的,随机定时器间隔?是的。不改变角度?不,每个绘制事件都以未旋转的图形对象开始。将角度存储在类(很可能是 Form)级别并在 Tick 中修改。在那里你也可以改变间隔..
-
@TaW 对不起,你能给我举个例子吗?