-+-+-+-+-+-+-+-+ START OF PART 262 -+-+-+-+-+-+-+-+ X** \parambegin X** \param`7BPpoint *`7D`7Bvec`7D`7B2D vector`7D`7BIN`7D X** \paramend X** \blurb`7BThis function generates and returns a unit vector from X** the supplied 2D vector`20 X** \pardesc`7Bvec`7D.`7D X*/ X`7B X Pfloat modu; X Ppoint temp; X X modu = ptk_modv(vec); X if (!ptk_equal(modu, 0.0))`20 X `7B X temp = ptk_point(vec->x / modu, vec->y / modu); X return temp; X `7D`20 X else`20 X `7B X temp = ptk_point(0.0, 0.0); X return temp; X `7D X`7D /* ptk_unitv */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint3 ptk_scalev3(C(Ppoint3 *) vec, C(Pfloat) scale) XPreANSI(Ppoint3 *vec) XPreANSI(Pfloat scale) X/* X** \parambegin X** \param`7BPpoint3 *`7D`7Bvec`7D`7B3D vector`7D`7BIN`7D X** \param`7BPfloat`7D`7Bscale`7D`7Bscale factor`7D`7BIN`7D X** \paramend X** \blurb`7BThis function multiplies the 3D vector \pardesc`7Bv`7D X** by the scalar \pardesc`7Bs`7D and X** returns the result.`7D X*/ X`7B X Ppoint3 temp; X X temp = ptk_point3(vec->x * scale, vec->y * scale, vec->z * scale); X return temp; X`7D /* ptk_scalev3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint ptk_scalev(C(Ppoint *) vec, C(Pfloat) scale) XPreANSI(Ppoint *vec) XPreANSI(Pfloat scale) X/* X** \parambegin X** \param`7BPpoint *`7D`7Bvec`7D`7B2D vector`7D`7BIN`7D X** \param`7BPfloat`7D`7Bscale`7D`7Bscale factor`7D`7BIN`7D X** \paramend X** \blurb`7BThis function multiplies the 2D vector X** \pardesc`7Bv`7D by the scalar \pardesc`7Bs`7D and X** returns the result.`7D X*/ X`7B X Ppoint temp; X X temp = ptk_point(vec->x * scale, vec->y * scale); X return temp; X`7D /* ptk_scalev */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint3 ptk_subv3(C(Ppoint3 *) p1, C(Ppoint3 *) p2) XPreANSI(Ppoint3 *p1) XPreANSI(Ppoint3 *p2) X/* X** \parambegin X** \param`7BPpoint3 *`7D`7Bp1`7D`7B3D vector`7D`7BIN`7D X** \param`7BPpoint3 *`7D`7Bp2`7D`7B3D vector`7D`7BIN`7D X** \paramend X** \blurb`7BThis function evaluates the 3D vector \pardesc `7Bv1-v2`7D.`7D X*/ X`7B X Ppoint3 v; X X v = ptk_point3(p1->x - p2->x, p1->y - p2->y, p1->z - p2->z); X return v; X`7D /* ptk_subv3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint ptk_subv(C(Ppoint *) p1, C(Ppoint *) p2) XPreANSI(Ppoint *p1) XPreANSI(Ppoint *p2) X/* X** \parambegin X** \param`7BPpoint *`7D`7Bp1`7D`7B2D vector`7D`7BIN`7D X** \param`7BPpoint *`7D`7Bp2`7D`7B2D vector`7D`7BIN`7D X** \paramend X** \blurb`7BThis function evaluates the 2D vector \pardesc `7Bv1-v2`7D.`7D X*/ X`7B X Ppoint v; X X v = ptk_point(p1->x - p2->x, p1->y - p2->y); X return v; X`7D /* ptk_subv */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint3 ptk_addv3(C(Ppoint3 *) p1, C(Ppoint3 *) p2) XPreANSI(Ppoint3 *p1) XPreANSI(Ppoint3 *p2) X/* X** \parambegin X** \param`7BPpoint3 *`7D`7Bp1`7D`7B3D vector`7D`7BIN`7D X** \param`7BPpoint3 *`7D`7Bp2`7D`7B3D vector`7D`7BIN`7D X** \paramend X** \blurb`7BThis function adds the two 3D vectors \pardesc`7Bv1`7D and \pard Vesc`7Bv2`7D, X** and returns the result.`7D X*/ X`7B X Ppoint3 v; X X v = ptk_point3(p1->x + p2->x, p1->y + p2->y, p1->z + p2->z); X return v; X`7D /* ptk_addv3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern Ppoint ptk_addv(C(Ppoint *) p1, C(Ppoint *) p2) XPreANSI(Ppoint *p1) XPreANSI(Ppoint *p2) X/* X** \parambegin X** \param`7BPpoint *`7D`7Bp1`7D`7B2D vector`7D`7BIN`7D X** \param`7BPpoint *`7D`7Bp2`7D`7B2D vector`7D`7BIN`7D X** \paramend X** \blurb`7BThis function adds the two 2D vectors \pardesc`7Bv1`7D X** and \pardesc`7Bv2`7D, and returns the result.`7D X*/ X`7B X Ppoint v; X X v = ptk_point(p1->x + p2->x, p1->y + p2->y); X return v; X`7D /* ptk_addv */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_unitmatrix(C(Pmatrix) matrix) XPreANSI(Pmatrix matrix) X/* X** \parambegin X** \param`7BPmatrix`7D`7Bmatrix`7D`7B3x3 matrix`7D`7BIN`7D X** \paramend X** \blurb`7BThis procedure creates a unit $3\times 3$ matrix, and stores it V in`20 X** \pardesc`7Bmatrix`7D.`7D X*/ X`7B X /* */ X Pint jj, ii; X X for (ii = 0; ii <= 2; ii++)`20 X `7B X for (jj = 0; jj <= 2; jj++) X matrix`5Bii`5D`5Bjj`5D = 0.0; X matrix`5Bii`5D`5Bii`5D = 1.0; X `7D X`7D /* ptk_unitmatrix */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_unitmatrix3(C(Pmatrix3) matrix) XPreANSI(Pmatrix3 matrix) X/* X** \parambegin X** \param`7BPmatrix3`7D`7Bmatrix`7D`7B4x4 matrix`7D`7BIN`7D X** \paramend X** \blurb`7BThis procedure creates a unit $4\times 4$ matrix, and stores it V in`20 X** \pardesc`7Bmatrix`7D.`7D X*/ X`7B X /* */ X Pint jj, ii; X X for (ii = 0; ii <= 3; ii++)`20 X `7B X for (jj = 0; jj <= 3; jj++) X matrix`5Bii`5D`5Bjj`5D = 0.0; X matrix`5Bii`5D`5Bii`5D = 1.0; X `7D X`7D /* ptk_unitmatrix3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_transposematrix3(C(Pmatrix3) matrix, C(Pmatrix3) result) XPreANSI(Pmatrix3 matrix) XPreANSI(Pmatrix3 result) X/* X** \parambegin X** \param`7BPmatrix3`7D`7Bmatrix`7D`7B4x4 matrix`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bresult`7D`7B4x4 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function transposes \pardesc`7Bmatrix`7D, and returns the r Vesul X** in \pardesc`7Bresult`7D. X** Note that \pardesc`7Brestut`7D can be the same variable X** as \pardesc`7Bmatrix`7D since a copy is made`20 X** first.`7D X*/ X`7B X Pmatrix3 temp; X Pint i, j; X X memcpy(temp, matrix, sizeof(Pmatrix3)); X for (i = 0; i <= 3; i++)`20 X `7B X for (j = 0; j <= 3; j++) X result`5Bi`5D`5Bj`5D = temp`5Bj`5D`5Bi`5D; X `7D X`7D /* ptk_transposematrix3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_transposematrix(C(Pmatrix) matrix, C(Pmatrix) result) XPreANSI(Pmatrix matrix) XPreANSI(Pmatrix result) X/* X** \parambegin X** \param`7BPmatrix`7D`7Bmatrix`7D`7B3x3 matrix`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bresult`7D`7B3x3 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function transposes \pardesc`7Bmatrix`7D, and returns the r Vesul X** in \pardesc`7Bresult`7D. X** Note that \pardesc`7Brestut`7D can be the same variable X** as \pardesc`7Bmatrix`7D since a copy is made`20 X** first.`7D X*/ X`7B X Pmatrix temp; X Pint i, j; X X memcpy(temp, matrix, sizeof(Pmatrix)); X for (i = 0; i <= 2; i++)`20 X `7B X for (j = 0; j <= 2; j++) X result`5Bi`5D`5Bj`5D = temp`5Bj`5D`5Bi`5D; X `7D X`7D /* ptk_transposematrix */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_multiplymatrix3(C(Pmatrix3) matrix1, C(Pmatrix3) matrix2,`20 X C(Pmatrix3) result) XPreANSI(Pmatrix3 matrix1) XPreANSI(Pmatrix3 matrix2) XPreANSI(Pmatrix3 result) X/* X** \parambegin X** \param`7BPmatrix3`7D`7Bmatrix1`7D`7B4x4 matrix`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bmatrix2`7D`7B4x4 matrix`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bresult`7D`7B4x4 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function makes \pardesc`7Bresult`7D the product of X** the $4 \times 4$ matrices \pardesc`7Bmatrix1`7D and X** \pardesc`7Bmatrix2`7D, with `7B\tt result $\leftarrow$ matrix1 * matrix2` V7D. X** Note that \pardesc`7Bresult`7D can also be \pardesc`7Bmatrix1`7D or \pard Vesc`7Bmatrix2`7D X** since a copy is made. X** This function uses Winograd's method, see "Handbook of Algorithms X** and Data Structures", G.H. Gonnet, Addison Wesley. X*/ X`7B X Pint ii, jj; X Pmatrix3 sum; X Pfloat temp; X Pfloat d`5B4`5D, e`5B4`5D; X X for (ii = 0; ii <= 3; ii++)`20 X `7B X d`5Bii`5D = (matrix1`5Bii`5D`5B1`5D * matrix1`5Bii`5D`5B0`5D) +`20 X (matrix1`5Bii`5D`5B3`5D * matrix1`5Bii`5D`5B2`5D); X e`5Bii`5D = (matrix2`5B0`5D`5Bii`5D * matrix2`5B1`5D`5Bii`5D) +`20 X (matrix2`5B2`5D`5Bii`5D * matrix2`5B3`5D`5Bii`5D); X `7D X X for (ii = 0; ii <= 3; ii++)`20 X `7B X for (jj = 0; jj <= 3; jj++)`20 X `7B X temp = (matrix1`5Bii`5D`5B1`5D + matrix2`5B0`5D`5Bjj`5D) *`20 X (matrix1`5Bii`5D`5B0`5D + matrix2`5B1`5D`5Bjj`5D); X temp += (matrix1`5Bii`5D`5B3`5D + matrix2`5B2`5D`5Bjj`5D) *`20 X (matrix1`5Bii`5D`5B2`5D + matrix2`5B3`5D`5Bjj`5D) - d`5Bii`5D V - e`5Bjj`5D; X sum`5Bii`5D`5Bjj`5D = temp; X `7D X `7D X /* copy matrix back in case result is one of the other two */ X memcpy(result, sum, sizeof(Pmatrix3)); X`7D /* ptk_multiplymatrix3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_multiplymatrix(C(Pmatrix) matrix1, C(Pmatrix) matrix2,`20 X C(Pmatrix) result) XPreANSI(Pmatrix matrix1) XPreANSI(Pmatrix matrix2) XPreANSI(Pmatrix result) X/* X** \parambegin X** \param`7BPmatrix`7D`7Bmatrix1`7D`7B3x3 matrix`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bmatrix2`7D`7B3x3 matrix`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bresult`7D`7B3x3 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function makes \pardesc`7Bresult`7D the product of the X** $3 \times 3$ matrices \pardesc`7Bmatrix1`7D and X** \pardesc`7Bmatrix2`7D, with `7B\tt result $\leftarrow$ matrix1 * matrix2` V7D. X** Note that \pardesc`7Bresult`7D can also be \pardesc`7Bmatrix1`7D or \pard Vesc`7Bmatrix2`7D X** since a copy is made.`7D X*/ X`7B X Pint ii, jj, kk; X Pmatrix sum; X Pfloat temp; X Pfloat d`5B3`5D, e`5B3`5D; X X for (ii = 0; ii <= 2; ii++) X for (jj = 0; jj <= 2; jj++) X sum`5Bii`5D`5Bjj`5D = 0.0; X for (ii = 0; ii <= 2; ii++) X for (jj = 0; jj <= 2; jj++) X for (kk = 0; kk <= 2; kk++) X sum`5Bii`5D`5Bjj`5D += (matrix1`5Bii`5D`5Bkk`5D * matrix2`5Bkk`5D`5B Vjj`5D); X X/* for (ii = 0; ii <= 2; ii++)`20 X `7B X d`5Bii`5D = (matrix1`5Bii`5D`5B1`5D * matrix1`5Bii`5D`5B0`5D); X e`5Bii`5D = (matrix2`5B0`5D`5Bii`5D * matrix2`5B1`5D`5Bii`5D);`20 X `7D X for (ii = 0; ii <= 2; ii++)`20 X `7B X for (jj = 0; jj <= 2; jj++)`20 X `7B X temp = (matrix1`5Bii`5D`5B1`5D + matrix2`5B0`5D`5Bjj`5D) *`20 X (matrix1`5Bii`5D`5B0`5D + matrix2`5B1`5D`5Bjj`5D); X temp += (matrix1`5Bii`5D`5B2`5D * matrix2`5B2`5D`5B2`5D) - d`5Bii`5D - V e`5Bjj`5D; X sum`5Bii`5D`5Bjj`5D = temp; X `7D X `7D X*/ X /* copy matrix back in case result is one of the other two */ X memcpy(result, sum, sizeof(Pmatrix)); X`7D /* ptk_multiplymatrix */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_concatenatematrix3(C(Pcomptype) operation,`20 X C(Pmatrix3) matrix1, C(Pmatrix3) matrix2, C(Pmatrix3) result) XPreANSI(Pcomptype operation) XPreANSI(Pmatrix3 matrix1) XPreANSI(Pmatrix3 matrix2) XPreANSI(Pmatrix3 result) X/* X** \parambegin X** \param`7BPcomptype`7D`7Boperation`7D`7Bconcatenation operation`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bmatrix1`7D`7B4x4 matrix`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bmatrix2`7D`7B4x4 matrix`7D`7BIN`7D X** \param`7BPmatrix3`7D`7Bresult`7D`7B4x4 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function concatenates the $4 \times 4$ matrices X** \pardesc`7Bmatrix1`7D and \pardesc`7Bmatrix2`7D X** on the basis of \pardesc`7Boperation`7D. X** The result is stored in \pardesc`7Bresult`7D. X** Note that \pardesc`7Bresult`7D can also be \pardesc`7Bmatrix1`7D or \pard Vesc`7Bmatrix2`7D X** since a copy is made. When \pardesc`7Boperation`7D is`20 X** \pardesc`7Bpreconcatenate`7D, then \pardesc`7Bresult $\leftarrow$ matrix2 V * matrix1`7D. X** When \pardesc`7Boperation`7D is \pardesc`7Bpostconcatenate`7D,`20 X** \pardesc`7Bresult $\leftarrow$ matrix1 * matrix2`7D.`7D X*/ X`7B X switch (operation)`20 X `7B X case PPRECONCATENATE: `20 X ptk_multiplymatrix3(matrix2, matrix1, result); X break; X X case PPOSTCONCATENATE: `20 X ptk_multiplymatrix3(matrix1, matrix2, result); X break; X X case PREPLACE: `20 X memcpy(result, matrix1, sizeof(Pmatrix3)); X break; X `7D X`7D /* ptk_concatenatematrix3 */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ Xextern void ptk_concatenatematrix(C(Pcomptype) operation,`20 X C(Pmatrix) matrix1, C(Pmatrix) matrix2, C(Pmatrix) result) XPreANSI(Pcomptype operation) XPreANSI(Pmatrix matrix1) XPreANSI(Pmatrix matrix2) XPreANSI(Pmatrix result) X/* X** \parambegin X** \param`7BPcomptype`7D`7Boperation`7D`7Bconcatenation operation`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bmatrix1`7D`7B3x3 matrix`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bmatrix2`7D`7B3x3 matrix`7D`7BIN`7D X** \param`7BPmatrix`7D`7Bresult`7D`7B3x3 matrix`7D`7BOUT`7D X** \paramend X** \blurb`7BThis function concatenates X** the $3 \times 3$ matrices \pardesc`7Bmatrix1`7D and \pardesc`7Bmatrix2`7 VD X** on the basis of \pardesc`7Boperation`7D. X** The result is stored in \pardesc`7Bresult`7D. X** Note that \pardesc`7Bresult`7D can also be \pardesc`7Bmatrix1`7D or \pard Vesc`7Bmatrix2`7D X** since a copy is made. When \pardesc`7Boperation`7D is X** \pardesc`7Bpreconcatenate`7D, then \pardesc`7Bresult $\leftarrow$ matrix2 V * matrix1`7D. X** When \pardesc`7Boperation`7D is \pardesc`7Bpostconcatenate`7D,`20 X** \pardesc`7Bresult $\leftarrow$ matrix1 * matrix2`7D.`7D X*/ X`7B X switch (operation)`20 X `7B X case PPRECONCATENATE: `20 X ptk_multiplymatrix(matrix2, matrix1, result); X break; X X case PPOSTCONCATENATE: `20 X ptk_multiplymatrix(matrix1, matrix2, result); X break; X X case PREPLACE: `20 X memcpy(result, matrix1, sizeof(Pmatrix)); X break; X `7D X`7D /* ptk_concatenatematrix */ X X/*-------------------------------------------------------------------------- V*/ X X/*function:external*/ +-+-+-+-+-+-+-+- END OF PART 262 +-+-+-+-+-+-+-+-