示例#1
0
/* MapLine::seg
 * Returns this line as a segment.
 *******************************************************************/
fseg2_t MapLine::seg()
{
	return fseg2_t(vertex1->point(), vertex2->point());
}
示例#2
0
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;
}