Java 确定圆的最佳方法是什么;s(或椭圆形)的位置和半径,以便能够最适合我给出的所有点

Java 确定圆的最佳方法是什么;s(或椭圆形)的位置和半径,以便能够最适合我给出的所有点,java,algorithm,math,geometry,Java,Algorithm,Math,Geometry,我有很多观点。找到包含所有给定点的最小半径圆的中心和半径的最佳方法是什么 我猜在找到合适的中心后,半径将等于较远点的距离,但我如何才能找到中心 任何算法/伪代码都非常有用 只要把每个点向量的每个分量的平均值作为你的中心,那么到你的中心的向量是(所有点的平均值x,所有点的平均值y),然后,如你所说,将周长设置为穿过最远的点。提供了这样一种算法。看,但这是在C++中。如果您在java中需要它,您可以使用例如来编写一个简单的包装器。Ty对于答案,我是这样做的 float minX = Float.MA

我有很多观点。找到包含所有给定点的最小半径圆的中心和半径的最佳方法是什么

我猜在找到合适的中心后,半径将等于较远点的距离,但我如何才能找到中心


任何算法/伪代码都非常有用

只要把每个点向量的每个分量的平均值作为你的中心,那么到你的中心的向量是(所有点的平均值x,所有点的平均值y),然后,如你所说,将周长设置为穿过最远的点。

提供了这样一种算法。看,但这是在C++中。如果您在java中需要它,您可以使用例如来编写一个简单的包装器。

Ty对于答案,我是这样做的

float minX = Float.MAX_VALUE;
            float maxX = Float.MIN_VALUE;
            float minY = Float.MAX_VALUE;
            float maxY = Float.MIN_VALUE;

            for (int i = 0; i < item.slaves.size(); i++) {
                OverlayItemExtended slaveItem = item.slaves.get(i);
                GeoPoint slavePoint = slaveItem.getPoint();
                Point slavePtScreenCoord = new Point();

                mapView.getProjection()
                    .toPixels(slavePoint, slavePtScreenCoord);

                float x = slavePtScreenCoord.x;
                float y = slavePtScreenCoord.y;

                maxX = Math.max(x, maxX);
                minX = Math.min(x, minX);
                maxY = Math.max(y, maxY);
                minY = Math.min(y, minY);

            }
            float centerX = (maxX + minX) / 2;
            float centerY = (maxY + minY) / 2;
            double distance = findDistance(minX, minY, maxX, maxY);         
            Paint linePaint = new Paint();
            linePaint.setColor(android.graphics.Color.RED);
            linePaint.setStyle(Paint.Style.FILL);
            linePaint.setAlpha(35);

            canvas.drawCircle(centerX, centerY, (float) (distance / 2) + 10,
                    linePaint);
}
float minX=float.MAX_值;
float maxX=float.MIN_值;
float minY=float.MAX_值;
浮点最大值=浮点最小值;
对于(int i=0;i
您可以将问题简化为查找点云的“最宽”轴。这将是最小圆的直径。任何较小的圆都不可能包含定义此直径的极值点

实现这一点的低效算法首先是在0到45度的角度ɵ上循环。对于每个角度ɵ,通过将坐标系旋转ɵ来变换每个点的坐标。然后只需找到
max(x)-min(x)
max(y)-min(y)
即可找到此旋转的最大范围。继续查找所有旋转的最大范围

下面是一个实现此简单算法的C程序,返回最小直径的长度:

要使此代码适应您的特定问题,请在末尾添加此代码:

 /* parameters of smallest circle enclosing the points */
 double center_x = (x[max_i]+x[min_i])/2;
 double center_y = (y[max_i]+y[min_i])/2;
 double radius = sqrt( (x[max_i]-x[min_i])*(x[max_i]-x[min_i]) +
                       (y[max_i]-y[min_i])*(y[max_i]-y[min_i])))/2;

毫无疑问是一种更有效的方法(例如:首先找到凸壳,然后只考虑那些定义船体的点),但是如果点的数目不是天文数字的话,这就足够了。< / P >不确定这是否可行,但是如果你能把问题转化成一组线性方程组,然后,您可以使用标准的最小二乘回归算法。您的标题和文本似乎不太清楚您是希望圆包围所有的点,还是希望所有的点都位于圆周上-您能澄清一下吗?另请参见。@Aesin我的X点不一定位于圆的“边缘”。所以我只想让圆覆盖所有的点,但是距离最远的点在圆的“边缘”(最小圆)上:确定距离最远的物体怎么样?当我计算出中心时,有没有办法知道这一点?我不想在找到中心后,再绕到所有的点,以找到距离最远的点。我认为这行不通。请允许我介绍一个反例。设X1=(0,-1),X2=(0,1),x3=(0.1,sqrt(0.99))。那么平均值将是(0,sqrt(0.99)/3)或大约(0,0.331662479)。半径必须为1+sqrt(0.99),以包括X1-最远点。然而,一个以(0,0)为中心半径为1的圆将包含所有点。你说得很对,这不是一个好的算法-对不起,我应该仔细考虑一下。@trashgood给主要问题的链接给出了一个很好的算法,这里有更多的讨论和一些伪代码:我不理解这个算法。据我所知,maxX、maxY、minx和minY与for循环中的I没有关系。因此,centerX和centerY与输入点无关。因此,无论输入点是什么,代码都会生成相同的圆,除非我遗漏了什么。@emory你是对的。刚刚发布了正确的代码slavePtScreenCoordXY,它来自于一些点的投影图(在for循环中),我认为这是错误的。设X1=(-1,0);X2=(0,1);X3=(1,0)。显然,单位圆(以(0,0)为中心,半径为1)将覆盖这些圆。但这种方法会产生一个以(0,0.5)为中心的圆。这样的圆需要至少sqrt(1.25)的半径才能覆盖X1、X2和X3。我的建议是使用垃圾神建议的算法。