| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include "matrix.h"
- int Matrix_Inv_3D(const float P[3][3], float inv[3][3]) {
- /* 计算行列式 */
- float det = P[0][0] * (P[1][1] * P[2][2] - P[2][1] * P[1][2]) -
- P[0][1] * (P[1][0] * P[2][2] - P[1][2] * P[2][0]) +
- P[0][2] * (P[1][0] * P[2][1] - P[1][1] * P[2][0]);
- if (fabs((float)det) < FLT_EPSILON || !isfinite(det)) {
- return -1;
- }
- inv[0][0] = (P[1][1] * P[2][2] - P[2][1] * P[1][2]) / det;
- inv[0][1] = (P[0][2] * P[2][1] - P[0][1] * P[2][2]) / det;
- inv[0][2] = (P[0][1] * P[1][2] - P[0][2] * P[1][1]) / det;
- inv[1][0] = (P[1][2] * P[2][0] - P[1][0] * P[2][2]) / det;
- inv[1][1] = (P[0][0] * P[2][2] - P[0][2] * P[2][0]) / det;
- inv[1][2] = (P[1][0] * P[0][2] - P[0][0] * P[1][2]) / det;
- inv[2][0] = (P[1][0] * P[2][1] - P[2][0] * P[1][1]) / det;
- inv[2][1] = (P[2][0] * P[0][1] - P[0][0] * P[2][1]) / det;
- inv[2][2] = (P[0][0] * P[1][1] - P[1][0] * P[0][1]) / det;
- return 0;
- }
- int Matrix_Brinv(float *a, int n) {
- int *is, *js, i, j, k, l, u, v;
- int temp1[n];
- int temp2[n];
- float d, p;
- is = temp1;
- js = temp2;
- for (k = 0; k <= n - 1; k++) {
- d = 0.0f;
- for (i = k; i <= n - 1; i++) {
- for (j = k; j <= n - 1; j++) {
- l = i * n + j;
- p = fabsf(a[l]);
- if (p > d) {
- d = p;
- is[k] = i;
- js[k] = j;
- }
- }
- }
- if (d + 1.0f == 1.0f) {
- return (0);
- }
- if (is[k] != k) {
- for (j = 0; j <= n - 1; j++) {
- u = k * n + j;
- v = is[k] * n + j;
- p = a[u];
- a[u] = a[v];
- a[v] = p;
- }
- }
- if (js[k] != k) {
- for (i = 0; i <= n - 1; i++) {
- u = i * n + k;
- v = i * n + js[k];
- p = a[u];
- a[u] = a[v];
- a[v] = p;
- }
- }
- l = k * n + k;
- a[l] = 1.0f / a[l];
- for (j = 0; j <= n - 1; j++) {
- if (j != k) {
- u = k * n + j;
- a[u] = a[u] * a[l];
- }
- }
- for (i = 0; i <= n - 1; i++) {
- if (i != k) {
- for (j = 0; j <= n - 1; j++)
- if (j != k) {
- u = i * n + j;
- a[u] = a[u] - a[i * n + k] * a[k * n + j];
- }
- }
- }
- for (i = 0; i <= n - 1; i++) {
- if (i != k) {
- u = i * n + k;
- a[u] = -a[u] * a[l];
- }
- }
- }
- for (k = n - 1; k >= 0; k--) {
- if (js[k] != k) {
- for (j = 0; j <= n - 1; j++) {
- u = k * n + j;
- v = js[k] * n + j;
- p = a[u];
- a[u] = a[v];
- a[v] = p;
- }
- }
- if (is[k] != k) {
- for (i = 0; i <= n - 1; i++) {
- u = i * n + k;
- v = i * n + is[k];
- p = a[u];
- a[u] = a[v];
- a[v] = p;
- }
- }
- }
- return (1);
- }
|