Ejemplo n.º 1
0
void Viewer::trackballRotate(const QVector2D& startCoords,
                             const QVector2D& endCoords,
                             QMatrix4x4* mat) {
  // TODO: We could get these from a common location
  QVector2D trackballCenter(width() / 2.0, height() / 2.0);
  auto diam = std::min(width(), height()) / 2.0;

  // Convert into coordinates centered at trackball center
  auto start = (startCoords - trackballCenter);
  auto end = (endCoords - trackballCenter);
  // Y coordinates are upside down
  start[1] *= -1;
  end[1] *= -1;

  end *= 2.0 / diam;
  start *= 2.0 / diam;

  // Vectors from center of "trackball" to points
  QVector3D endVector(end[0], end[1], 1 - end[0]*end[0] - end[1]*end[1]);
  QVector3D startVector(start[0], start[1], 1 - start[0]*start[0] - start[1]*start[1]);

  // Cheat because vector would be const
  for (auto vp : {&endVector, &startVector}) {
    auto& v = *vp;
    if (v[2] < 0) {
      // Mouse outside trackball: rotation about Z
      v /= std::sqrt(1 - v[2]);
      v[2] = 0;
    }
    else {
      v[2] = std::sqrt(v[2]);
    }
  }

  // Vector to rotate about. Length of vector is angle of rotation in radians.
  auto rotationVector = QVector3D::crossProduct(startVector, endVector);
  auto angleDeg = rotationVector.length() / (2 * M_PI) * 360;
  rotationVector.normalize();
  // Qt rotates on the right. We want the left.
  QMatrix4x4 rotMat;
  rotMat.rotate(angleDeg, rotationVector);
  *mat = rotMat * *mat;
}
Ejemplo n.º 2
0
XDMFBINARYCONTROLLER *
XdmfBinaryControllerNewHyperslab(char * filePath,
                                 int type,
                                 int endian,
                                 unsigned int seek,
                                 unsigned int * start,
                                 unsigned int * stride,
                                 unsigned int * dimensions,
                                 unsigned int * dataspaceDimensions,
                                 unsigned int numDims,
                                 int * status)
{
  XDMF_ERROR_WRAP_START(status)
  std::vector<unsigned int> startVector(start, start + numDims);
  std::vector<unsigned int> strideVector(stride, stride + numDims);
  std::vector<unsigned int> dimVector(dimensions, dimensions + numDims);
  std::vector<unsigned int> dataspaceVector(dataspaceDimensions, dataspaceDimensions + numDims);
  shared_ptr<const XdmfArrayType> buildType = shared_ptr<XdmfArrayType>();
  switch (type) {
    case XDMF_ARRAY_TYPE_UINT8:
      buildType = XdmfArrayType::UInt8();
      break;
    case XDMF_ARRAY_TYPE_UINT16:
      buildType = XdmfArrayType::UInt16();
      break;
    case XDMF_ARRAY_TYPE_UINT32:
      buildType = XdmfArrayType::UInt32();
      break;
    case XDMF_ARRAY_TYPE_INT8:
      buildType = XdmfArrayType::Int8();
      break;
    case XDMF_ARRAY_TYPE_INT16:
      buildType = XdmfArrayType::Int16();
      break;
    case XDMF_ARRAY_TYPE_INT32:
      buildType = XdmfArrayType::Int32();
      break;
    case XDMF_ARRAY_TYPE_INT64:
      buildType = XdmfArrayType::Int64();
      break;
    case XDMF_ARRAY_TYPE_FLOAT32:
      buildType = XdmfArrayType::Float32();
      break;
    case XDMF_ARRAY_TYPE_FLOAT64:
      buildType = XdmfArrayType::Float64();
      break;
    default:
      XdmfError::message(XdmfError::FATAL,
                         "Error: Invalid ArrayType.");
      break;
  }
  XdmfBinaryController::Endian buildEndian = XdmfBinaryController::NATIVE;
  switch (endian) {
    case XDMF_BINARY_CONTROLLER_ENDIAN_BIG:
      buildEndian = XdmfBinaryController::BIG;
      break;
    case XDMF_BINARY_CONTROLLER_ENDIAN_LITTLE:
      buildEndian = XdmfBinaryController::LITTLE;
      break;
    case XDMF_BINARY_CONTROLLER_ENDIAN_NATIVE:
      buildEndian = XdmfBinaryController::NATIVE;
      break;
    default:
      XdmfError::message(XdmfError::FATAL,
                         "Error: Invalid Endian.");
      break;
  }
  shared_ptr<XdmfBinaryController> generatedController = XdmfBinaryController::New(std::string(filePath), buildType, buildEndian, seek, startVector, strideVector, dimVector, dataspaceVector);
  return (XDMFBINARYCONTROLLER *)((void *)(new XdmfBinaryController(*generatedController.get())));
  XDMF_ERROR_WRAP_END(status)
  return NULL;
}