点集的圆拟合质量评估(支持Java/Kotlin/JS/C等语言)
二维点集拟合圆的质量量化方案
核心量化指标(非矩阵版)
以下是几个无需复杂数学知识就能理解和实现的拟合质量评估指标:
平均距离误差
计算每个点到拟合圆圆心的距离与圆半径的偏差绝对值,再取平均值。数值越小,说明点集整体贴合拟合圆的程度越高。
步骤:- 对每个点(x,y),计算到圆心(cx, cy)的距离
d = √[(x - cx)² + (y - cy)²] - 计算该点的偏差绝对值
|d - r|(r为拟合圆半径) - 将所有偏差绝对值求和后除以点的总数,得到平均误差
- 对每个点(x,y),计算到圆心(cx, cy)的距离
最大距离误差
找出所有点偏差绝对值中的最大值。这个值能反映拟合圆对离群点的适配情况,数值越小说明点集与拟合圆的贴合度越均匀。均方根误差(RMSE)
先将每个点的偏差平方后求和,除以点的总数再开平方。该指标会放大较大偏差的权重,更关注离群点对拟合效果的影响,数值越小拟合质量越好。
多语言实现示例
JavaScript
// 输入:拟合结果{cx, cy, r},点集points = [{x,y}, ...] function calculateCircleFitQuality(cx, cy, r, points) { let sumAbsError = 0; let sumSquaredError = 0; let maxError = 0; for (const point of points) { const dx = point.x - cx; const dy = point.y - cy; const distance = Math.sqrt(dx*dx + dy*dy); const error = Math.abs(distance - r); sumAbsError += error; sumSquaredError += error * error; if (error > maxError) maxError = error; } const avgError = sumAbsError / points.length; const rmse = Math.sqrt(sumSquaredError / points.length); return { avgError, maxError, rmse }; }
C++
#include <vector> #include <cmath> #include <algorithm> struct Point { double x, y; }; struct FitQuality { double avgError, maxError, rmse; }; FitQuality calculateCircleFitQuality(double cx, double cy, double r, const std::vector<Point>& points) { double sumAbsError = 0.0; double sumSquaredError = 0.0; double maxError = 0.0; for (const auto& point : points) { double dx = point.x - cx; double dy = point.y - cy; double distance = sqrt(dx*dx + dy*dy); double error = fabs(distance - r); sumAbsError += error; sumSquaredError += error * error; if (error > maxError) maxError = error; } int n = points.size(); FitQuality quality; quality.avgError = sumAbsError / n; quality.rmse = sqrt(sumSquaredError / n); quality.maxError = maxError; return quality; }
Kotlin
data class Point(val x: Double, val y: Double) data class FitQuality(val avgError: Double, val maxError: Double, val rmse: Double) fun calculateCircleFitQuality(cx: Double, cy: Double, r: Double, points: List<Point>): FitQuality { var sumAbsError = 0.0 var sumSquaredError = 0.0 var maxError = 0.0 points.forEach { point -> val dx = point.x - cx val dy = point.y - cy val distance = kotlin.math.sqrt(dx*dx + dy*dy) val error = kotlin.math.abs(distance - r) sumAbsError += error sumSquaredError += error * error if (error > maxError) maxError = error } val n = points.size val avgError = sumAbsError / n val rmse = kotlin.math.sqrt(sumSquaredError / n) return FitQuality(avgError, maxError, rmse) }
算法来源说明
这些量化指标属于几何拟合误差的基础统计度量,是工程领域评估曲线拟合质量的通用方法,广泛应用于计算机视觉、测绘、机械检测等场景,核心逻辑通过点到拟合圆的距离偏差衡量贴合程度,无需依赖复杂矩阵运算。
内容的提问来源于stack exchange,提问作者DrPhill
相关产品推荐
相关产品推荐

