67 std::vector<double> &tvalues, std::vector<Pt3d> &a_pts,
double a_tol) {
92 for (
size_t i = 0; i < tChange.size() - 1; ++i) {
93 if (tChange[i + 1] - tChange[i] > 1) {
97 if ((i > 0 && i + 2 < tChange.size()) || inNeither.size() > 1 ||
98 (i == 0 && tChange[1] - tChange[0] > 1)) {
99 toRemove.insert(toRemove.end(), inNeither.begin(), inNeither.end());
105 for (
size_t i = toRemove.size(); i-- > 0;) {
122 for (
size_t i = 0; i < tChange.size() - 1; ++i) {
123 if (tChange[i + 1] - tChange[i] > 1) {
129 if (inNext.size() > 1) {
140 for (
size_t j = 0; j < inNext.size() && !found; ++j) {
142 int edgeBeg = inNext[j];
144 for (
size_t k = 0; k < inPrev.size() && edgeEnd ==
XM_NONE; ++k) {
150 int polyIdx =
m_d->
m_ixs[edgeBeg].m_i - 1;
153 for (
size_t k = 0; k <
m_d->
m_polys[polyIdx].size(); ++k) {
156 Pt3d centroid = gmComputeCentroid(poly);
157 Turn_enum turn = gmTurn(
m_d->
m_ixs[edgeBeg].m_pt,
158 m_d->
m_ixs[edgeEnd].m_pt, centroid);
159 if (turn != TURN_RIGHT) {
160 toRemove.push_back(edgeBeg);
161 toRemove.push_back(edgeEnd);
170 std::sort(toRemove.begin(), toRemove.end());
171 for (
size_t i = toRemove.size(); i-- > 0;) {
202 for (; i < (int)
m_d->
m_ixs.size(); ++i) {
219 VecInt &polyids,
VecDbl &tvalues, std::vector<Pt3d> &a_pts)
const {
250 std::vector<Pt3d> &a_pts)
const {
257 SetInt setIds, setIdsPrev;
259 for (
int i = 0; i < (int)tChange.size() - 1; ++i) {
260 if (tChange[i + 1] - tChange[i] > 1) {
261 VecInt inPrev, inNext, inNeither;
266 if (inPrev.empty() && inNeither.empty())
270 for (
size_t j = 0; j < inNeither.size(); ++j) {
271 setIds.insert(
m_d->
m_ixs[inNeither[j]].m_i);
278 for (
size_t j = 0; j < inPrev.size(); ++j) {
279 if (setIdsPrev.find(
m_d->
m_ixs[inPrev[j]].m_i) == setIdsPrev.end()) {
280 setIds.insert(
m_d->
m_ixs[inPrev[j]].m_i);
286 if (setIds.empty()) {
289 for (
size_t j = 0; j < inNext.size(); ++j) {
290 if (setIdsPrev.find(
m_d->
m_ixs[inNext[j]].m_i) ==
292 setIds.insert(
m_d->
m_ixs[inNext[j]].m_i);
300 for (
size_t j = 0; j < inNeither.size(); ++j) {
301 setIds.insert(
m_d->
m_ixs[inNeither[j]].m_i);
306 if (setIds.empty()) {
308 for (
size_t j = 0; j < inPrev.size(); ++j) {
309 setIds.insert(
m_d->
m_ixs[inPrev[j]].m_i);
316 setIds.insert(
m_d->
m_ixs[tChange[i]].m_i);
332 VecInt &polyids,
VecDbl &tvalues, std::vector<Pt3d> &a_pts)
const {
341 polyids.push_back(
m_d->
m_ixs[0].m_i);
342 tvalues.push_back(
m_d->
m_ixs[0].m_t);
343 a_pts.push_back(
m_d->
m_ixs[0].m_pt);
370 if (polyids.size() == 1) {
372 polyids.push_back(polyids.back());
373 tvalues.push_back(tvalues.back());
374 a_pts.push_back(a_pts.back());
378 if (
m_d->
m_polys2.empty() && polyids.back() != polyids[polyids.size() - 2]) {
379 polyids.push_back(polyids.back());
380 tvalues.push_back(tvalues.back());
381 a_pts.push_back(a_pts.back());
385 if (polyids.size() > 1) {
390 for (
size_t i = 1; i < polyids.size(); ++i) {
391 if (polyids[i] == polyids[i - 1]) {
407 std::vector<Pt3d> &a_pts)
const {
408 polyids.push_back(a_ix.
m_i);
409 tvalues.push_back(a_ix.
m_t);
410 a_pts.push_back(a_ix.
m_pt);
427 VecInt *inNeither)
const {
434 for (
int j = tChange[idx]; j < tChange[idx + 1]; ++j) {
438 bool foundPrev =
false;
440 for (
int k = tChange[idx - 1]; k < tChange[idx] && !foundPrev; ++k) {
450 bool foundNext =
false;
451 if (!foundPrev && idx + 2 < (
int)tChange.size()) {
452 for (
int k = tChange[idx + 1]; k < (int)tChange[idx + 2] && !foundNext;
462 inPrev->push_back(j);
463 }
else if (foundNext) {
465 inNext->push_back(j);
468 inNeither->push_back(j);
488 tChange.assign(1, 0);
489 for (
size_t i = 1; i <
m_d->
m_ixs.size(); ++i) {
491 tChange.push_back((
int)i);
494 tChange.push_back((
int)
m_d->
m_ixs.size());
std::vector< std::vector< int > > m_polys
0-based? indices into m_points to form polygons
void SwapAdjacents()
Swap adjacent identical intersections if necessary.
void FixArrays(std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts) const
Make sure we always have at least two tvalues, an entrance and an exit, and that the last polyid = -1...
void IntersectionsToPolyIdsAndTValues(std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts) const
Copy intersections to polyids and tvalues, removing duplicates.
bool EQ_TOL(const _T &A, const _U &B, const _V &tolerance)
GmMultiPolyIntersectorData * m_d
Intersection data from GmMultiPolyIntersector.
double m_tol
Tolerance used when comparing t values.
An intersection point of a line with a polygon.
std::set< int > m_polys2
polygon IDs (1-based) that 2nd point is inside on on
void IntersectionsToPolyIdsAndTValuesFor2(std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts) const
Copy intersections to polyids and tvalues when there are 2 intersections.
void FindPreviousNextNeither(const std::vector< int > &tChange, const int idx, std::vector< int > *inPrev, std::vector< int > *inNext, std::vector< int > *inNeither) const
Look at each poly in this set of t values and see if it exists in the previous or next set of t value...
std::vector< int > VecInt
void RemoveCornerTouches()
Remove polys that only touch the line at a corner. We try to identify these corner polys using the fo...
Pt3d m_pt
Intersection location.
int m_i
The polygon id (1 based)
void FindWhereTValuesChange(std::vector< int > &tChange) const
Mark where we have a change in t values.
Functions dealing with geometry.
void AddToPolyIdsAndTValues(const ix &a_ix, std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts) const
Add the intersection info to the arrays.
std::vector< double > VecDbl
std::set< int > m_polys1
polygon IDs (1-based) that 1st point is inside or on
#define XM_ENSURE_TRUE_VOID_NO_ASSERT(...)
std::vector< Pt3d > VecPt3d
std::vector< ix > m_ixs
Intersections.
Struct used by GmMultiPolyIntersector.
bool EQ_EPS(_T A, _U B, _V epsilon)
virtual void Sort(GmMultiPolyIntersectorData &a_data, std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts, double a_tol) override
Sort the intersections, remove redundant info.
void RemoveDuplicateEdges()
If the line goes along an edge we may have polygons on both sides of the edge. Perhaps we want only t...
void Swap(int a, int b)
Swap the order of the intersections a and b.
void IntersectionsToPolyIdsAndTValuesFor3OrMore(std::vector< int > &polyids, std::vector< double > &tvalues, std::vector< Pt3d > &a_pts) const
Copy intersections to polyids and tvalues when there are 3 or more intersections. ...
std::vector< Pt3d > m_points
All points used by all polygons.