2011-06-27 28 views
0

私はこのようなことをしなければなりません。ランダムな要素(座標)

enter image description here

私はノードをクリックすると、それが拡大し、これは(私はそれを行うにはPowerchartsを使用しています)OKです。 大きな問題は、サブノードを開いたときに他のノード/サブノードと重ならないようにランダムな座標を作成することです。

私は座標を渡す必要があるので、大きな問題はそれを渡すことです。

私はC#でランダム座標を行う必要があります。

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

これは私がこれまでにやったことです:

これはoverlapingされていない、私は何をすべきかですが、私は問題を抱えています。 出発点からサークルを始めるにはどうすればよいですか?たとえば、 は、中央(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; 
     } 

答えて

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は、ランダムな座標を持っています。

+0

Hmmm、実際の問題を解決するのではなく、ブルートフォースのアプローチを取っています。また、リストにポイントオブジェクトが含まれているかどうかを確認しています... – MoarCodePlz

+0

申し訳ありませんが、私は間違っていますしかし、今私は正しいと思います。 – hashi

+0

こんにちは、ほぼそうですが、長方形が別のものと重なっていないかどうかを確認するにはどうすればいいですか? – Luis

0

Random Numbers in C#の作成方法を教えてください。

乱数を生成することに注意する必要がありますが、生成された数によってオブジェクトが重ならないようにする必要があります。

+0

ランダムを使用した場合、サブノードはたとえばx:500; y:500であり、サブノードはたとえばx:40; y60などであるため、コーディネートが間違っている可能性があります。それはランダムが大丈夫ではないからです:S – Luis

+0

ボトムライン:乱数が必要ですが、取得した後にそれらを扱い、検証する必要があります。彼らがあなたに合っていない場合は、新しい番号を取得する必要があります。警告:無限ループに注意してください。あなたが数字を生成したままにしておけば、その数字はあなたが最初に思ったようにランダム*ではありません。 –

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); 

。あなたはrectsから使うことができるよりも後

+0

しかし、私がランダムを使用した場合、サブノードは例えばx:500; y:500であり、サブノードは例えばx:40; y60であるため、コーディネートは間違っている可能性があります。つまり、ランダムがOKでないためです。S – Luis

+0

次に、ノードから適切な距離を決定します。適切な距離が20の場合、newX = thisRandom.Next(2 * 20) - 20;を実行します。そして、これを最初のx値から差し引きます。これにより、新しいx値が以前のx値の20ピクセル以内にあることが保証されます。 – MoarCodePlz

+0

ですが、半径20の場合はどうすれば確認できますか? – Luis

関連する問題