嘿,我是C#Graphics Programming的新手。我需要知道如何在角度方向上移动窗体内的椭圆。我已经使用我的代码成功地将我的Ellipse移动到默认方向。
我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Paddle_Test
{
public partial class Form1 : Form
{
Rectangle rec;
int wLoc=0;
int hLoc=0;
int dx=3;
int dy=3;
public Form1()
{
InitializeComponent();
rec = new Rectangle(wLoc,hLoc , 100, 10);
}
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.Blue), rec);
}
private void timer_Tick(object sender, EventArgs e)
{
//moving inside my timer
rec.X += dx;
rec.Y += dy;
}
}
}
简单来说,我的椭圆只是对角移动!所以问题用简单的话来说就是我可以像30'或80'或角度指定!
答案 0 :(得分:2)
我相信你正在寻找一些基本的三角函数,比如:
x = cos(degrees) * maxX;
y = sin(degrees) * maxY;
答案 1 :(得分:1)
Rectangle.X / Y是int
,添加到这样的整数至少会向X或Y添加+1,从而导致对角线移动。
dx和dy应为float
或double
。对于X和Y坐标,您还必须具有浮点变量并使用它进行计算。计算完成后,您可以将自己的X / Y分配给矩形。
从你的代码中你应该多写一下:
public partial class Form1 : Form
{
Rectangle rec;
int wLoc=0;
int hLoc=0;
double xpos=0;
double ypos=0;
double dx=0.3;
double dy=0.6;
然后在你的计时器中计算如下:
xpos += dx;
ypos += dy;
rec.X = xpos;
rec.Y = ypos;
墙上的反射可以在计时器中通过取消dx或dy来完成,具体取决于您到达的那一侧。
如果你想用角度作为输入来计算dx和dy你可以这样做:
xpos += cos(angleInDegrees / 360.0 * 2 * Math.PI) * speed;
ypos += -sin(angleInDegrees / 360.0 * 2 * Math.PI) * speed;
rec.X = xpos;
rec.Y = ypos;
速度是每个timercall以像素为单位的移动。