AffineTransform.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /* AffineTransform.cpp
  2. *
  3. * Copyright (C) 1993-2018 David Weenink
  4. *
  5. * This code is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * This code is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this work. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /*
  19. djmw 2001
  20. djmw 20020315 GPL header
  21. djmw 20041027 Added AffineTransform_extractMatrix
  22. djmw 20050726 Added AffineTransform_extractTranslationVector
  23. djmw 20071012 Added: o_CAN_WRITE_AS_ENCODING.h
  24. djmw 20110304 Thing_new
  25. */
  26. #include "AffineTransform.h"
  27. #include "NUM2.h"
  28. #include "oo_DESTROY.h"
  29. #include "AffineTransform_def.h"
  30. #include "oo_COPY.h"
  31. #include "AffineTransform_def.h"
  32. #include "oo_EQUAL.h"
  33. #include "AffineTransform_def.h"
  34. #include "oo_CAN_WRITE_AS_ENCODING.h"
  35. #include "AffineTransform_def.h"
  36. #include "oo_WRITE_TEXT.h"
  37. #include "AffineTransform_def.h"
  38. #include "oo_WRITE_BINARY.h"
  39. #include "AffineTransform_def.h"
  40. #include "oo_READ_TEXT.h"
  41. #include "AffineTransform_def.h"
  42. #include "oo_READ_BINARY.h"
  43. #include "AffineTransform_def.h"
  44. #include "oo_DESCRIPTION.h"
  45. #include "AffineTransform_def.h"
  46. void structAffineTransform :: v_transform (double **in, integer nrows, double **out) {
  47. for (integer i = 1; i <= nrows; i ++) {
  48. for (integer j = 1; j <= dimension; j ++) {
  49. longdouble tmp = 0.0;
  50. for (integer k = 1; k <= dimension; k ++) {
  51. tmp += in [i] [k] * r [k] [j];
  52. }
  53. out [i] [j] = tmp + t [j];
  54. }
  55. }
  56. }
  57. autoAffineTransform structAffineTransform :: v_invert () {
  58. autoAffineTransform thee = Data_copy (this);
  59. double tolerance = 0.000001;
  60. NUMpseudoInverse (r.at, dimension, dimension, thy r.at, tolerance);
  61. for (integer i = 1; i <= dimension; i ++) {
  62. thy t [i] = 0.0;
  63. for (integer j = 1; j <= thy dimension; j ++) {
  64. thy t [i] -= thy r [i] [j] * t [j];
  65. }
  66. }
  67. return thee;
  68. }
  69. Thing_implement (AffineTransform, Daata, 0);
  70. void AffineTransform_init (AffineTransform me, integer dimension) {
  71. Melder_require (dimension > 0, U"Dimensionality should be greater than zero.");
  72. my dimension = dimension;
  73. my r = MATzero (dimension, dimension);
  74. my t = VECzero (dimension);
  75. }
  76. autoAffineTransform AffineTransform_create (integer dimension) {
  77. try {
  78. autoAffineTransform me = Thing_new (AffineTransform);
  79. AffineTransform_init (me.get(), dimension);
  80. return me;
  81. } catch (MelderError) {
  82. Melder_throw (U"AffineTransform not created.");
  83. }
  84. }
  85. autoAffineTransform AffineTransform_invert (AffineTransform me) {
  86. return my v_invert ();
  87. }
  88. autoTableOfReal AffineTransform_extractMatrix (AffineTransform me) {
  89. try {
  90. autoTableOfReal thee = TableOfReal_create (my dimension, my dimension);
  91. matrixcopy_preallocated (thy data.get(), my r.get());
  92. for (integer i = 1; i <= my dimension; i ++) {
  93. char32 label [40];
  94. Melder_sprint (label,40, i);
  95. TableOfReal_setRowLabel (thee.get(), i, label);
  96. TableOfReal_setColumnLabel (thee.get(), i, label);
  97. }
  98. return thee;
  99. } catch (MelderError) {
  100. Melder_throw (me, U": transformation matrix not extracted.");
  101. }
  102. }
  103. autoTableOfReal AffineTransform_extractTranslationVector (AffineTransform me) {
  104. try {
  105. autoTableOfReal thee = TableOfReal_create (1, my dimension);
  106. for (integer i = 1; i <= my dimension; i ++) {
  107. thy data [1] [i] = my t [i];
  108. }
  109. return thee;
  110. } catch (MelderError) {
  111. Melder_throw (me, U": translation vector not extracted.");
  112. }
  113. }
  114. /* End of file AffineTransform.cpp */