0

こんにちは

1 つの大きな楕円に 40 個の楕円を描きたい。それは奇妙です。

for (int i = 0; i < 40; i++)
        {
            {
                {
                    Random r = new Random();
                    int distance = r.Next(0, 10000);
                    var rv = r.Next(0, 359);
                    var x = Math.Sin(rv * Math.PI / 180) * 225;
                    rv = r.Next(0, 359);
                    var y = Math.Cos(rv * Math.PI / 180) * 225;
                    Ellipse e = new Ellipse();
                    e.Fill = new SolidColorBrush(Color.FromArgb(255, (byte)(counter * 5), (byte)(counter * 3), (byte)(counter * 1)));
                    e.Margin = new Thickness(y, -150 + x, 0, 0);
                    e.Width = 25;
                    e.Height = 25;
                    counter++;
                    PointsGrid.Children.Add(e);
                }
            }
        }

このコードは、7、8 個、場合によっては 9 個の楕円しか描画しません。しかし、コードに追加の行を追加すると:

for (int i = 0; i < 40; i++)
        {
            {
                {
                    Random r = new Random();
                    int distance = r.Next(0, 10000);
                    var rv = r.Next(0, 359);
                    var x = Math.Sin(rv * Math.PI / 180) * 225;
                    rv = r.Next(0, 359);
                    var y = Math.Cos(rv * Math.PI / 180) * 225;
                    Ellipse e = new Ellipse();
                    e.Fill = new SolidColorBrush(Color.FromArgb(255, (byte)(counter * 5), (byte)(counter * 3), (byte)(counter * 1)));
                    e.Margin = new Thickness(y, -150 + x, 0, 0);
                    e.Width = 25;
                    e.Height = 25;
                    counter++;
                    PointsGrid.Children.Add(e);
                    MessageBox.Show(""); // Additional line
                }
            }
        }

表示するメッセージ ボックスを追加し、それらすべてで [OK] を押すと、40 個すべての楕円が表示されます...

問題は、それがどのようになるか、どうすれば修正できるかです。

4

2 に答える 2

4

問題は、ランダムの使用です。毎回新しい Random() を作成すると、現在の時間がシードとして使用されます。現在の時刻が同じであるため (コードが非常に迅速に実行されるため、疑似乱数は常に同じです)。

Random r = new Random();

for (int i = 0; i < 40; i++)
        {
            {
                {
                    int distance = r.Next(0, 10000);
                    var rv = r.Next(0, 359);
                    var x = Math.Sin(rv * Math.PI / 180) * 225;
                    rv = r.Next(0, 359);
                    var y = Math.Cos(rv * Math.PI / 180) * 225;
                    Ellipse e = new Ellipse();
                    e.Fill = new SolidColorBrush(Color.FromArgb(255, (byte)(counter * 5), (byte)(counter * 3), (byte)(counter * 1)));
                    e.Margin = new Thickness(y, -150 + x, 0, 0);
                    e.Width = 25;
                    e.Height = 25;
                    counter++;
                    PointsGrid.Children.Add(e);
                    //MessageBox.Show(""); // Additional line
                }
            }
        }

メッセージボックスは実行を「遅くする」だけです。つまり、すべての円が重なり合って描画されるわけではありません。

于 2012-04-27T10:06:28.783 に答える
3

それはタイミングの問題かもしれません。シードは現在の時刻に基づいているため、ループの外で Random を宣言する必要があります。

    Random r = new Random();

    for (int i = 0; i < 40; i++)
    {
        int distance = r.Next(0, 10000);
        var rv = r.Next(0, 359);
        var x = Math.Sin(rv * Math.PI / 180) * 225;
        rv = r.Next(0, 359);
        var y = Math.Cos(rv * Math.PI / 180) * 225;
        Ellipse e = new Ellipse();
        e.Fill = new SolidColorBrush(Color.FromArgb(255, (byte)(counter * 5), (byte)(counter * 3), (byte)(counter * 1)));
        e.Margin = new Thickness(y, -150 + x, 0, 0);
        e.Width = 25;
        e.Height = 25;
        counter++;
        PointsGrid.Children.Add(e);
    }

それが本当にあなたの問題である場合、それはあなたが実際に40個の楕円を描いていることを意味しますが、それらのほとんどは重なり合っています.

于 2012-04-27T10:06:16.867 に答える