C# 代码块,因为当一个空格靠近它时,它也试图在它周围生成一个圆

C# 代码块,因为当一个空格靠近它时,它也试图在它周围生成一个圆,c#,.net,math,geometry,C#,.net,Math,Geometry,我正在开发一个小程序,为了生成坐标,我使用以下代码: public double[] GenerateNewCircle(int maxSize, int numberOfBalls, double centerx, double centery) { double[] position = null; double angle = 360 / 6; double angleRad = DegreeToR

我正在开发一个小程序,为了生成坐标,我使用以下代码:

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
        }
bool circleIsAllowed(列出圆、圆、新圆)
{
if(newCircle.x<10 | | newCircle.x>pictureBox1.Width)
返回false;
if(newCircle.y<9 | | newCircle.y>pictureBox1.Height)
返回false;
foreach(在圆圈中圈出)
{
double aX=Math.Pow(it.x-newCircle.x,2);
double aY=Math.Pow(it.y-newCircle.y,2);
双Dif=数学绝对值(aX-aY);
双ra1=it.r/2;
双ra2=it.r/2;
双半径=数学功率(ra1+ra2,2);
if((raDif+1)>Dif)返回false;
}
返回true;//没有现有的圆重叠
}
我现在有两个问题

  • 它之所以会阻塞,是因为当一个空间靠近它时,它也试图围绕它生成一个圆

  • 如何增加圆圈之间的距离?他们太近了

  • 这个圆是围绕一个圆(围绕它)画的

    这是图像:


    第二个代码块中有错误。试试这个:

    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;
    }
    
    double aX=Math.Pow(it.x-newCircle.x,2);
    double aY=Math.Pow(it.y-newCircle.y,2);
    双倍距离=数学功率(aX+aY,0.5);//圆心间距
    双ra1=it.r/2;
    双ra2=it.r/2;
    //是r直径吗?如果是这样的话,那么ok,否则除以2就没用了
    双圈距离=10;//圆之间的距离(非中心)
    if(距离
    要计算两个圆心之间的距离,应应用:

    a2+b2=c2

    如果我们有圆的话,这是非常有效的(对于椭圆,你必须沿着它们中心之间的连接计算它们的半径,这将涉及一些窦和余弦的计算)

    double aX=Math.Pow(it.x-newCircle.x,2);
    double aY=Math.Pow(it.y-newCircle.y,2);
    
    如果((aX+aY)稍微偏离主题,但是如果您的函数返回一个“点”而不是一个double[],那么API将更容易理解。也许GenerateNewCircle最好被称为类似CalculateCircleCenter的名称。为什么GenerateNewCircle函数有一个numberOfBalls参数(它没有被使用).用同样的方法,使用局部变量radiusX和radiousY,这两个变量都不存在!最好包括它现在的功能(告诉我们有什么问题),以及您试图实现的目标。在多次阅读您的问题后,我不清楚。这是来自测试和测试,我忘记删除这些变量:P…我不返回一个点,因为此项目的主要目标只是获得协调,所以为什么返回tin double[]只需添加一个程序的图像。在中间,这些球太近了,我想让它们之间的距离稍微长一点。一个圆怎么可以有不同的X和Y半径?嗨,现在更好了,tks,但例如,如果我点击右极限附近,或者如果我将圆距离设置为40,它会“爆炸”,并说一个数字太小或太大:S。什么时候有一些区域可以画。有什么问题吗?请更清楚地解释你的问题。“爆炸”发生在哪里?太小或太大的项目的数量?我将添加myu项目,以便你能更好地看到它。tks againhi lucero,只是尝试和碰巧与DotNET忍者一样:S,不能生成超过6个球,然后说这个数字太小ll或big(coordenate的数字)@Luis,你的这个问题与这段代码无关。我发布它是因为这是一种准确检查两个圆相交的简洁快速的方法。如果你想在两个圆之间有一个最小的距离,只需将它添加到
    it.r+newCircle.r
    表达式中即可。
    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;
    }