79 typename Field_T::Ptr cc)
82 if (cc->extents().min != mac->
extents().min ||
83 cc->extents().max != mac->
extents().max ||
84 cc->dataWindow().min != mac->
dataWindow().min ||
85 cc->dataWindow().max != mac->
dataWindow().max ) {
90 if (!cc->mapping()->isIdentical(mac->
mapping())) {
99 bool rotateVector =
false;
104 M44d localToWorldMtx = mapping->localToWorld();
105 V3d scale, rot, trans, shear;
106 if (extractSHRT(localToWorldMtx, scale, shear, rot, trans,
false)) {
107 ssToWsMtx.rotate(rot);
108 if (rot.length2() > FLT_EPSILON)
115 typename Field_T::iterator i = cc->begin();
116 typename Field_T::iterator end = cc->end();
119 for (; i != end; ++i) {
120 *i = mac->
value(i.x, i.y, i.z) * ssToWsMtx;
123 for (; i != end; ++i) {
124 *i = mac->
value(i.x, i.y, i.z);
136 if (mac->
extents().min != cc->extents().min ||
137 mac->
extents().max != cc->extents().max ||
138 mac->
dataWindow().min != cc->dataWindow().min ||
139 mac->
dataWindow().max != cc->dataWindow().max ) {
140 mac->
setSize(cc->extents(), cc->dataWindow());
144 if (!mac->
mapping()->isIdentical(cc->mapping())) {
155 bool rotateVector =
false;
160 M44d localToWorld = mapping->localToWorld();
161 V3d scale, rot, trans, shear;
163 wsToSsMtx.rotate(-rot);
173 typename Field_T::Ptr src = cc;
175 typename Field_T::Ptr ccRotated;
178 typename Field_T::Ptr(
new Field_T);
179 ccRotated->matchDefinition(cc);
181 typename Field_T::const_iterator iIn = cc->cbegin();
182 typename Field_T::const_iterator endIn = cc->cend();
183 typename Field_T::iterator iOut = ccRotated->begin();
185 for (; iIn != endIn; ++iIn, ++iOut) {
186 *iOut = *iIn * wsToSsMtx;
192 for (
int k = data.min.z; k <= data.max.z; k++) {
193 for (
int j = data.min.y; j <= data.max.y; j++) {
194 mac->
u(data.min.x, j, k) = src->value(data.min.x, j, k).x;
195 mac->
u(data.max.x + 1, j, k) = src->value(data.max.x, j, k).x;
200 for (
int k = data.min.z; k <= data.max.z; k++) {
201 for (
int i = data.min.x; i <= data.max.x; i++) {
202 mac->
v(i, data.min.y, k) = src->value(i, data.min.y, k).y;
203 mac->
v(i, data.max.y + 1, k) = src->value(i, data.max.y, k).y;
208 for (
int j = data.min.y; j <= data.max.y; j++) {
209 for (
int i = data.min.x; i <= data.max.x; i++) {
210 mac->
w(i, j, data.min.z) = src->value(i, j, data.min.z).z;
211 mac->
w(i, j, data.max.z + 1) = src->value(i, j, data.max.z).z;
216 for (
int k = data.min.z; k <= data.max.z; ++k) {
217 for (
int j = data.min.y; j <= data.max.y; ++j) {
218 for (
int i = data.min.x + 1; i <= data.max.x; ++i) {
220 (src->value(i, j, k).x + src->value(i - 1, j, k).x) * 0.5;
226 for (
int k = data.min.z; k <= data.max.z; ++k) {
227 for (
int j = data.min.y + 1; j <= data.max.y; ++j) {
228 for (
int i = data.min.x; i <= data.max.x; ++i) {
230 (src->value(i, j, k).y + src->value(i, j - 1, k).y) * 0.5;
236 for (
int k = data.min.z + 1; k <= data.max.z; ++k) {
237 for (
int j = data.min.y; j <= data.max.y; ++j) {
238 for (
int i = data.min.x; i <= data.max.x; ++i) {
240 (src->value(i, j, k).z + src->value(i, j, k - 1).z) * 0.5;