public static Box2 GaussPointsFit2(IList <Vector2> points) { Box2 result = new Box2(Vector2ex.Zero, Vector2ex.UnitX, Vector2ex.UnitY, Vector2ex.One); int count = points.Count; result.Center = points[0]; for (int i = 1; i < count; i++) { result.Center += points[i]; } float num = 1f / (float)count; result.Center *= num; float num2 = 0f; float num3 = 0f; float num4 = 0f; for (int j = 0; j < count; j++) { Vector2 vector = points[j] - result.Center; num2 += vector.x * vector.x; num3 += vector.x * vector.y; num4 += vector.y * vector.y; } num2 *= num; num3 *= num; num4 *= num; float[,] array = new float[2, 2]; array[0, 0] = num2; array[0, 1] = num3; array[1, 0] = num3; array[1, 1] = num4; float[,] symmetricSquareMatrix = array; EigenData eigenData = EigenDecomposition.Solve(symmetricSquareMatrix, true); result.Extents.x = eigenData.GetEigenvalue(0); result.Extents.y = eigenData.GetEigenvalue(1); result.Axis0 = eigenData.GetEigenvector2(0); result.Axis1 = eigenData.GetEigenvector2(1); return(result); }
public static Line2 LeastSquaresLineFit2(IList <Vector2> points) { Line2 result = default(Line2); int count = points.Count; result.Center = points[0]; for (int i = 1; i < count; i++) { result.Center += points[i]; } float num = 1f / (float)count; result.Center *= num; float num2 = 0f; float num3 = 0f; float num4 = 0f; for (int i = 0; i < count; i++) { Vector2 vector = points[i] - result.Center; num2 += vector.x * vector.x; num3 += vector.x * vector.y; num4 += vector.y * vector.y; } num2 *= num; num3 *= num; num4 *= num; float[,] array = new float[2, 2]; array[0, 0] = num4; array[0, 1] = -num3; array[1, 0] = num3; array[1, 1] = num2; float[,] symmetricSquareMatrix = array; EigenData eigenData = EigenDecomposition.Solve(symmetricSquareMatrix, false); result.Direction = eigenData.GetEigenvector2(1); return(result); }