在Tao Framework C#中生成OpenGL的OpenGL

时间:2014-05-23 02:21:20

标签: c# opengl frameworks tao-framework

我在这个类中生成带有给定随机数的矩形。

class Rect
{
     double x;
     double y;

    public Rect(double _x, double _y)
    {
        x = _x;
        y = _y;

    }
    public void Draw()
    {
        Gl.glBegin(Gl.GL_QUADS);
        Gl.glVertex2d(x + (-0.05d), y + (-0.05d));  
        Gl.glVertex2d(x + (-0.05d), y + (0.05d));     
        Gl.glVertex2d(x + (0.05d),  y + (0.05d));          
        Gl.glVertex2d(x + (0.05d),  y + (-0.05d));     
        Gl.glEnd();

    }
}

我在Paint函数中调用它。

        private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
        {
          Gl.glClearColor(0, 1, 0, 0);
          Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            for (int i = 0; i < 4; i++)
            {
              rand = new Random();
              double x = 2 * rand.NextDouble() - 1;
              double y = 2 * rand.NextDouble() - 1;

              rect= new Rect(x,y);
              rect.Draw(); 
            }
        }

一切看起来都不错,但有些不对劲。我看不到所有的矩形。其中一些人失踪了。但是如果我在某个地方切换断点或者让MessageBox.Show(x+" "+y);代码正常工作并向我展示我想要的矩形数量。我认为我的代码是真的,但OpenGL有些不对劲。我正在使用Tao Framework。

1 个答案:

答案 0 :(得分:1)

我的猜测是问题在于这段代码:

for (int i = 0; i < 4; i++)
{
    rand = new Random();
    double x = 2 * rand.NextDouble() - 1;
    double y = 2 * rand.NextDouble() - 1;

    rect= new Rect(x,y);
    rect.Draw(); 
}

您正在循环的每次迭代中创建一个新的Random实例,然后使用该实例生成两个随机值。 Random生成的值序列取决于用于初始化Random种子。根据此处使用的构造函数的documentation

  

默认种子值是从系统时钟派生的,并且是有限的   分辨率。

也就是说,如果循环运行得足够快,循环中Random的不同实例将使用相同种子进行初始化,从而导致它们生成相同的x }和y值:矩形然后重叠并且似乎缺失。这也解释了为什么你的代码在使用断点或消息框中断它时会起作用。

修改:此问题的最佳解决方案是在您的Random语句之前初始化rand或在您的循环之外创建单个for实例(例如,作为类成员)在类的构造函数中。