public static void ComputeMeanCovariance(IList<Coordinates> pts, out Coordinates mean, out Matrix2 cov) { // for better numerical stability, use a two-pass method where we first compute the mean double sum_x = 0, sum_y = 0; for (int i = 0; i < pts.Count; i++) { sum_x += pts[i].X; sum_y += pts[i].Y; } double avg_x = sum_x/(double)pts.Count; double avg_y = sum_y/(double)pts.Count; // now compute variances and covariances double sum_x2 = 0, sum_y2 = 0, sum_xy = 0; for (int i = 0; i < pts.Count; i++) { double dx = pts[i].X - avg_x; double dy = pts[i].Y - avg_y; sum_x2 += dx*dx; sum_y2 += dy*dy; sum_xy += dx*dy; } double var_x = sum_x2/(double)pts.Count; double var_y = sum_y2/(double)pts.Count; double cov_xy = sum_xy/(double)pts.Count; mean = new Coordinates(avg_x, avg_y); cov = new Matrix2(var_x, cov_xy, cov_xy, var_y); }
public static Matrix4 FromSubmatrix( Matrix2 A, Matrix2 B, Matrix2 C, Matrix2 D) { Matrix4 ret = new Matrix4(); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { ret[i, j] = A[i, j]; ret[i + 2, j] = C[i, j]; ret[i, j + 2] = B[i, j]; ret[i + 2, j + 2] = D[i, j]; } } return(ret); }
public bool Intersect(LineSegment l, out Coordinates pt, out Coordinates K) { Coordinates P = P1 - P0; Coordinates S = l.P1 - l.P0; Matrix2 A = new Matrix2(P.X, -S.X, P.Y, -S.Y); if (Math.Abs(A.Determinant()) < 1e-10) { pt = default(Coordinates); K = default(Coordinates); return false; } K = A.Inverse()*(l.P0 - P0); if (K.X >= 0 && K.X <= 1 && K.Y >= 0 && K.Y <= 1) { pt = P0 + P*K.X; return true; } else { pt = default(Coordinates); return false; } }
public bool Intersect(Line l, out Coordinates pt, out Coordinates K) { Coordinates P = P1 - P0; Coordinates S = l.P1 - l.P0; double cross = S.Cross(P); if (Math.Abs(cross) < 1e-10) { pt = default(Coordinates); K = default(Coordinates); return false; } Matrix2 A = new Matrix2(-S.Y, S.X, -P.Y, P.X); K = A*(l.P0 - P0)/cross; if (K.X >= 0 && K.X <= 1) { pt = P0 + P*K.X; return true; } else { pt = default(Coordinates); return false; } }
public static Matrix4 FromSubmatrix( Matrix2 A, Matrix2 B, Matrix2 C, Matrix2 D) { Matrix4 ret = new Matrix4(); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { ret[i, j] = A[i, j]; ret[i+2, j] = C[i, j]; ret[i, j+2] = B[i, j]; ret[i+2, j+2] = D[i, j]; } } return ret; }