我正在开发一个小程序,并使用此代码生成coordenates:
public double[] GenerateNewCircle(int maxSize, int numberOfBalls, double centerx, double centery)
{
double[] position = null;
double angle = 360 / 6;
double angleRad = DegreeToRadian(incrementAngle);
position = CalculatePosition(radiusX, radiusY, centerx, centery, angleRad);
return position;
}
public double[] CalculatePosition(double radiusX, double radiusY, double centerX, double centerY, double angle)
{
double[] position = new double[2];
position[0] = Math.Cos(angle) * (radiusX + centerX)*1.5;
position[1] = Math.Sin(angle) * (radiusY + centerY)*1.5;
return position;
}
检查是否重叠或者是否在我使用过的区域
bool circleIsAllowed(List<Circle> circles, Circle newCircle)
{
if (newCircle.x < 10 || newCircle.x > pictureBox1.Width)
return false;
if (newCircle.y < 9 || newCircle.y > pictureBox1.Height)
return false;
foreach (Circle it in circles)
{
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;
}
return true; // no existing circle overlaps
}
我现在有两个问题 第一个是:它阻止因为它还试图在它周围生成一个圆圈,当它是一个空间时。 另一个是我如何增加圆圈之间的距离?他们太近了。
这个圆圈是围绕一个圆圈(围绕它)绘制的
这是图片:http://img685.imageshack.us/img685/4955/printpb.png
整个代码: - &gt; http://codepaste.net/gvoeif
项目 - &gt; http://www.megaupload.com/?d=0DY4DU4M
答案 0 :(得分:1)
第二个代码块有错误。试试这个:
double aX = Math.Pow(it.x - newCircle.x, 2);
double aY = Math.Pow(it.y - newCircle.y, 2);
double distance = Math.Pow(aX + aY, 0.5); // distance between circles centers
double ra1 = it.r / 2;
double ra2 = it.r / 2;
// is it.r diameter? if so, then ok, else div by 2 is useless
double circlesDistance = 10; // distance between circles (not centers)
if (distance < ra1 + ra2 + circlesDistance)
{
return false;
}
答案 1 :(得分:1)
要计算两个圆心之间的距离,您应该应用Pythagorean Theorem:
a 2 + b 2 = c 2 。
如果我们有圆圈(使用椭圆,你必须沿着它们的中心之间的连接计算它们的半径,这将涉及一些窦和余弦计算),这是完美的。
double aX = Math.Pow(it.x - newCircle.x, 2);
double aY = Math.Pow(it.y - newCircle.y, 2);
if ((aX + aY) <= Math.Pow(it.r + newCircle.r, 2)) {
return false;
}