使用角度移动矩形
我需要使用角度移动矩形。 实际上,我想在我的代码中给出的位置在if语句中更改我的移动矩形的方向!
我只需要我能找到如何在60,30,60,120,150,270度移动矩形的方式!
假设如果
circle.Y>=this.Height-80
看到这个:
我真的需要改变使用角度的矩形运动的方向! 以便在某个位置达到我可以根据我自己选择的角度更改矩形方向! 这样:
if(circle.Y>=this.Height-80)
move in the direction of 90 degrees
if(circle.X>=this.Width-80)
move in the direction of 60 degree
正如你在屏幕截图中看到的那样!
我一直在尝试的是:
public partial class Form1 : Form
{
Rectangle circle;
double dx = 2;
double dy = 2;
public Form1()
{
InitializeComponent();
circle = new Rectangle(10, 10, 40, 40);
}
private void Form1_Load(object sender, EventArgs e)
{
this.Refresh();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillEllipse(new SolidBrush(Color.Red), circle);
}
private void timer_Tick(object sender, EventArgs e)
{
circle.X += (int)dx;
circle.Y += (int)dy;
if (circle.Y>=this.Height-80)
{
dy = -Math.Acos(0) * dy/dy; //here i want to change the direction of circle at 90 degrees so that it should go up vertically straight with same speed
}
this.Refresh();
}
}
问题是我一直在尝试改变我的条件:
dy = -Math.Asin(1) * dy;
dx = Math.Acos(0) * dx ;
但在两种情况下都没有发生,方向保持不变! 我只是想在90度的时候将圆圈向上翻转90度
circle.Y>=this.Height-80
您需要再次将矩形绘制为某个图像才能显示。 我创建了这个代码,用于在pictureBox1
上移动和绘制矩形,使用已经定义的circle
-rectangle:
移动矩形:
public void MoveRectangle(ref Rectangle rectangle, double angle, double distance)
{
double angleRadians = (Math.PI * (angle) / 180.0);
rectangle.X = (int)((double)rectangle.X - (Math.Cos(angleRadians) * distance));
rectangle.Y = (int)((double)rectangle.Y - (Math.Sin(angleRadians) * distance));
}
绘制矩形并将其显示在PictureBox
:
public void DrawRectangle(Rectangle rectangle)
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.FillEllipse(new SolidBrush(Color.Red), rectangle);
}
pictureBox1.Image = bmp;
}
用一个按钮点击演示它:
private void Button1_Click(object sender, EventArgs e)
{
MoveRectangle(ref circle, 90, 5);
DrawRectangle(circle);
}
Math.Asin(1)* dy是一个常数值。 因此,您应该使用例如在您的计时器的每个Tick中增加的实例变量。
... * dy / dy是无关紧要的。
public partial class Form1 : Form
{
Rectangle circle;
double dx = 2;
double dy = 2;
acum=0; //the new variable
...
private void timer_Tick(object sender, EventArgs e)
{
circle.X += (int)dx;
circle.Y += (int)dy;
if (circle.Y>=this.Height-300)
{
dy = -Math.Acos(acum);
acum+=1; //your accumulator
}
this.Refresh();
}
acos和asin是sin和cos的倒数,所以这两个函数的输出是一个角度(通常以弧度表示)。 这会使代码不正确。
我强烈建议你阅读向量和矩阵数学,因为使用欧拉角会变得相当混乱。
所以,你将有一个位置矢量P和一个运动矢量M,当前位置是:
P' = P + M.t
其中t是时间,P是原始位置,P'是当前位置。
然后,当您想改变方向时,您将创建一个旋转矩阵并将该运动矢量M乘以该旋转矩阵。
这样做的好处是,您可以通过向矢量添加Z分量并增加矩阵大小,从2D系统跳转到3D系统。
链接地址: http://www.djcxy.com/p/79461.html