/* MapLine::seg * Returns this line as a segment. *******************************************************************/ fseg2_t MapLine::seg() { return fseg2_t(vertex1->point(), vertex2->point()); }
bool PolygonSplitter::splitFromEdge(int splitter_edge) { // Get vertices int v1 = edges[splitter_edge].v1; int v2 = edges[splitter_edge].v2; // First up, find the closest vertex on the front side of the edge double min_dist = 999999; int closest = -1; for (unsigned a = 0; a < vertices.size(); a++) { if (MathStuff::lineSide(vertices[a], fseg2_t(vertices[v1], vertices[v2])) > 0 && vertices[a].ok) { vertices[a].distance = MathStuff::distance(vertices[v2], vertices[a]); if (vertices[a].distance < min_dist) { min_dist = vertices[a].distance; closest = a; } } else vertices[a].distance = 999999; } // If there's nothing on the front side, something is wrong if (closest == -1) return false; // See if we can split to here without crossing anything // (this will be the case most of the time) bool intersect = false; fpoint2_t pointi; for (unsigned a = 0; a < edges.size(); a++) { // Ignore edge if adjacent to the vertices we are looking at if (edges[a].v1 == closest || edges[a].v2 == closest || edges[a].v1 == v2 || edges[a].v2 == v2 || !edges[a].ok) continue; // Intersection test if (MathStuff::linesIntersect(fseg2_t(vertices[v2], vertices[closest]), fseg2_t(vertices[edges[a].v1], vertices[edges[a].v2]), pointi)) { intersect = true; break; } } if (!intersect) { // No edge intersections, create split int e1 = addEdge(v2, closest); int e2 = addEdge(closest, v2); edges[e1].sister = e2; edges[e2].sister = e1; return true; } // Otherwise, we'll have to find the next closest vertex vector<vdist_t> sorted_verts; // Build a list of potential vertices, ordered by distance for (unsigned a = 0; a < vertices.size(); a++) { if (vertices[a].distance < 999999) sorted_verts.push_back(vdist_t(a, vertices[a].distance)); } // Go through potential split vertices, closest first std::sort(sorted_verts.begin(), sorted_verts.end()); for (unsigned a = 0; a < sorted_verts.size(); a++) { int index = sorted_verts[a].index; vertex_t& vert = vertices[index]; // Check if a split from the edge to this vertex would cross any other edges intersect = false; for (unsigned a = 0; a < edges.size(); a++) { // Ignore edge if adjacent to the vertices we are looking at if (edges[a].v1 == index || edges[a].v2 == index || edges[a].v1 == v2 || edges[a].v2 == v2 || !edges[a].ok) continue; // Intersection test if (MathStuff::linesIntersect(fseg2_t(vertices[v2], vert), fseg2_t(vertices[edges[a].v1], vertices[edges[a].v2]), pointi)) { intersect = true; break; } } if (!intersect) { // No edge intersections, create split int e1 = addEdge(v2, index); int e2 = addEdge(index, v2); edges[e1].sister = e2; edges[e2].sister = e1; return true; } } // No split created return false; }