我必须做这样的事情。
当我点击某个节点时,它会展开,这是正常的(我使用的是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;
}
答案 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有随机坐标。