0

背景(実際にはマップ)として画像を含む画像ボックスがあり、その上に長方形を生成しています。これらの長方形は、指定されたポイントで移動することになっています。長方形は割り当てられた速度で移動し、ポイントの1つに到達(または接近)した後、次のポイントに移動し始めます。しかし、私の問題は、長方形が指定されたポイントに直接移動せず、座標の1つだけに近づき始めているため、長方形のY座標とポイントのY座標が同じですが、長方形は60ピクセルのようで、移動しません。以下に、動きの例として写真を追加します。青は予想されるルートで、赤は実際のルートです。私は100回のように座標をチェックしました、それらは正しいです、長方形はちょうど他の場所に動いています。ノート:

ここに画像の説明を入力してください

これは、軸XおよびYに対する長方形の動きをカウントするために使用しているコードです。

public void Move_calculate(Graphics g)
    {
        if (points[passed].X == 0 || points[passed].Y == 0) // this happens when the rectangle reaches it final point - it stays where it is (working fine)
        {
            Redraw(g);
            return;
        }
        speed = randomNumbers.Next(7, 13);
        if (points[passed].X > x_coordinate && points[passed].Y > y_coordinate)
        {
            Bx = points[passed].X;
            By = points[passed].Y;
            distanceForAlfaX = Bx - x_coordinate; // x_coordinate is the x coordinate of the rectangle
            distanceForAlfaY = By - y_coordinate;
            if (distanceForAlfaX <= 20 || distanceForAlfaY <= 20) speed = 5; // slowing down when approaching the point
            if (distanceForAlfaX + distanceForAlfaY <= 15) passed += 1;
            alpha = (distanceForAlfaY / distanceForAlfaX); // tangent alpha
            x_change = (int)(speed * (Math.Cos(alpha))); // get distance moved relative to axis X
            y_change = (int)Math.Sqrt(((speed * speed) + (x_change * x_change))); // again distance for axis Y, using Pythagoras theorem
            x_coordinate += x_change;
            y_coordinate += y_change;
        }
        else if (points[passed].X > x_coordinate && points[passed].Y < y_coordinate)
        {
            Bx = points[passed].X;
            By = points[passed].Y;
            distanceForAlfaX = Bx - x_coordinate;
            distanceForAlfaY = y_coordinate - By;
            if (distanceForAlfaX <= 20 || distanceForAlfaY <= 20) speed = 5;
            if (distanceForAlfaX + distanceForAlfaY <= 15) passed += 1;
            alpha = (distanceForAlfaY / distanceForAlfaX);
            x_change = (int)(speed * (Math.Cos(alpha)));
            y_change = (int)Math.Sqrt(((speed * speed) + (x_change * x_change)));
            x_coordinate += x_change;
            y_coordinate -= y_change;
        }
        else if (points[passed].X < x_coordinate && points[passed].Y > y_coordinate)
        {
            Bx = points[passed].X;
            By = points[passed].Y;
            distanceForAlfaX = x_coordinate - Bx;
            distanceForAlfaY = By - y_coordinate;
            if (distanceForAlfaX <= 20 || distanceForAlfaY <= 20) speed = 5;
            if (distanceForAlfaX+distanceForAlfaY <= 15) passed += 1;
            alpha = (distanceForAlfaY / distanceForAlfaX);
            x_change = (int)(speed * (Math.Cos(alpha)));
            y_change = (int)Math.Sqrt(((speed * speed) + (x_change * x_change)));
            x_coordinate -= x_change;
            y_coordinate += y_change;
        }
        else if (points[passed].X < x_coordinate && points[passed].Y < y_coordinate)
        {
            Bx = points[passed].X;
            By = points[passed].Y;
            distanceForAlfaX = x_coordinate - Bx;
            distanceForAlfaY = y_coordinate - By;
            if (distanceForAlfaX <= 20 || distanceForAlfaY <= 20) speed = 5;
            if (distanceForAlfaX + distanceForAlfaY <= 15) passed += 1;
            alpha = (distanceForAlfaY / distanceForAlfaX);
            x_change = (int)(speed * (Math.Cos(alpha)));
            y_change = (int)Math.Sqrt(((speed * speed) + (x_change * x_change)));
            x_coordinate -= x_change;
            y_coordinate -= y_change;
        }
        else
        {
            MessageBox.Show("Something went wrong"); // just notify me that it isnt working again..
        }
        Pen p = new Pen(Color.Turquoise, 2);
        r = new Rectangle(x_coordinate, y_coordinate, 5, 5); // redraw the rectangle
        g.DrawRectangle(p, r);
        p.Dispose();
    }

なぜこれが起こっているのか分かりませんが、誰かがこれを手伝ってくれるでしょうか?PS動きがスムーズである必要はまったくありません。長方形の位置は、タイマーを使用して2秒に1回更新されます。今のところ、一時的にボタンに設定されています。

編集:これがforeachコードです。ラベルは、PictureBoxの横に表示される座標です。

                     foreach (aircraft acft in aircrafts) // aircraft is an array aircrafts[]
                {
                        label2.Text = "xp" + acft.points[acft.passed].X;
                        label3.Text = "yp" + acft.points[acft.passed].Y;
                        label4.Text = acft.passed.ToString();
                        label5.Text = "y" + acft.y_coordinate.ToString();
                        //MessageBox.Show(acft.points[0].X.ToString());
                        acft.Move_calculate(e.Graphics);
                        spawn = string.Empty;
                    }

EDIT2:aircraftクラス内のすべての変数

        public string callsign;
    public int speed;
    public double heading;
    public bool moving = false;
    public Point[] points;
    public double alpha;
    public int x_change;
    public int y_change;
    public int x_coordinate;
    public int y_coordinate;
    public int Bx;
    public int By;
    public double distanceForAlfaX;
    public double distanceForAlfaY;
    public int passed = 0;
    public Rectangle r;
4

2 に答える 2

1

座標系を確認しましたか?(https://web.archive.org/web/20140710074441/http://bobpowell.net/coordinatesystems.aspx

申し訳ありませんが、問題のリンクが間違っています。Control.PointToClientを使用してデバッグを試み、すべての座標がクライアント空間で表現されていることを確認してください。(https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.pointtoclient

あなたは試すことができます:

    Point cPoint = this.PointToClient(new Point(x_coordinate, y_coordinate));
    Size cSize = new Size(5,5);
    r = new Rectangle(cPoint, cSize); // redraw the rectangle
    g.DrawRectangle(p, r);

コードを明確にするために、変数のデータ型を投稿できますか?特に整数除算を使用している場合は、どこかで精度が低下する可能性があります。

(DJ KRAZEの場合、a-= b; C#ではa = a --b;コンテキストが重要であることを意味する場合もあります。)

于 2013-03-09T21:26:28.937 に答える
1

たぶん、数学の間違いがあります

y_change = (int)Math.Sqrt(((speed * speed) + (x_change * x_change)));

さらに...

// again distance for axis Y, using Pythagoras theorem

ピタゴラスさんとしましょう、X軸と同じものを使いたいです

y_change = (int)(speed * (Math.Sin(alpha)));
于 2013-03-10T18:59:05.103 に答える