예제 #1
0
void mitk::WeightedPointTransform::E_maker(vtkPoints *X,
                                           vtkPoints *Y,
                                           const WeightMatrixList &W,
                                           vnl_vector<double> &returnValue)
{
#pragma omp parallel for
  for (int i = 0; i < X->GetNumberOfPoints(); ++i)
  {
    unsigned int index = 3u * i;
    double pX[3];
    double pY[3];
    Matrix3x3 M;

    X->GetPoint(i, pX);
    Y->GetPoint(i, pY);

    M[0][0] = pY[0] - pX[0];
    M[0][1] = pY[1] - pX[1];
    M[0][2] = pY[2] - pX[2];
    M[1][0] = M[0][0];
    M[1][1] = M[0][1];
    M[1][2] = M[0][2];
    M[2][0] = M[0][0];
    M[2][1] = M[0][1];
    M[2][2] = M[0][2];

    for (unsigned int j = 0; j < 3; ++j)
    {
      returnValue[index + j] = W.at(i)[j][0] * M[j][0] + W.at(i)[j][1] * M[j][1] + W.at(i)[j][2] * M[j][2];
    }
  }
}
void mitk::WeightedPointTransform::C_maker( vtkPoints* X,
                                            const WeightMatrixList &W,
                                            itk::VariableSizeMatrix< double >& returnValue )
{
#pragma omp parallel for
  for(vtkIdType i = 0; i < X->GetNumberOfPoints(); ++i )
  {
    unsigned int index = 3u * i;
    double point[3];
    X->GetPoint(i,point);

    for ( int j = 0; j < 3; ++j )
    {
      returnValue[index][0] = -W.at(i)[j][1] * point[2] + W.at(i)[j][2] * point[1];
      returnValue[index][1] =  W.at(i)[j][0] * point[2] - W.at(i)[j][2] * point[0];
      returnValue[index][2] = -W.at(i)[j][0] * point[1] + W.at(i)[j][1] * point[0];
      returnValue[index][3] =  W.at(i)[j][0];
      returnValue[index][4] =  W.at(i)[j][1];
      returnValue[index][5] =  W.at(i)[j][2];
      index += 1;
    }
  }
}