Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转向圈,类似于汽车轮胎_C# - Fatal编程技术网

C# 转向圈,类似于汽车轮胎

C# 转向圈,类似于汽车轮胎,c#,C#,我有C#中绘制圆的代码: 我对c#中的旋转圆有问题 我有一个像汽车轮胎的圆圈,我想向前旋转 就这样, 试试这个,每个图形对象都有一个名为RotateTransform的方法,但是这只会围绕(0,0)旋转物体,我们必须将它与TranslateTransform结合起来,才能围绕任何点旋转物体(在这种情况下,该点应该是圆的中心点): 更新:我已经为您尝试了这个演示代码,它是一个轮子,从左边缘到右边缘运行,并前后反转。。。我试图提高其性能,但这似乎是winforms的限制,您可以看到控制盘闪烁运行,启

我有C#中绘制圆的代码:

我对c#中的旋转圆有问题

我有一个像汽车轮胎的圆圈,我想向前旋转

就这样,

试试这个,每个
图形
对象都有一个名为
RotateTransform
的方法,但是这只会围绕(0,0)旋转物体,我们必须将它与
TranslateTransform
结合起来,才能围绕任何点旋转物体(在这种情况下,该点应该是圆的中心点):

更新:我已经为您尝试了这个演示代码,它是一个轮子,从左边缘到右边缘运行,并前后反转。。。我试图提高其性能,但这似乎是winforms的限制,您可以看到控制盘闪烁运行,启用双缓冲确实有点帮助,但不足以使其停止闪烁。你自己试试这个

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        center = new PointF(startOffset+r, r + 30);
        t.Interval = 1;
        t.Tick += (se, e) =>
        {
            if (s >= ClientSize.Width - r*2 - startOffset) dir = -1;
            else if (s <= startOffset) dir = 1;                
            center.X += dir * step;
            Invalidate();
        };
        t.Start();
        DoubleBuffered = true; 
        Paint += Form1_Paint;           
    }
    Timer t = new Timer();
    PointF center;
    int r = 130;
    float s;
    float step = 1f;
    int dir = 1;
    int startOffset;        
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        s += step * dir;                        
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        Wheel(s, e.Graphics);                        
        e.Graphics.FillEllipse(Brushes.Green, 
                          new RectangleF(center.X - r, center.Y - r, r * 2, r * 2));
        //draw this line to see how the wheel runs
        e.Graphics.DrawLine(Pens.Red, new PointF(center.X - r, center.Y), 
                                      new PointF(center.X + r, center.Y));
    }        
    public void Wheel(float dx, Graphics g)
    {            
        float f = (float)(dx * 180 / (r * Math.PI));
        g.TranslateTransform(center.X, center.Y);
        g.RotateTransform(f);
        g.TranslateTransform(-center.X, -center.Y);            
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
中心=新的点F(起始点F集+r,r+30);
t、 间隔=1;
t、 勾选+=(东南欧)=>
{
如果(s>=ClientSize.Width-r*2-startOffset)dir=-1;

否则如果(s使用旋转变换器)
?但是椭圆轮胎的底部不会与道路相随,除非你还包括一些上下移动中心的计算。这里是:plase帮助我旋转编码thx。但是我有旋转和移动Forward@user3042161这里需要一点代码,这样做至少需要一个timer,计算旋转角度对应的
dx
,我尝试了,但无法计算旋转角度。@user3042161查看我对整个代码的更新,它不是很好(使用
step=1
,就可以了),但这就是我所能做的,
winforms
不支持太多渲染动画的功能。无论如何,你可以在这里学习算法。
Rectangle r = new Rectangle(300, 300, 50, 50);
int dx = r.Left + r.Width/2;
int dy = r.Top + r.Height/2;
float alpha = 45;//rotate 45 degrees clockwise
g.TranslateTransform(dx, dy);
g.RotateTransform(alpha);
g.TranslateTransform(-dx,-dy);
g.FillEllipse(brush, r);
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        center = new PointF(startOffset+r, r + 30);
        t.Interval = 1;
        t.Tick += (se, e) =>
        {
            if (s >= ClientSize.Width - r*2 - startOffset) dir = -1;
            else if (s <= startOffset) dir = 1;                
            center.X += dir * step;
            Invalidate();
        };
        t.Start();
        DoubleBuffered = true; 
        Paint += Form1_Paint;           
    }
    Timer t = new Timer();
    PointF center;
    int r = 130;
    float s;
    float step = 1f;
    int dir = 1;
    int startOffset;        
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        s += step * dir;                        
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        Wheel(s, e.Graphics);                        
        e.Graphics.FillEllipse(Brushes.Green, 
                          new RectangleF(center.X - r, center.Y - r, r * 2, r * 2));
        //draw this line to see how the wheel runs
        e.Graphics.DrawLine(Pens.Red, new PointF(center.X - r, center.Y), 
                                      new PointF(center.X + r, center.Y));
    }        
    public void Wheel(float dx, Graphics g)
    {            
        float f = (float)(dx * 180 / (r * Math.PI));
        g.TranslateTransform(center.X, center.Y);
        g.RotateTransform(f);
        g.TranslateTransform(-center.X, -center.Y);            
    }
}