0

実行時にコントロールの x/y 位置を変更でき、タイマーを使用して上/下/左/右/斜めに移動できることは知っていますが、プログラムで円内に移動するにはどうすればよいですか?

たとえば、メイン フォームの 12 時の位置に PictureBox コントロールがある場合、その画像ボックスを円形に移動し、ボタン クリックで開始位置で終了することはできますか?

4

2 に答える 2

4

正弦関数と余弦関数を使用します。

たとえば、それをてください。

具体的な C# の例がここにあります。リンクがいつか存在しない場合に備えて、フォーム上に半径が増加する 25 個の円を描画するためのソース コードを次に示します。

void PutPixel(Graphics g, int x, int y, Color c)
{
      Bitmap bm = new Bitmap(1, 1);
      bm.SetPixel(0, 0, Color.Red);
      g.DrawImageUnscaled(bm, x, y);
}

private void Form1_Paint(object sender, PaintEventArgs e)
{  
      Graphics myGraphics = e.Graphics;

      myGraphics.Clear(Color.White);
      double radius = 5;
      for (int j = 1; j <= 25; j++)
      {
            radius = (j + 1) * 5;
            for (double i = 0.0; i < 360.0; i += 0.1)
            {
                double angle = i * System.Math.PI / 180;
                int x = (int)(150 + radius * System.Math.Cos(angle));
                int y = (int)(150 + radius * System.Math.Sin(angle));

                PutPixel(myGraphics, x, y, Color.Red);
            }
      }
      myGraphics.Dispose();
}

結果:

ここに画像の説明を入力

于 2013-01-02T13:51:58.170 に答える
1

PictureBox結果を簡単に達成できるようにするための小さなクラスを作成しました。呼び出すたびにRotateStep、それに応じてその場所が変わります。角度と速度はラジアンで、距離はピクセルで表されます。

class RotatingPictureBox : PictureBox
{
    public double Angle { get; set; }
    public double Speed { get; set; }
    public double Distance { get; set; }

    public void RotateStep()
    {
        var oldX = Math.Cos(Angle)*Distance;
        var oldY = Math.Sin(Angle)*Distance;
        Angle += Speed;
        var x = Math.Cos(Angle)*Distance - oldX;
        var y = Math.Sin(Angle)*Distance - oldY;
        Location += new Size((int) x, (int) y);
    }
}

使用例:

public Form1()
{
    InitializeComponent();
    var pictureBox = new RotatingPictureBox
    {
        Angle = Math.PI,
        Speed = Math.PI/20,
        Distance = 50,
        BackColor = Color.Black,
        Width = 10,
        Height = 10,
        Location = new Point(100, 50)
    };
    Controls.Add(pictureBox);
    var timer = new Timer {Interval = 10};
    timer.Tick += (sender, args) => pictureBox.RotateStep();
    timer.Start();
}
于 2013-01-02T14:05:33.263 に答える