base_matrix.c.svn-base
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 184 行
SVN-BASE
184 行
#include "fitz-base.h"void fz_invert3x3(float *dst, float *m){ float det; int i;#define M3(m,i,j) (m)[3*i+j]#define D2(a,b,c,d) (a * d - b * c)#define D3(a1,a2,a3,b1,b2,b3,c1,c2,c3) \ (a1 * D2(b2,b3,c2,c3)) - \ (b1 * D2(a2,a3,c2,c3)) + \ (c1 * D2(a2,a3,b2,b3)) det = D3(M3(m,0,0), M3(m,1,0), M3(m,2,0), M3(m,0,1), M3(m,1,1), M3(m,2,1), M3(m,0,2), M3(m,1,2), M3(m,2,2)); if (det == 0) det = 1.0; det = 1.0 / det; M3(dst,0,0) = M3(m,1,1) * M3(m,2,2) - M3(m,1,2) * M3(m,2,1); M3(dst,0,1) = -M3(m,0,1) * M3(m,2,2) + M3(m,0,2) * M3(m,2,1); M3(dst,0,2) = M3(m,0,1) * M3(m,1,2) - M3(m,0,2) * M3(m,1,1); M3(dst,1,0) = -M3(m,1,0) * M3(m,2,2) + M3(m,1,2) * M3(m,2,0); M3(dst,1,1) = M3(m,0,0) * M3(m,2,2) - M3(m,0,2) * M3(m,2,0); M3(dst,1,2) = -M3(m,0,0) * M3(m,1,2) + M3(m,0,2) * M3(m,1,0); M3(dst,2,0) = M3(m,1,0) * M3(m,2,1) - M3(m,1,1) * M3(m,2,0); M3(dst,2,1) = -M3(m,0,0) * M3(m,2,1) + M3(m,0,1) * M3(m,2,0); M3(dst,2,2) = M3(m,0,0) * M3(m,1,1) - M3(m,0,1) * M3(m,1,0); for (i = 0; i < 9; i++) dst[i] *= det;}fz_matrixfz_concat(fz_matrix one, fz_matrix two){ fz_matrix dst; dst.a = one.a * two.a + one.b * two.c; dst.b = one.a * two.b + one.b * two.d; dst.c = one.c * two.a + one.d * two.c; dst.d = one.c * two.b + one.d * two.d; dst.e = one.e * two.a + one.f * two.c + two.e; dst.f = one.e * two.b + one.f * two.d + two.f; return dst;}fz_matrixfz_identity(void){ fz_matrix m; m.a = 1; m.b = 0; m.c = 0; m.d = 1; m.e = 0; m.f = 0; return m;}fz_matrixfz_scale(float sx, float sy){ fz_matrix m; m.a = sx; m.b = 0; m.c = 0; m.d = sy; m.e = 0; m.f = 0; return m;}fz_matrixfz_rotate(float theta){ fz_matrix m; float s; float c; while (theta < 0.0f) theta += 360.0f; while (theta >= 360.0f) theta -= 360.0f; if (fabs(0.0f - theta) < FLT_EPSILON) { s = 0.0f; c = 1.0f; } else if (fabs(90.0f - theta) < FLT_EPSILON) { s = 1.0f; c = 0.0f; } else if (fabs(180.0f - theta) < FLT_EPSILON) { s = 0.0f; c = -1.0f; } else if (fabs(270.0f - theta) < FLT_EPSILON) { s = -1.0f; c = 0.0f; } else { s = sin(theta * M_PI / 180.0); c = cos(theta * M_PI / 180.0); } m.a = c; m.b = s; m.c = -s; m.d = c; m.e = 0; m.f = 0; return m;}fz_matrixfz_translate(float tx, float ty){ fz_matrix m; m.a = 1; m.b = 0; m.c = 0; m.d = 1; m.e = tx; m.f = ty; return m;}fz_matrixfz_invertmatrix(fz_matrix src){ fz_matrix dst; float rdet = 1.0 / (src.a * src.d - src.b * src.c); dst.a = src.d * rdet; dst.b = -src.b * rdet; dst.c = -src.c * rdet; dst.d = src.a * rdet; dst.e = -src.e * dst.a - src.f * dst.c; dst.f = -src.e * dst.b - src.f * dst.d; return dst;}intfz_isrectilinear(fz_matrix m){ return (fabs(m.b) < FLT_EPSILON && fabs(m.c) < FLT_EPSILON) || (fabs(m.a) < FLT_EPSILON && fabs(m.d) < FLT_EPSILON);}floatfz_matrixexpansion(fz_matrix m){ return sqrt(fabs(m.a * m.d - m.b * m.c));}fz_pointfz_transformpoint(fz_matrix m, fz_point p){ fz_point t; t.x = p.x * m.a + p.y * m.c + m.e; t.y = p.x * m.b + p.y * m.d + m.f; return t;}fz_rectfz_transformaabb(fz_matrix m, fz_rect r){ fz_point s, t, u, v; if (fz_isinfiniterect(r)) return r; s.x = r.x0; s.y = r.y0; t.x = r.x0; t.y = r.y1; u.x = r.x1; u.y = r.y1; v.x = r.x1; v.y = r.y0; s = fz_transformpoint(m, s); t = fz_transformpoint(m, t); u = fz_transformpoint(m, u); v = fz_transformpoint(m, v); r.x0 = MIN4(s.x, t.x, u.x, v.x); r.y0 = MIN4(s.y, t.y, u.y, v.y); r.x1 = MAX4(s.x, t.x, u.x, v.x); r.y1 = MAX4(s.y, t.y, u.y, v.y); return r;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?