所以我在 Windows 窗体应用程序中得到了一个圆圈,并且必须在这个圆圈中放置 20 个随机点。我的想法是将圆圈分成 4 个部分,使其更加平衡。我的问题是这些点都是围绕中间生成的,我不知道如何解决这个问题......
Graphics g;
Pen p;
Random r = new Random();
int[] KegelX = new int[20];
int[] KegelY = new int[20];
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Kegelplatzierung();
p = new Pen(Color.Black);
g = this.CreateGraphics();
g.DrawEllipse(p, new Rectangle(50, 50, 400, 400));
for (int i = 0; i < 20; i++)
{
g.DrawEllipse(p, new Rectangle(KegelX[i], KegelY[i], 1, 1));
}
p.Dispose();
g.Dispose();
}
private void Kegelplatzierung() {
for (int i = 0; i < 5; i++)
{
bool Kriterium = false;
while (!Kriterium)
{
KegelX[i] = r.Next(50, 250);
KegelY[i] = r.Next(50, 250);
if (Math.Sqrt((250 - KegelX[i]) ^ 2 + (KegelY[i] - 250) ^ 2) < 200)
{
Kriterium = true;
}
}
}
for (int i = 5; i < 10; i++)
{
bool Kriterium = false;
while (!Kriterium)
{
KegelX[i] = r.Next(250, 450);
KegelY[i] = r.Next(50, 250);
if (Math.Sqrt((KegelX[i] - 250) ^ 2 + (KegelY[i] - 250) ^ 2) < 200)
{
Kriterium = true;
}
}
}
for (int i = 10; i < 15; i++)
{
bool Kriterium = false;
while (!Kriterium)
{
KegelX[i] = r.Next(50, 250);
KegelY[i] = r.Next(250, 450);
if (Math.Sqrt((250 - KegelX[i]) ^ 2 + (250 - KegelY[i]) ^ 2) < 200)
{
Kriterium = true;
}
}
}
for (int i = 15; i < 20; i++)
{
bool Kriterium = false;
while (!Kriterium)
{
KegelX[i] = r.Next(250, 450);
KegelY[i] = r.Next(250, 450);
if (Math.Sqrt((KegelX[i] - 250) ^ 2 + (250 - KegelY[i]) ^ 2) < 200)
{
Kriterium = true;
}
}
}
}
示例:http://puu.sh/gB6Dg/e81f8c3486.png http://puu.sh/gB6Ec/306f61424c.png
感谢您的帮助!
最佳答案
这将按照您的计划进行。但是请注意,只有当您确实需要它来平衡非常少数点时,四个象限之间的对称性才是必要的。对于更大的数字,这是没有必要的,您可以将代码减少到一半左右……!
private void panel2_Paint(object sender, PaintEventArgs e)
{
int dotsPerQuadrant = 666;
Random R = new Random();
Size s1x1 = new System.Drawing.Size(2, 2);
int radius = 200;
int rad2 = radius / 2;
int off = 20;
Rectangle bounds = new Rectangle(off, off, radius, radius);
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(bounds);
Rectangle rectQ1 = new Rectangle(off, off, rad2, rad2);
Rectangle rectQ2 = new Rectangle(off + rad2, off, rad2, rad2);
Rectangle rectQ3 = new Rectangle(off, off + rad2, rad2, rad2);
Rectangle rectQ4 = new Rectangle(off + rad2, off + rad2, rad2, rad2);
List<Rectangle> quadrants = new List<Rectangle> { rectQ1, rectQ2, rectQ3, rectQ4 };
e.Graphics.Clear(Color.AntiqueWhite);
e.Graphics.DrawEllipse(Pens.Black, bounds);
foreach (Rectangle rect in quadrants)
{
int count = 0;
do
{
Point p = new Point(rect.X + R.Next(rad2), rect.Y + R.Next(rad2));
if (gp.IsVisible(p))
{
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(p, s1x1));
count++;
}
} while (count < dotsPerQuadrant);
}
}
这是结果。圆点均匀分布在整个圆上,不在中间聚集:
直接代码,无象限;
private void panel2_Paint(object sender, PaintEventArgs e)
{
int dotstoDraw = 666*4;
Random R = new Random();
Size s1x1 = new System.Drawing.Size(2, 2);
int radius = 200;
int off = 20;
Rectangle bounds = new Rectangle(off, off, radius, radius);
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(bounds);
e.Graphics.Clear(Color.AntiqueWhite);
e.Graphics.DrawEllipse(Pens.Black, bounds);
int count = 0;
do
{
Point p = new Point(off + R.Next(radius), off + R.Next(radius));
if (gp.IsVisible(p))
{
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(p, s1x1));
count++;
}
} while (count < dotstoDraw);
}
关于c# - 圆内的随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29060069/