00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 #ifndef VEC_H
00144 #define VEC_H 4
00145 #include <math.h>
00146
00147 namespace sofa
00148 {
00149
00150 namespace helper
00151 {
00152
00153 namespace polygon_cube_intersection
00154 {
00155
00156 #define SET2(to,from) \
00157 ((to)[0] = (from)[0], \
00158 (to)[1] = (from)[1])
00159 #define SETMAT2(to,from) \
00160 (SET2((to)[0], (from)[0]), \
00161 SET2((to)[1], (from)[1]))
00162 #define ROUNDVEC2(to,from) \
00163 ((to)[0] = floor((from)[0]+.5), \
00164 (to)[1] = floor((from)[1]+.5))
00165 #define ROUNDMAT2(to,from) \
00166 (ROUNDVEC2((to)[0], (from)[0]), \
00167 ROUNDVEC2((to)[1], (from)[1]))
00168 #define FILLVEC2(v,s) \
00169 ((v)[0] = (s), \
00170 (v)[1] = (s))
00171 #define FILLMAT2(m,s) \
00172 (FILLVEC2((m)[0], s), \
00173 FILLVEC2((m)[1], s))
00174 #define ZEROVEC2(v) \
00175 ((v)[0] = 0, \
00176 (v)[1] = 0)
00177 #define ISZEROVEC2(v) \
00178 ((v)[0] == 0 && \
00179 (v)[1] == 0)
00180 #define EQVEC2(v,w) \
00181 ((v)[0] == (w)[0] && \
00182 (v)[1] == (w)[1])
00183 #define EQMAT2(m1,m2) \
00184 (EQVEC2((m1)[0], (m2)[0]) && \
00185 EQVEC2((m1)[1], (m2)[1]))
00186 #define ZEROMAT2(m) \
00187 (ZEROVEC2((m)[0]), \
00188 ZEROVEC2((m)[1]))
00189 #define IDENTMAT2(m) \
00190 (ZEROVEC2((m)[0]), (m)[0][0]=1, \
00191 ZEROVEC2((m)[1]), (m)[1][1]=1)
00192 #define TRANSPOSE2(to,from) \
00193 (_SETcol2((to)[0], from, 0), \
00194 _SETcol2((to)[1], from, 1))
00195 #define VPV2(to,v,w) \
00196 ((to)[0] = (v)[0] + (w)[0], \
00197 (to)[1] = (v)[1] + (w)[1])
00198 #define VMV2(to,v,w) \
00199 ((to)[0] = (v)[0] - (w)[0], \
00200 (to)[1] = (v)[1] - (w)[1])
00201 #define MPM2(to,m1,m2) \
00202 (VPV2((to)[0], (m1)[0], (m2)[0]), \
00203 VPV2((to)[1], (m1)[1], (m2)[1]))
00204 #define MMM2(to,m1,m2) \
00205 (VMV2((to)[0], (m1)[0], (m2)[0]), \
00206 VMV2((to)[1], (m1)[1], (m2)[1]))
00207 #define SXV2(to,s,from) \
00208 ((to)[0] = (s) * (from)[0], \
00209 (to)[1] = (s) * (from)[1])
00210 #define SXM2(to,s,from) \
00211 (SXV2((to)[0], s, (from)[0]), \
00212 SXV2((to)[1], s, (from)[1]))
00213 #define MV2(to,from) \
00214 ((to)[0] = -(from)[0], \
00215 (to)[1] = -(from)[1])
00216 #define MM2(to,from) \
00217 (MV2((to)[0], (from)[0]), \
00218 MV2((to)[1], (from)[1]))
00219 #define VXS2(to,from,s) \
00220 ((to)[0] = (from)[0] * (s), \
00221 (to)[1] = (from)[1] * (s))
00222 #define VDS2(to,from,s) \
00223 ((to)[0] = (from)[0] / (s), \
00224 (to)[1] = (from)[1] / (s))
00225 #define MXS2(to,from,s) \
00226 (VXS2((to)[0], (from)[0], s), \
00227 VXS2((to)[1], (from)[1], s))
00228 #define MDS2(to,from,s) \
00229 (VDS2((to)[0], (from)[0], s), \
00230 VDS2((to)[1], (from)[1], s))
00231 #define MXM2(to,m1,m2) \
00232 (VXM2((to)[0], (m1)[0], m2), \
00233 VXM2((to)[1], (m1)[1], m2))
00234 #define VXM2(to,v,m) \
00235 ((to)[0] = _DOTcol2(v, m, 0), \
00236 (to)[1] = _DOTcol2(v, m, 1))
00237 #define MXV2(to,m,v) \
00238 ((to)[0] = DOT2((m)[0], v), \
00239 (to)[1] = DOT2((m)[1], v))
00240 #define LERP2(to,v0,v1,t) \
00241 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00242 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]))
00243 #define TRACE2(m) \
00244 ((m)[0][0] + \
00245 (m)[1][1])
00246 #define DOT2(v,w) \
00247 ((v)[0] * (w)[0] + \
00248 (v)[1] * (w)[1])
00249 #define NORMSQRD2(v) \
00250 ((v)[0] * (v)[0] + \
00251 (v)[1] * (v)[1])
00252 #define DISTSQRD2(v,w) \
00253 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00254 ((v)[1]-(w)[1])*((v)[1]-(w)[1]))
00255 #define _DOTcol2(v,m,j) \
00256 ((v)[0] * (m)[0][j] + \
00257 (v)[1] * (m)[1][j])
00258 #define _SETcol2(v,m,j) \
00259 ((v)[0] = (m)[0][j], \
00260 (v)[1] = (m)[1][j])
00261 #define _MXVcol2(to,m,M,j) \
00262 ((to)[0][j] = _DOTcol2((m)[0],M,j), \
00263 (to)[1][j] = _DOTcol2((m)[1],M,j))
00264 #define _DET2(v0,v1,i0,i1) \
00265 ((v0)[i0]* _DET1(v1,i1) + \
00266 (v0)[i1]*-_DET1(v1,i0))
00267 #define XV2(to,v1) \
00268 ((to)[0] = -_DET1(v1, 1), \
00269 (to)[1] = _DET1(v1, 0))
00270 #define V2XM3(to2,v2,m3) \
00271 ((to2)[0] = _DOTcol2(v2,m3,0) + (m3)[2][0], \
00272 (to2)[1] = _DOTcol2(v2,m3,1) + (m3)[2][1])
00273 #define M3XV2(to2,m3,v2) \
00274 ((to2)[0] = DOT2((m3)[0],v2) + (m3)[0][2], \
00275 (to2)[1] = DOT2((m3)[1],v2) + (m3)[1][2])
00276 #define _DET1(v0,i0) \
00277 ((v0)[i0])
00278 #define VXV2(v0,v1) \
00279 (_DET2(v0,v1,0,1))
00280 #define DET2(m) \
00281 (VXV2((m)[0],(m)[1]))
00282 #define ADJOINT2(to,m) \
00283 ( _ADJOINTcol2(to,0,m,1), \
00284 __ADJOINTcol2(to,1,m,0))
00285 #define _ADJOINTcol2(to,col,m,i1) \
00286 ((to)[0][col] = _DET1(m[i1], 1), \
00287 (to)[1][col] = -_DET1(m[i1], 0))
00288 #define __ADJOINTcol2(to,col,m,i1) \
00289 ((to)[0][col] = -_DET1(m[i1], 1), \
00290 (to)[1][col] = _DET1(m[i1], 0))
00291 #define SET3(to,from) \
00292 ((to)[0] = (from)[0], \
00293 (to)[1] = (from)[1], \
00294 (to)[2] = (from)[2])
00295 #define SETMAT3(to,from) \
00296 (SET3((to)[0], (from)[0]), \
00297 SET3((to)[1], (from)[1]), \
00298 SET3((to)[2], (from)[2]))
00299 #define ROUNDVEC3(to,from) \
00300 ((to)[0] = floor((from)[0]+.5), \
00301 (to)[1] = floor((from)[1]+.5), \
00302 (to)[2] = floor((from)[2]+.5))
00303 #define ROUNDMAT3(to,from) \
00304 (ROUNDVEC3((to)[0], (from)[0]), \
00305 ROUNDVEC3((to)[1], (from)[1]), \
00306 ROUNDVEC3((to)[2], (from)[2]))
00307 #define FILLVEC3(v,s) \
00308 ((v)[0] = (s), \
00309 (v)[1] = (s), \
00310 (v)[2] = (s))
00311 #define FILLMAT3(m,s) \
00312 (FILLVEC3((m)[0], s), \
00313 FILLVEC3((m)[1], s), \
00314 FILLVEC3((m)[2], s))
00315 #define ZEROVEC3(v) \
00316 ((v)[0] = 0, \
00317 (v)[1] = 0, \
00318 (v)[2] = 0)
00319 #define ISZEROVEC3(v) \
00320 ((v)[0] == 0 && \
00321 (v)[1] == 0 && \
00322 (v)[2] == 0)
00323 #define EQVEC3(v,w) \
00324 ((v)[0] == (w)[0] && \
00325 (v)[1] == (w)[1] && \
00326 (v)[2] == (w)[2])
00327 #define EQMAT3(m1,m2) \
00328 (EQVEC3((m1)[0], (m2)[0]) && \
00329 EQVEC3((m1)[1], (m2)[1]) && \
00330 EQVEC3((m1)[2], (m2)[2]))
00331 #define ZEROMAT3(m) \
00332 (ZEROVEC3((m)[0]), \
00333 ZEROVEC3((m)[1]), \
00334 ZEROVEC3((m)[2]))
00335 #define IDENTMAT3(m) \
00336 (ZEROVEC3((m)[0]), (m)[0][0]=1, \
00337 ZEROVEC3((m)[1]), (m)[1][1]=1, \
00338 ZEROVEC3((m)[2]), (m)[2][2]=1)
00339 #define TRANSPOSE3(to,from) \
00340 (_SETcol3((to)[0], from, 0), \
00341 _SETcol3((to)[1], from, 1), \
00342 _SETcol3((to)[2], from, 2))
00343 #define VPV3(to,v,w) \
00344 ((to)[0] = (v)[0] + (w)[0], \
00345 (to)[1] = (v)[1] + (w)[1], \
00346 (to)[2] = (v)[2] + (w)[2])
00347 #define VMV3(to,v,w) \
00348 ((to)[0] = (v)[0] - (w)[0], \
00349 (to)[1] = (v)[1] - (w)[1], \
00350 (to)[2] = (v)[2] - (w)[2])
00351 #define MPM3(to,m1,m2) \
00352 (VPV3((to)[0], (m1)[0], (m2)[0]), \
00353 VPV3((to)[1], (m1)[1], (m2)[1]), \
00354 VPV3((to)[2], (m1)[2], (m2)[2]))
00355 #define MMM3(to,m1,m2) \
00356 (VMV3((to)[0], (m1)[0], (m2)[0]), \
00357 VMV3((to)[1], (m1)[1], (m2)[1]), \
00358 VMV3((to)[2], (m1)[2], (m2)[2]))
00359 #define SXV3(to,s,from) \
00360 ((to)[0] = (s) * (from)[0], \
00361 (to)[1] = (s) * (from)[1], \
00362 (to)[2] = (s) * (from)[2])
00363 #define SXM3(to,s,from) \
00364 (SXV3((to)[0], s, (from)[0]), \
00365 SXV3((to)[1], s, (from)[1]), \
00366 SXV3((to)[2], s, (from)[2]))
00367 #define MV3(to,from) \
00368 ((to)[0] = -(from)[0], \
00369 (to)[1] = -(from)[1], \
00370 (to)[2] = -(from)[2])
00371 #define MM3(to,from) \
00372 (MV3((to)[0], (from)[0]), \
00373 MV3((to)[1], (from)[1]), \
00374 MV3((to)[2], (from)[2]))
00375 #define VXS3(to,from,s) \
00376 ((to)[0] = (from)[0] * (s), \
00377 (to)[1] = (from)[1] * (s), \
00378 (to)[2] = (from)[2] * (s))
00379 #define VDS3(to,from,s) \
00380 ((to)[0] = (from)[0] / (s), \
00381 (to)[1] = (from)[1] / (s), \
00382 (to)[2] = (from)[2] / (s))
00383 #define MXS3(to,from,s) \
00384 (VXS3((to)[0], (from)[0], s), \
00385 VXS3((to)[1], (from)[1], s), \
00386 VXS3((to)[2], (from)[2], s))
00387 #define MDS3(to,from,s) \
00388 (VDS3((to)[0], (from)[0], s), \
00389 VDS3((to)[1], (from)[1], s), \
00390 VDS3((to)[2], (from)[2], s))
00391 #define MXM3(to,m1,m2) \
00392 (VXM3((to)[0], (m1)[0], m2), \
00393 VXM3((to)[1], (m1)[1], m2), \
00394 VXM3((to)[2], (m1)[2], m2))
00395 #define VXM3(to,v,m) \
00396 ((to)[0] = _DOTcol3(v, m, 0), \
00397 (to)[1] = _DOTcol3(v, m, 1), \
00398 (to)[2] = _DOTcol3(v, m, 2))
00399 #define MXV3(to,m,v) \
00400 ((to)[0] = DOT3((m)[0], v), \
00401 (to)[1] = DOT3((m)[1], v), \
00402 (to)[2] = DOT3((m)[2], v))
00403 #define LERP3(to,v0,v1,t) \
00404 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00405 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
00406 (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]))
00407 #define TRACE3(m) \
00408 ((m)[0][0] + \
00409 (m)[1][1] + \
00410 (m)[2][2])
00411 #define DOT3(v,w) \
00412 ((v)[0] * (w)[0] + \
00413 (v)[1] * (w)[1] + \
00414 (v)[2] * (w)[2])
00415 #define NORMSQRD3(v) \
00416 ((v)[0] * (v)[0] + \
00417 (v)[1] * (v)[1] + \
00418 (v)[2] * (v)[2])
00419 #define DISTSQRD3(v,w) \
00420 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00421 ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
00422 ((v)[2]-(w)[2])*((v)[2]-(w)[2]))
00423 #define _DOTcol3(v,m,j) \
00424 ((v)[0] * (m)[0][j] + \
00425 (v)[1] * (m)[1][j] + \
00426 (v)[2] * (m)[2][j])
00427 #define _SETcol3(v,m,j) \
00428 ((v)[0] = (m)[0][j], \
00429 (v)[1] = (m)[1][j], \
00430 (v)[2] = (m)[2][j])
00431 #define _MXVcol3(to,m,M,j) \
00432 ((to)[0][j] = _DOTcol3((m)[0],M,j), \
00433 (to)[1][j] = _DOTcol3((m)[1],M,j), \
00434 (to)[2][j] = _DOTcol3((m)[2],M,j))
00435 #define _DET3(v0,v1,v2,i0,i1,i2) \
00436 ((v0)[i0]* _DET2(v1,v2,i1,i2) + \
00437 (v0)[i1]*-_DET2(v1,v2,i0,i2) + \
00438 (v0)[i2]* _DET2(v1,v2,i0,i1))
00439 #define VXV3(to,v1,v2) \
00440 ((to)[0] = _DET2(v1,v2, 1,2), \
00441 (to)[1] = -_DET2(v1,v2, 0,2), \
00442 (to)[2] = _DET2(v1,v2, 0,1))
00443 #define SET3from2(to,from,pad) \
00444 ((to)[0] = (from)[0], \
00445 (to)[1] = (from)[1], \
00446 (to)[2] = (pad))
00447 #define SETMAT3from2(to,from,pad0,pad1) \
00448 (SET3from2((to)[0], (from)[0], pad0), \
00449 SET3from2((to)[1], (from)[1], pad0), \
00450 FILLVEC2((to)[2], (pad0)), (to)[2][2] = (pad1))
00451 #define M2XM3(to3,m2,m3) \
00452 (_MXVcol2(to3,m2,m3,0), (to3)[2][0]=(m3)[2][0], \
00453 _MXVcol2(to3,m2,m3,1), (to3)[2][1]=(m3)[2][1], \
00454 _MXVcol2(to3,m2,m3,2), (to3)[2][2]=(m3)[2][2])
00455 #define M3XM2(to3,m3,m2) \
00456 (VXM2((to3)[0],(m3)[0],m2), (to3)[0][2]=(m3)[0][2], \
00457 VXM2((to3)[1],(m3)[1],m2), (to3)[1][2]=(m3)[1][2], \
00458 VXM2((to3)[2],(m3)[2],m2), (to3)[2][2]=(m3)[2][2])
00459 #define V3XM4(to3,v3,m4) \
00460 ((to3)[0] = _DOTcol3(v3,m4,0) + (m4)[3][0], \
00461 (to3)[1] = _DOTcol3(v3,m4,1) + (m4)[3][1], \
00462 (to3)[2] = _DOTcol3(v3,m4,2) + (m4)[3][2])
00463 #define M4XV3(to3,m4,v3) \
00464 ((to3)[0] = DOT3((m4)[0],v3) + (m4)[0][3], \
00465 (to3)[1] = DOT3((m4)[1],v3) + (m4)[1][3], \
00466 (to3)[2] = DOT3((m4)[2],v3) + (m4)[2][3])
00467 #define VXVXV3(v0,v1,v2) \
00468 (_DET3(v0,v1,v2,0,1,2))
00469 #define DET3(m) \
00470 (VXVXV3((m)[0],(m)[1],(m)[2]))
00471 #define ADJOINT3(to,m) \
00472 ( _ADJOINTcol3(to,0,m,1,2), \
00473 __ADJOINTcol3(to,1,m,0,2), \
00474 _ADJOINTcol3(to,2,m,0,1))
00475 #define _ADJOINTcol3(to,col,m,i1,i2) \
00476 ((to)[0][col] = _DET2(m[i1],m[i2], 1,2), \
00477 (to)[1][col] = -_DET2(m[i1],m[i2], 0,2), \
00478 (to)[2][col] = _DET2(m[i1],m[i2], 0,1))
00479 #define __ADJOINTcol3(to,col,m,i1,i2) \
00480 ((to)[0][col] = -_DET2(m[i1],m[i2], 1,2), \
00481 (to)[1][col] = _DET2(m[i1],m[i2], 0,2), \
00482 (to)[2][col] = -_DET2(m[i1],m[i2], 0,1))
00483 #define SET4(to,from) \
00484 ((to)[0] = (from)[0], \
00485 (to)[1] = (from)[1], \
00486 (to)[2] = (from)[2], \
00487 (to)[3] = (from)[3])
00488 #define SETMAT4(to,from) \
00489 (SET4((to)[0], (from)[0]), \
00490 SET4((to)[1], (from)[1]), \
00491 SET4((to)[2], (from)[2]), \
00492 SET4((to)[3], (from)[3]))
00493 #define ROUNDVEC4(to,from) \
00494 ((to)[0] = floor((from)[0]+.5), \
00495 (to)[1] = floor((from)[1]+.5), \
00496 (to)[2] = floor((from)[2]+.5), \
00497 (to)[3] = floor((from)[3]+.5))
00498 #define ROUNDMAT4(to,from) \
00499 (ROUNDVEC4((to)[0], (from)[0]), \
00500 ROUNDVEC4((to)[1], (from)[1]), \
00501 ROUNDVEC4((to)[2], (from)[2]), \
00502 ROUNDVEC4((to)[3], (from)[3]))
00503 #define FILLVEC4(v,s) \
00504 ((v)[0] = (s), \
00505 (v)[1] = (s), \
00506 (v)[2] = (s), \
00507 (v)[3] = (s))
00508 #define FILLMAT4(m,s) \
00509 (FILLVEC4((m)[0], s), \
00510 FILLVEC4((m)[1], s), \
00511 FILLVEC4((m)[2], s), \
00512 FILLVEC4((m)[3], s))
00513 #define ZEROVEC4(v) \
00514 ((v)[0] = 0, \
00515 (v)[1] = 0, \
00516 (v)[2] = 0, \
00517 (v)[3] = 0)
00518 #define ISZEROVEC4(v) \
00519 ((v)[0] == 0 && \
00520 (v)[1] == 0 && \
00521 (v)[2] == 0 && \
00522 (v)[3] == 0)
00523 #define EQVEC4(v,w) \
00524 ((v)[0] == (w)[0] && \
00525 (v)[1] == (w)[1] && \
00526 (v)[2] == (w)[2] && \
00527 (v)[3] == (w)[3])
00528 #define EQMAT4(m1,m2) \
00529 (EQVEC4((m1)[0], (m2)[0]) && \
00530 EQVEC4((m1)[1], (m2)[1]) && \
00531 EQVEC4((m1)[2], (m2)[2]) && \
00532 EQVEC4((m1)[3], (m2)[3]))
00533 #define ZEROMAT4(m) \
00534 (ZEROVEC4((m)[0]), \
00535 ZEROVEC4((m)[1]), \
00536 ZEROVEC4((m)[2]), \
00537 ZEROVEC4((m)[3]))
00538 #define IDENTMAT4(m) \
00539 (ZEROVEC4((m)[0]), (m)[0][0]=1, \
00540 ZEROVEC4((m)[1]), (m)[1][1]=1, \
00541 ZEROVEC4((m)[2]), (m)[2][2]=1, \
00542 ZEROVEC4((m)[3]), (m)[3][3]=1)
00543 #define TRANSPOSE4(to,from) \
00544 (_SETcol4((to)[0], from, 0), \
00545 _SETcol4((to)[1], from, 1), \
00546 _SETcol4((to)[2], from, 2), \
00547 _SETcol4((to)[3], from, 3))
00548 #define VPV4(to,v,w) \
00549 ((to)[0] = (v)[0] + (w)[0], \
00550 (to)[1] = (v)[1] + (w)[1], \
00551 (to)[2] = (v)[2] + (w)[2], \
00552 (to)[3] = (v)[3] + (w)[3])
00553 #define VMV4(to,v,w) \
00554 ((to)[0] = (v)[0] - (w)[0], \
00555 (to)[1] = (v)[1] - (w)[1], \
00556 (to)[2] = (v)[2] - (w)[2], \
00557 (to)[3] = (v)[3] - (w)[3])
00558 #define MPM4(to,m1,m2) \
00559 (VPV4((to)[0], (m1)[0], (m2)[0]), \
00560 VPV4((to)[1], (m1)[1], (m2)[1]), \
00561 VPV4((to)[2], (m1)[2], (m2)[2]), \
00562 VPV4((to)[3], (m1)[3], (m2)[3]))
00563 #define MMM4(to,m1,m2) \
00564 (VMV4((to)[0], (m1)[0], (m2)[0]), \
00565 VMV4((to)[1], (m1)[1], (m2)[1]), \
00566 VMV4((to)[2], (m1)[2], (m2)[2]), \
00567 VMV4((to)[3], (m1)[3], (m2)[3]))
00568 #define SXV4(to,s,from) \
00569 ((to)[0] = (s) * (from)[0], \
00570 (to)[1] = (s) * (from)[1], \
00571 (to)[2] = (s) * (from)[2], \
00572 (to)[3] = (s) * (from)[3])
00573 #define SXM4(to,s,from) \
00574 (SXV4((to)[0], s, (from)[0]), \
00575 SXV4((to)[1], s, (from)[1]), \
00576 SXV4((to)[2], s, (from)[2]), \
00577 SXV4((to)[3], s, (from)[3]))
00578 #define MV4(to,from) \
00579 ((to)[0] = -(from)[0], \
00580 (to)[1] = -(from)[1], \
00581 (to)[2] = -(from)[2], \
00582 (to)[3] = -(from)[3])
00583 #define MM4(to,from) \
00584 (MV4((to)[0], (from)[0]), \
00585 MV4((to)[1], (from)[1]), \
00586 MV4((to)[2], (from)[2]), \
00587 MV4((to)[3], (from)[3]))
00588 #define VXS4(to,from,s) \
00589 ((to)[0] = (from)[0] * (s), \
00590 (to)[1] = (from)[1] * (s), \
00591 (to)[2] = (from)[2] * (s), \
00592 (to)[3] = (from)[3] * (s))
00593 #define VDS4(to,from,s) \
00594 ((to)[0] = (from)[0] / (s), \
00595 (to)[1] = (from)[1] / (s), \
00596 (to)[2] = (from)[2] / (s), \
00597 (to)[3] = (from)[3] / (s))
00598 #define MXS4(to,from,s) \
00599 (VXS4((to)[0], (from)[0], s), \
00600 VXS4((to)[1], (from)[1], s), \
00601 VXS4((to)[2], (from)[2], s), \
00602 VXS4((to)[3], (from)[3], s))
00603 #define MDS4(to,from,s) \
00604 (VDS4((to)[0], (from)[0], s), \
00605 VDS4((to)[1], (from)[1], s), \
00606 VDS4((to)[2], (from)[2], s), \
00607 VDS4((to)[3], (from)[3], s))
00608 #define MXM4(to,m1,m2) \
00609 (VXM4((to)[0], (m1)[0], m2), \
00610 VXM4((to)[1], (m1)[1], m2), \
00611 VXM4((to)[2], (m1)[2], m2), \
00612 VXM4((to)[3], (m1)[3], m2))
00613 #define VXM4(to,v,m) \
00614 ((to)[0] = _DOTcol4(v, m, 0), \
00615 (to)[1] = _DOTcol4(v, m, 1), \
00616 (to)[2] = _DOTcol4(v, m, 2), \
00617 (to)[3] = _DOTcol4(v, m, 3))
00618 #define MXV4(to,m,v) \
00619 ((to)[0] = DOT4((m)[0], v), \
00620 (to)[1] = DOT4((m)[1], v), \
00621 (to)[2] = DOT4((m)[2], v), \
00622 (to)[3] = DOT4((m)[3], v))
00623 #define LERP4(to,v0,v1,t) \
00624 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00625 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
00626 (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]), \
00627 (to)[3]=(v0)[3]+(t)*((v1)[3]-(v0)[3]))
00628 #define TRACE4(m) \
00629 ((m)[0][0] + \
00630 (m)[1][1] + \
00631 (m)[2][2] + \
00632 (m)[3][3])
00633 #define DOT4(v,w) \
00634 ((v)[0] * (w)[0] + \
00635 (v)[1] * (w)[1] + \
00636 (v)[2] * (w)[2] + \
00637 (v)[3] * (w)[3])
00638 #define NORMSQRD4(v) \
00639 ((v)[0] * (v)[0] + \
00640 (v)[1] * (v)[1] + \
00641 (v)[2] * (v)[2] + \
00642 (v)[3] * (v)[3])
00643 #define DISTSQRD4(v,w) \
00644 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00645 ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
00646 ((v)[2]-(w)[2])*((v)[2]-(w)[2]) + \
00647 ((v)[3]-(w)[3])*((v)[3]-(w)[3]))
00648 #define _DOTcol4(v,m,j) \
00649 ((v)[0] * (m)[0][j] + \
00650 (v)[1] * (m)[1][j] + \
00651 (v)[2] * (m)[2][j] + \
00652 (v)[3] * (m)[3][j])
00653 #define _SETcol4(v,m,j) \
00654 ((v)[0] = (m)[0][j], \
00655 (v)[1] = (m)[1][j], \
00656 (v)[2] = (m)[2][j], \
00657 (v)[3] = (m)[3][j])
00658 #define _MXVcol4(to,m,M,j) \
00659 ((to)[0][j] = _DOTcol4((m)[0],M,j), \
00660 (to)[1][j] = _DOTcol4((m)[1],M,j), \
00661 (to)[2][j] = _DOTcol4((m)[2],M,j), \
00662 (to)[3][j] = _DOTcol4((m)[3],M,j))
00663 #define _DET4(v0,v1,v2,v3,i0,i1,i2,i3) \
00664 ((v0)[i0]* _DET3(v1,v2,v3,i1,i2,i3) + \
00665 (v0)[i1]*-_DET3(v1,v2,v3,i0,i2,i3) + \
00666 (v0)[i2]* _DET3(v1,v2,v3,i0,i1,i3) + \
00667 (v0)[i3]*-_DET3(v1,v2,v3,i0,i1,i2))
00668 #define VXVXV4(to,v1,v2,v3) \
00669 ((to)[0] = -_DET3(v1,v2,v3, 1,2,3), \
00670 (to)[1] = _DET3(v1,v2,v3, 0,2,3), \
00671 (to)[2] = -_DET3(v1,v2,v3, 0,1,3), \
00672 (to)[3] = _DET3(v1,v2,v3, 0,1,2))
00673 #define SET4from3(to,from,pad) \
00674 ((to)[0] = (from)[0], \
00675 (to)[1] = (from)[1], \
00676 (to)[2] = (from)[2], \
00677 (to)[3] = (pad))
00678 #define SETMAT4from3(to,from,pad0,pad1) \
00679 (SET4from3((to)[0], (from)[0], pad0), \
00680 SET4from3((to)[1], (from)[1], pad0), \
00681 SET4from3((to)[2], (from)[2], pad0), \
00682 FILLVEC3((to)[3], (pad0)), (to)[3][3] = (pad1))
00683 #define M3XM4(to4,m3,m4) \
00684 (_MXVcol3(to4,m3,m4,0), (to4)[3][0]=(m4)[3][0], \
00685 _MXVcol3(to4,m3,m4,1), (to4)[3][1]=(m4)[3][1], \
00686 _MXVcol3(to4,m3,m4,2), (to4)[3][2]=(m4)[3][2], \
00687 _MXVcol3(to4,m3,m4,3), (to4)[3][3]=(m4)[3][3])
00688 #define M4XM3(to4,m4,m3) \
00689 (VXM3((to4)[0],(m4)[0],m3), (to4)[0][3]=(m4)[0][3], \
00690 VXM3((to4)[1],(m4)[1],m3), (to4)[1][3]=(m4)[1][3], \
00691 VXM3((to4)[2],(m4)[2],m3), (to4)[2][3]=(m4)[2][3], \
00692 VXM3((to4)[3],(m4)[3],m3), (to4)[3][3]=(m4)[3][3])
00693 #define VXVXVXV4(v0,v1,v2,v3) \
00694 (_DET4(v0,v1,v2,v3,0,1,2,3))
00695 #define DET4(m) \
00696 (VXVXVXV4((m)[0],(m)[1],(m)[2],(m)[3]))
00697 #define ADJOINT4(to,m) \
00698 ( _ADJOINTcol4(to,0,m,1,2,3), \
00699 __ADJOINTcol4(to,1,m,0,2,3), \
00700 _ADJOINTcol4(to,2,m,0,1,3), \
00701 __ADJOINTcol4(to,3,m,0,1,2))
00702 #define _ADJOINTcol4(to,col,m,i1,i2,i3) \
00703 ((to)[0][col] = _DET3(m[i1],m[i2],m[i3], 1,2,3), \
00704 (to)[1][col] = -_DET3(m[i1],m[i2],m[i3], 0,2,3), \
00705 (to)[2][col] = _DET3(m[i1],m[i2],m[i3], 0,1,3), \
00706 (to)[3][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,2))
00707 #define __ADJOINTcol4(to,col,m,i1,i2,i3) \
00708 ((to)[0][col] = -_DET3(m[i1],m[i2],m[i3], 1,2,3), \
00709 (to)[1][col] = _DET3(m[i1],m[i2],m[i3], 0,2,3), \
00710 (to)[2][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,3), \
00711 (to)[3][col] = _DET3(m[i1],m[i2],m[i3], 0,1,2))
00712 #define TRANSPOSE2safe(type,to,from) \
00713 do {type _vec_h_temp_[2][2]; \
00714 TRANSPOSE2(_vec_h_temp_,from); \
00715 SETMAT2(to, _vec_h_temp_); \
00716 } while (0)
00717 #define TRANSPOSE2d(to,from) TRANSPOSE2safe(double,to,from)
00718 #define TRANSPOSE2i(to,from) TRANSPOSE2safe(int,to,from)
00719 #define TRANSPOSE2l(to,from) TRANSPOSE2safe(long,to,from)
00720 #define TRANSPOSE2r(to,from) TRANSPOSE2safe(real,to,from)
00721 #define MXM2safe(type,to,m1,m2) \
00722 do {type _vec_h_temp_[2][2]; \
00723 MXM2(_vec_h_temp_,m1,m2); \
00724 SETMAT2(to, _vec_h_temp_); \
00725 } while (0)
00726 #define MXM2d(to,m1,m2) MXM2safe(double,to,m1,m2)
00727 #define MXM2i(to,m1,m2) MXM2safe(int,to,m1,m2)
00728 #define MXM2l(to,m1,m2) MXM2safe(long,to,m1,m2)
00729 #define MXM2r(to,m1,m2) MXM2safe(real,to,m1,m2)
00730 #define VXM2safe(type,to,v,m) \
00731 do {type _vec_h_temp_[2]; \
00732 VXM2(_vec_h_temp_,v,m); \
00733 SET2(to, _vec_h_temp_); \
00734 } while (0)
00735 #define VXM2d(to,v,m) VXM2safe(double,to,v,m)
00736 #define VXM2i(to,v,m) VXM2safe(int,to,v,m)
00737 #define VXM2l(to,v,m) VXM2safe(long,to,v,m)
00738 #define VXM2r(to,v,m) VXM2safe(real,to,v,m)
00739 #define MXV2safe(type,to,m,v) \
00740 do {type _vec_h_temp_[2]; \
00741 MXV2(_vec_h_temp_,m,v); \
00742 SET2(to, _vec_h_temp_); \
00743 } while (0)
00744 #define MXV2d(to,m,v) MXV2safe(double,to,m,v)
00745 #define MXV2i(to,m,v) MXV2safe(int,to,m,v)
00746 #define MXV2l(to,m,v) MXV2safe(long,to,m,v)
00747 #define MXV2r(to,m,v) MXV2safe(real,to,m,v)
00748 #define XV2safe(type,to,v1) \
00749 do {type _vec_h_temp_[2]; \
00750 XV2(_vec_h_temp_,v1); \
00751 SET2(to, _vec_h_temp_); \
00752 } while (0)
00753 #define XV2d(to,v1) XV2safe(double,to,v1)
00754 #define XV2i(to,v1) XV2safe(int,to,v1)
00755 #define XV2l(to,v1) XV2safe(long,to,v1)
00756 #define XV2r(to,v1) XV2safe(real,to,v1)
00757 #define V2XM3safe(type,to2,v2,m3) \
00758 do {type _vec_h_temp_[2]; \
00759 V2XM3(_vec_h_temp_,v2,m3); \
00760 SET2(to2, _vec_h_temp_); \
00761 } while (0)
00762 #define V2XM3d(to2,v2,m3) V2XM3safe(double,to2,v2,m3)
00763 #define V2XM3i(to2,v2,m3) V2XM3safe(int,to2,v2,m3)
00764 #define V2XM3l(to2,v2,m3) V2XM3safe(long,to2,v2,m3)
00765 #define V2XM3r(to2,v2,m3) V2XM3safe(real,to2,v2,m3)
00766 #define M3XV2safe(type,to2,m3,v2) \
00767 do {type _vec_h_temp_[2]; \
00768 M3XV2(_vec_h_temp_,m3,v2); \
00769 SET2(to2, _vec_h_temp_); \
00770 } while (0)
00771 #define M3XV2d(to2,m3,v2) M3XV2safe(double,to2,m3,v2)
00772 #define M3XV2i(to2,m3,v2) M3XV2safe(int,to2,m3,v2)
00773 #define M3XV2l(to2,m3,v2) M3XV2safe(long,to2,m3,v2)
00774 #define M3XV2r(to2,m3,v2) M3XV2safe(real,to2,m3,v2)
00775 #define ADJOINT2safe(type,to,m) \
00776 do {type _vec_h_temp_[2][2]; \
00777 ADJOINT2(_vec_h_temp_,m); \
00778 SETMAT2(to, _vec_h_temp_); \
00779 } while (0)
00780 #define ADJOINT2d(to,m) ADJOINT2safe(double,to,m)
00781 #define ADJOINT2i(to,m) ADJOINT2safe(int,to,m)
00782 #define ADJOINT2l(to,m) ADJOINT2safe(long,to,m)
00783 #define ADJOINT2r(to,m) ADJOINT2safe(real,to,m)
00784 #define TRANSPOSE3safe(type,to,from) \
00785 do {type _vec_h_temp_[3][3]; \
00786 TRANSPOSE3(_vec_h_temp_,from); \
00787 SETMAT3(to, _vec_h_temp_); \
00788 } while (0)
00789 #define TRANSPOSE3d(to,from) TRANSPOSE3safe(double,to,from)
00790 #define TRANSPOSE3i(to,from) TRANSPOSE3safe(int,to,from)
00791 #define TRANSPOSE3l(to,from) TRANSPOSE3safe(long,to,from)
00792 #define TRANSPOSE3r(to,from) TRANSPOSE3safe(real,to,from)
00793 #define MXM3safe(type,to,m1,m2) \
00794 do {type _vec_h_temp_[3][3]; \
00795 MXM3(_vec_h_temp_,m1,m2); \
00796 SETMAT3(to, _vec_h_temp_); \
00797 } while (0)
00798 #define MXM3d(to,m1,m2) MXM3safe(double,to,m1,m2)
00799 #define MXM3i(to,m1,m2) MXM3safe(int,to,m1,m2)
00800 #define MXM3l(to,m1,m2) MXM3safe(long,to,m1,m2)
00801 #define MXM3r(to,m1,m2) MXM3safe(real,to,m1,m2)
00802 #define VXM3safe(type,to,v,m) \
00803 do {type _vec_h_temp_[3]; \
00804 VXM3(_vec_h_temp_,v,m); \
00805 SET3(to, _vec_h_temp_); \
00806 } while (0)
00807 #define VXM3d(to,v,m) VXM3safe(double,to,v,m)
00808 #define VXM3i(to,v,m) VXM3safe(int,to,v,m)
00809 #define VXM3l(to,v,m) VXM3safe(long,to,v,m)
00810 #define VXM3r(to,v,m) VXM3safe(real,to,v,m)
00811 #define MXV3safe(type,to,m,v) \
00812 do {type _vec_h_temp_[3]; \
00813 MXV3(_vec_h_temp_,m,v); \
00814 SET3(to, _vec_h_temp_); \
00815 } while (0)
00816 #define MXV3d(to,m,v) MXV3safe(double,to,m,v)
00817 #define MXV3i(to,m,v) MXV3safe(int,to,m,v)
00818 #define MXV3l(to,m,v) MXV3safe(long,to,m,v)
00819 #define MXV3r(to,m,v) MXV3safe(real,to,m,v)
00820 #define VXV3safe(type,to,v1,v2) \
00821 do {type _vec_h_temp_[3]; \
00822 VXV3(_vec_h_temp_,v1,v2); \
00823 SET3(to, _vec_h_temp_); \
00824 } while (0)
00825 #define VXV3d(to,v1,v2) VXV3safe(double,to,v1,v2)
00826 #define VXV3i(to,v1,v2) VXV3safe(int,to,v1,v2)
00827 #define VXV3l(to,v1,v2) VXV3safe(long,to,v1,v2)
00828 #define VXV3r(to,v1,v2) VXV3safe(real,to,v1,v2)
00829 #define M2XM3safe(type,to3,m2,m3) \
00830 do {type _vec_h_temp_[3][3]; \
00831 M2XM3(_vec_h_temp_,m2,m3); \
00832 SETMAT3(to3, _vec_h_temp_); \
00833 } while (0)
00834 #define M2XM3d(to3,m2,m3) M2XM3safe(double,to3,m2,m3)
00835 #define M2XM3i(to3,m2,m3) M2XM3safe(int,to3,m2,m3)
00836 #define M2XM3l(to3,m2,m3) M2XM3safe(long,to3,m2,m3)
00837 #define M2XM3r(to3,m2,m3) M2XM3safe(real,to3,m2,m3)
00838 #define M3XM2safe(type,to3,m3,m2) \
00839 do {type _vec_h_temp_[3][3]; \
00840 M3XM2(_vec_h_temp_,m3,m2); \
00841 SETMAT3(to3, _vec_h_temp_); \
00842 } while (0)
00843 #define M3XM2d(to3,m3,m2) M3XM2safe(double,to3,m3,m2)
00844 #define M3XM2i(to3,m3,m2) M3XM2safe(int,to3,m3,m2)
00845 #define M3XM2l(to3,m3,m2) M3XM2safe(long,to3,m3,m2)
00846 #define M3XM2r(to3,m3,m2) M3XM2safe(real,to3,m3,m2)
00847 #define V3XM4safe(type,to3,v3,m4) \
00848 do {type _vec_h_temp_[3]; \
00849 V3XM4(_vec_h_temp_,v3,m4); \
00850 SET3(to3, _vec_h_temp_); \
00851 } while (0)
00852 #define V3XM4d(to3,v3,m4) V3XM4safe(double,to3,v3,m4)
00853 #define V3XM4i(to3,v3,m4) V3XM4safe(int,to3,v3,m4)
00854 #define V3XM4l(to3,v3,m4) V3XM4safe(long,to3,v3,m4)
00855 #define V3XM4r(to3,v3,m4) V3XM4safe(real,to3,v3,m4)
00856 #define M4XV3safe(type,to3,m4,v3) \
00857 do {type _vec_h_temp_[3]; \
00858 M4XV3(_vec_h_temp_,m4,v3); \
00859 SET3(to3, _vec_h_temp_); \
00860 } while (0)
00861 #define M4XV3d(to3,m4,v3) M4XV3safe(double,to3,m4,v3)
00862 #define M4XV3i(to3,m4,v3) M4XV3safe(int,to3,m4,v3)
00863 #define M4XV3l(to3,m4,v3) M4XV3safe(long,to3,m4,v3)
00864 #define M4XV3r(to3,m4,v3) M4XV3safe(real,to3,m4,v3)
00865 #define ADJOINT3safe(type,to,m) \
00866 do {type _vec_h_temp_[3][3]; \
00867 ADJOINT3(_vec_h_temp_,m); \
00868 SETMAT3(to, _vec_h_temp_); \
00869 } while (0)
00870 #define ADJOINT3d(to,m) ADJOINT3safe(double,to,m)
00871 #define ADJOINT3i(to,m) ADJOINT3safe(int,to,m)
00872 #define ADJOINT3l(to,m) ADJOINT3safe(long,to,m)
00873 #define ADJOINT3r(to,m) ADJOINT3safe(real,to,m)
00874 #define TRANSPOSE4safe(type,to,from) \
00875 do {type _vec_h_temp_[4][4]; \
00876 TRANSPOSE4(_vec_h_temp_,from); \
00877 SETMAT4(to, _vec_h_temp_); \
00878 } while (0)
00879 #define TRANSPOSE4d(to,from) TRANSPOSE4safe(double,to,from)
00880 #define TRANSPOSE4i(to,from) TRANSPOSE4safe(int,to,from)
00881 #define TRANSPOSE4l(to,from) TRANSPOSE4safe(long,to,from)
00882 #define TRANSPOSE4r(to,from) TRANSPOSE4safe(real,to,from)
00883 #define MXM4safe(type,to,m1,m2) \
00884 do {type _vec_h_temp_[4][4]; \
00885 MXM4(_vec_h_temp_,m1,m2); \
00886 SETMAT4(to, _vec_h_temp_); \
00887 } while (0)
00888 #define MXM4d(to,m1,m2) MXM4safe(double,to,m1,m2)
00889 #define MXM4i(to,m1,m2) MXM4safe(int,to,m1,m2)
00890 #define MXM4l(to,m1,m2) MXM4safe(long,to,m1,m2)
00891 #define MXM4r(to,m1,m2) MXM4safe(real,to,m1,m2)
00892 #define VXM4safe(type,to,v,m) \
00893 do {type _vec_h_temp_[4]; \
00894 VXM4(_vec_h_temp_,v,m); \
00895 SET4(to, _vec_h_temp_); \
00896 } while (0)
00897 #define VXM4d(to,v,m) VXM4safe(double,to,v,m)
00898 #define VXM4i(to,v,m) VXM4safe(int,to,v,m)
00899 #define VXM4l(to,v,m) VXM4safe(long,to,v,m)
00900 #define VXM4r(to,v,m) VXM4safe(real,to,v,m)
00901 #define MXV4safe(type,to,m,v) \
00902 do {type _vec_h_temp_[4]; \
00903 MXV4(_vec_h_temp_,m,v); \
00904 SET4(to, _vec_h_temp_); \
00905 } while (0)
00906 #define MXV4d(to,m,v) MXV4safe(double,to,m,v)
00907 #define MXV4i(to,m,v) MXV4safe(int,to,m,v)
00908 #define MXV4l(to,m,v) MXV4safe(long,to,m,v)
00909 #define MXV4r(to,m,v) MXV4safe(real,to,m,v)
00910 #define VXVXV4safe(type,to,v1,v2,v3) \
00911 do {type _vec_h_temp_[4]; \
00912 VXVXV4(_vec_h_temp_,v1,v2,v3); \
00913 SET4(to, _vec_h_temp_); \
00914 } while (0)
00915 #define VXVXV4d(to,v1,v2,v3) VXVXV4safe(double,to,v1,v2,v3)
00916 #define VXVXV4i(to,v1,v2,v3) VXVXV4safe(int,to,v1,v2,v3)
00917 #define VXVXV4l(to,v1,v2,v3) VXVXV4safe(long,to,v1,v2,v3)
00918 #define VXVXV4r(to,v1,v2,v3) VXVXV4safe(real,to,v1,v2,v3)
00919 #define M3XM4safe(type,to4,m3,m4) \
00920 do {type _vec_h_temp_[4][4]; \
00921 M3XM4(_vec_h_temp_,m3,m4); \
00922 SETMAT4(to4, _vec_h_temp_); \
00923 } while (0)
00924 #define M3XM4d(to4,m3,m4) M3XM4safe(double,to4,m3,m4)
00925 #define M3XM4i(to4,m3,m4) M3XM4safe(int,to4,m3,m4)
00926 #define M3XM4l(to4,m3,m4) M3XM4safe(long,to4,m3,m4)
00927 #define M3XM4r(to4,m3,m4) M3XM4safe(real,to4,m3,m4)
00928 #define M4XM3safe(type,to4,m4,m3) \
00929 do {type _vec_h_temp_[4][4]; \
00930 M4XM3(_vec_h_temp_,m4,m3); \
00931 SETMAT4(to4, _vec_h_temp_); \
00932 } while (0)
00933 #define M4XM3d(to4,m4,m3) M4XM3safe(double,to4,m4,m3)
00934 #define M4XM3i(to4,m4,m3) M4XM3safe(int,to4,m4,m3)
00935 #define M4XM3l(to4,m4,m3) M4XM3safe(long,to4,m4,m3)
00936 #define M4XM3r(to4,m4,m3) M4XM3safe(real,to4,m4,m3)
00937 #define ADJOINT4safe(type,to,m) \
00938 do {type _vec_h_temp_[4][4]; \
00939 ADJOINT4(_vec_h_temp_,m); \
00940 SETMAT4(to, _vec_h_temp_); \
00941 } while (0)
00942 #define ADJOINT4d(to,m) ADJOINT4safe(double,to,m)
00943 #define ADJOINT4i(to,m) ADJOINT4safe(int,to,m)
00944 #define ADJOINT4l(to,m) ADJOINT4safe(long,to,m)
00945 #define ADJOINT4r(to,m) ADJOINT4safe(real,to,m)
00946
00947 }
00948 }
00949 }
00950
00951 #endif