Skip to content

Commit 757b590

Browse files
committed
AngReader: Correctly calculate grid index for EDAX .ang files
Signed-off-by: Michael Jackson <mike.jackson@bluequartz.net>
1 parent 75a43a1 commit 757b590

File tree

1 file changed

+65
-13
lines changed

1 file changed

+65
-13
lines changed

Source/EbsdLib/IO/TSL/AngReader.cpp

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,62 @@
3434
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
3535

3636
#include "AngReader.h"
37+
#include "AngConstants.h"
38+
39+
#include "EbsdLib/Core/EbsdMacros.h"
40+
#include "EbsdLib/IO/EbsdReader.h"
41+
#include "EbsdLib/Math/EbsdLibMath.h"
3742

3843
#include <algorithm>
3944
#include <fstream>
4045
#include <sstream>
4146
#include <utility>
47+
#include <optional>
4248

43-
#include "AngConstants.h"
49+
namespace
50+
{
4451

45-
#include "EbsdLib/Core/EbsdMacros.h"
46-
#include "EbsdLib/IO/EbsdReader.h"
47-
#include "EbsdLib/Math/EbsdLibMath.h"
52+
using Vec3Type = std::array<float, 3>;
53+
using Size3Type = std::array<size_t, 3>;
54+
55+
std::optional<size_t> GetGridIndex(Vec3Type& coords, Vec3Type& m_Origin, Vec3Type& m_Spacing, Size3Type& m_Dimensions )
56+
{
57+
if(coords[0] < m_Origin[0] || coords[0] > (static_cast<float>(m_Dimensions[0]) * m_Spacing[0] + m_Origin[0]))
58+
{
59+
return {};
60+
}
61+
62+
if(coords[1] < m_Origin[1] || coords[1] > (static_cast<float>(m_Dimensions[1]) * m_Spacing[1] + m_Origin[1]))
63+
{
64+
return {};
65+
}
66+
67+
if(coords[2] < m_Origin[2] || coords[2] > (static_cast<float>(m_Dimensions[2]) * m_Spacing[2] + m_Origin[2]))
68+
{
69+
return {};
70+
}
71+
72+
size_t x = static_cast<size_t>(std::floor((coords[0] - m_Origin[0]) / m_Spacing[0]));
73+
if(x >= m_Dimensions[0])
74+
{
75+
return {};
76+
}
77+
78+
size_t y = static_cast<size_t>(std::floor((coords[1] - m_Origin[1]) / m_Spacing[1]));
79+
if(y >= m_Dimensions[1])
80+
{
81+
return {};
82+
}
83+
84+
size_t z = static_cast<size_t>(std::floor((coords[2] - m_Origin[2]) / m_Spacing[2]));
85+
if(z >= m_Dimensions[2])
86+
{
87+
return {};
88+
}
89+
90+
return (m_Dimensions[1] * m_Dimensions[0] * z) + (m_Dimensions[0] * y) + x;
91+
}
92+
}
4893

4994
// -----------------------------------------------------------------------------
5095
//
@@ -942,6 +987,11 @@ std::pair<int, std::string> AngReader::fixOrderOfData(std::vector<int64_t>& inde
942987
float yMin = *resultY.first;
943988
float yMax = *resultY.second;
944989

990+
std::array<float, 3> m_Origin = {xMin - 0.5f * xStep, yMin - 0.5f * yStep, 0.0f};
991+
std::array<float, 3> m_Spacing = {xStep, yStep, 1.0f};
992+
std::array<size_t, 3> m_Dimensions = {static_cast<size_t>(numCols), static_cast<size_t>(numRows), 1ULL};
993+
std::array<float, 3> coords = {0.0f, 0.0f, 0.0f};
994+
945995
if(std::nearbyint((xMax - xMin) / xStep) + 1 != numCols)
946996
{
947997
std::stringstream message;
@@ -953,28 +1003,30 @@ std::pair<int, std::string> AngReader::fixOrderOfData(std::vector<int64_t>& inde
9531003
std::stringstream message;
9541004
message << "Error: The calculated number of rows " << yMax << ", " << yMin << ", " << yStep << " (" << ((yMax - yMin) / yStep) + 1 << ") does not match the actual number of rows (" << numRows + 1
9551005
<< ")" << std::endl;
956-
return {-101, message.str()};
1006+
return {-101101, message.str()};
9571007
}
9581008

9591009
indexMap.resize(numElements);
9601010

9611011
for(int i = 0; i < numElements; i++)
9621012
{
963-
int64_t xIndex = (xPosition[i] - xMin) / xStep;
964-
int64_t yIndex = (yPosition[i] - yMin) / yStep;
965-
966-
if(xIndex >= 0 && xIndex < numCols && yIndex >= 0 && yIndex < numRows)
1013+
coords[0] = xPosition[i];
1014+
coords[1] = yPosition[i];
1015+
auto result = ::GetGridIndex(coords, m_Origin, m_Spacing, m_Dimensions);
1016+
if(result.has_value())
9671017
{
968-
indexMap[i] = (numCols * yIndex) + xIndex;
1018+
indexMap[i] = *result;
9691019
}
9701020
else
9711021
{
9721022
std::stringstream message;
973-
message << "Error: The given indices (" << xIndex << ", " << yIndex << ") does not fit within the grid size (" << numCols << ", " << numRows << ")" << std::endl;
974-
return {-10, message.str()};
1023+
message << "AngReader Error: The calculated index for the X and Y Position " << coords[0] << ", " << coords[1] << " will fall outside of the calculated grid.\n "
1024+
<< "Origin: " << m_Origin[0] <<", " << m_Origin[1] << "\n "
1025+
<< "Spacing: " << m_Spacing[1] << ", " << m_Spacing[1] << "\n "
1026+
<< "Dimensions: " << m_Dimensions[0] << ", " << m_Dimensions[1] << "\n" << std::endl;
1027+
return {-101111, message.str()};
9751028
}
9761029
}
977-
9781030
return {0, ""};
9791031
}
9801032

0 commit comments

Comments
 (0)