随机元素(坐标)

时间:2011-06-27 19:47:30

标签: c# random

我必须做这样的事情。

enter image description here

当我点击某个节点时,它会展开,这是正常的(我使用的是Powercharts)。 我的一个大问题是创建随机坐标,这样当我打开子节点时,它不会与另一个节点/子节点重叠。

在Powercharts中我必须传递坐标,所以最大的问题在于传递它。

我必须在C#中做随机坐标。

// --------------------------------------------- ----------

这就是我到目前为止所做的:

这就是我所做的,不重叠,但我有一个问题。 我怎样才能从起点开始做圆圈? 例如,从中间(300,300)开始,然后围绕它做圆圈。有可能吗?

private void button2_Click(object sender, EventArgs e)
        {
            g = pictureBox1.CreateGraphics();
            g.Clear(pictureBox1.BackColor);

            double angle;
            Circle item0 = new Circle();
            item0.x=200;
            item0.y=150;
            item0.r=50;
            listaCirculos.Add(item0);

            Random randomMember = new Random();
            g.DrawEllipse(pen1, 200, 150, 50, 50);

            while(listaCirculos.Count!=11)
            {
                int[] it = GenerateNewCircle(600);
                Circle item = new Circle();
                item.x = it[0];
                item.y = it[1];
                item.r = 50;

                if (circleIsAllowed(listaCirculos, item))
                {
                    listaCirculos.Add(item);
                    g.DrawEllipse(pen1, Convert.ToInt32(item.x), Convert.ToInt32(item.y), 50, 50);
                }
            }


        }

        bool circleIsAllowed(List<Circle> circles, Circle newCircle)
        {
               foreach(Circle it in circles)
               {
                  //double sumR = it.x  + newCircle.r; 
                  //double dx = it.x - newCircle.x; 
                  //double dy = it.y - newCircle.y; 
                  //double squaredDist = dx * dx + dy * dy; 
                   double aX = Math.Pow(it.x - newCircle.x, 2);
                   double aY = Math.Pow(it.y - newCircle.y, 2);
                   double Dif = Math.Abs(aX - aY);
                   double ra1 = it.r / 2;
                   double ra2 = it.r / 2;

                   double raDif = Math.Pow(ra1 + ra2, 2);
                   if ((raDif + 1) > Dif) return false;

                  //if (squaredDist < sumR*sumR) return false;
               }
               return true; // no existing circle overlaps



        }

        public int[] GenerateNewCircle(int maxSize)
        {
            int x, y;
                Random randomMember = new Random();

                x =  randomMember.Next(0,maxSize);
            if (x - 50 < 0)
                y = randomMember.Next(x + 50, maxSize);
            else if (x + 50 > 600)
                y = randomMember.Next(0, x - 50);
            else
                // in this case, x splits the range 0..n into 2 subranges.
                // get a random number and skip the "gap" if necessary
                y = randomMember.Next(0, maxSize - 50);
            if (y > x - 50)
            {
                y += 20;
            }

            int[] abc = new int[2];
            abc[0] = x;
            abc[1] = y;


            return abc;
        }

3 个答案:

答案 0 :(得分:0)

此处提供了一个链接,告知您如何创建Random Numbers in C#

您必须记住,您将生成随机数,但您还必须确保生成的数字不会使对象重叠。

答案 1 :(得分:0)

尽管措辞相当糟糕,但我相信你所寻找的是Random课程。它被实例化为:

Random thisRandom = new Random();

然后从那里,如果你想生成一个随机坐标,你需要知道最大可能的X和Y坐标。了解这些将允许您在给定画布中生成X和Y坐标:

int maxX = 500; //This is the maximum X value on your canvas
int maxY = 500; //This is the maximum Y value on your canvas

int newX, newY;

newX = thisRandom.Next(maxX);
newY = thisRandom.Next(maxY);

虽然它在“真正的”随机化方面不是绝对最好的,但这应该能满足你的需要。

答案 2 :(得分:0)

        Size sizeShape = new Size("SomeWidth" , "SomeHeight");
        List<Retangle> rects = new List<Retangle>(); 

        Random r = new Random();

    while(rects.count != "someCount")
    {
        Point rPoint = new Point(r.Next(500) , r.Next(500))
        bool isNew = true;
        foreach(Rectangle r in rects)
        {
            if(r.contains(rPoint))
                isNew = false;
        }
        if(isNew)
           rects.Add(GetRect(rPoint  , sizeShape)); 
    }

        private Rectangle GetRect(Point p , Size s)
        {
            return new Rectangle(p,s);
        }
  

之后你可以使用rects,   rects有随机坐标。