// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- UInt8ArrayType::Pointer TriclinicOps::generateIPFTriangleLegend(int imageDim) { QVector<size_t> dims(1, 4); UInt8ArrayType::Pointer image = UInt8ArrayType::CreateArray( static_cast<size_t>(imageDim * imageDim), dims, "Orthorhombic Triangle Legend"); uint32_t* pixelPtr = reinterpret_cast<uint32_t*>(image->getPointer(0)); static const float xInc = 1.0 / (imageDim); static const float yInc = 1.0 / (imageDim); static const float rad = 1.0f; float x = 0.0f; float y = 0.0f; float a = 0.0f; float b = 0.0f; float c = 0.0f; float val = 0.0f; float x1 = 0.0f; float y1 = 0.0f; float z1 = 0.0f; float denom = 0.0f; DREAM3D::Rgb color; size_t idx = 0; size_t yScanLineIndex = 0; // We use this to control where the data is drawn. Otherwise the image will come out flipped vertically // Loop over every pixel in the image and project up to the sphere to get the angle and then figure out the RGB from // there. for (int32_t yIndex = 0; yIndex < imageDim; ++yIndex) { for (int32_t xIndex = 0; xIndex < imageDim; ++xIndex) { idx = (imageDim * yScanLineIndex) + xIndex; x = -1.0f + 2.0f * xIndex * xInc; y = -1.0f + 2.0f * yIndex * yInc; float sumSquares = (x * x) + (y * y); if( sumSquares > 1.0f) // Outside unit circle { color = 0xFFFFFFFF; } else if ( sumSquares > (rad-2*xInc) && sumSquares < (rad+2*xInc)) // Black Border line { color = 0xFF000000; } else { a = (x * x + y * y + 1); b = (2 * x * x + 2 * y * y); c = (x * x + y * y - 1); val = (-b + sqrtf(b * b - 4.0 * a * c)) / (2.0 * a); x1 = (1 + val) * x; y1 = (1 + val) * y; z1 = val; denom = (x1 * x1) + (y1 * y1) + (z1 * z1); denom = sqrtf(denom); x1 = x1 / denom; y1 = y1 / denom; z1 = z1 / denom; color = generateIPFColor(0.0, 0.0, 0.0, x1, y1, z1, false); } pixelPtr[idx] = color; } yScanLineIndex++; } return image; }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- void GenerateMisorientationColors::execute() { setErrorCondition(0); dataCheck(); if(getErrorCondition() < 0) { return; } size_t totalPoints = m_CellPhasesPtr.lock()->getNumberOfTuples(); // Make sure we are dealing with a unit 1 vector. FloatVec3_t normRefDir = m_ReferenceAxis; // Make a copy of the reference Direction MatrixMath::Normalize3x1(normRefDir.x, normRefDir.y, normRefDir.z); // Create 1 of every type of Ops class. This condenses the code below UInt8ArrayType::Pointer notSupported = UInt8ArrayType::CreateArray(13, "_INTERNAL_USE_ONLY_NotSupportedArray"); notSupported->initializeWithZeros(); #ifdef DREAM3D_USE_PARALLEL_ALGORITHMS tbb::task_scheduler_init init; bool doParallel = true; #endif #ifdef DREAM3D_USE_PARALLEL_ALGORITHMS if (doParallel == true) { tbb::parallel_for(tbb::blocked_range<size_t>(0, totalPoints), GenerateMisorientationColorsImpl( normRefDir, m_ReferenceAngle, reinterpret_cast<QuatF*>(m_Quats), m_CellPhases, m_CrystalStructures, m_GoodVoxels, notSupported->getPointer(0), m_MisorientationColor), tbb::auto_partitioner()); } else #endif { GenerateMisorientationColorsImpl serial( normRefDir, m_ReferenceAngle, reinterpret_cast<QuatF*>(m_Quats), m_CellPhases, m_CrystalStructures, m_GoodVoxels, notSupported->getPointer(0), m_MisorientationColor); serial.convert(0, totalPoints); } QVector<SpaceGroupOps::Pointer> ops = SpaceGroupOps::getOrientationOpsQVector(); // Check and warn about unsupported crystal symmetries in the computation which will show as black for (size_t i = 0; i < notSupported->getNumberOfTuples() - 1; i++) { if (notSupported->getValue(i) == 1) { QString msg("The symmetry of "); msg.append(ops[i]->getSymmetryName()).append(" is not currently supported for misorientation coloring. Elements with this symmetry have been set to black"); notifyWarningMessage(getHumanLabel(), msg, -5000); } } // Check for bad voxels which will show up as black also. if (notSupported->getValue(12) == 1) { QString msg("There were elements with an unknown crystal symmetry due most likely being marked as 'a 'bad'. These elements have been colored black BUT black is a valid color for misorientation coloring. Please understand this when visualizing your data"); notifyWarningMessage(getHumanLabel(), msg, -5001); } /* Let the GUI know we are done with this filter */ notifyStatusMessage(getHumanLabel(), "Complete"); }