private void InsertVertex(PVertexLoop prev, PVertexLoop add) { prev.next.prev = add; add.next = prev.next; add.prev = prev; prev.next = add; numVertices++; }
private bool PointInPolygon(PVertexLoop v) { PVertexLoop prev = v.prev; PVertexLoop next = v.next; float nor = prev.v.Sub(v.v).Cross(prev.v.Sub(next.v)); PVertexLoop list = vers; for (int i = 0; i < numVertices; i++) { bool hit = true; if (list == prev || list == v || list == next) { hit = false; } Vector2f t1 = prev.v; Vector2f t2 = v.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } else { t1 = v.v; t2 = next.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } else { t1 = next.v; t2 = prev.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } } } if (hit) { return true; } list = list.next; } return false; }
private void Triangulate() { if (numVertices < 3) { return; } PVertexLoop list = vers; for (int i = 0; i < numVertices; i++) { if (vers.v.x > list.v.x) { vers = list; } list = list.next; } vers = GetEar(vers); if (vers == null) { return; } if (CalcArea(vers.prev.v, vers.v, vers.next.v) > 1E-008F) { triangles[numTriangles++] = new PPolygon(new Vector2f[] { vers.prev.v, vers.v, vers.next.v }); } RemoveVertex(vers); vers = vers.next; Triangulate(); }
private void MakeVertexList(Vector2f[] vertices) { vers = new PVertexLoop(vertices[0].x, vertices[0].y); PVertexLoop list = vers; int skipCount = 0; for (int i = 1; i < numVertices; i++) { if (list.v.x == vertices[i].x && list.v.y == vertices[i].y) { skipCount++; } else { PVertexLoop next = new PVertexLoop(vertices[i].x, vertices[i].y); list.next = next; next.prev = list; list = list.next; } } numVertices -= skipCount; vers.prev = list; list.next = vers; for (int i = 0; i < numVertices; i++) { vers.v.Set(vers.v.x + (float)MathUtils.Random() * 0.001F, vers.v.y + (float)MathUtils.Random() * 0.001F); vers = vers.next; } }
private PVertexLoop GetEar(PVertexLoop v) { for (int i = 0; i < numVertices; i++) { if (GetCross(v) <= 0.0F && !PointInPolygon(v)) { return v; } v = v.next; } return null; }
private PVertexLoop GetEar(PVertexLoop v) { for (int i = 0; i < numVertices; i++) { if (GetCross(v) <= 0.0F && !PointInPolygon(v)) { return(v); } v = v.next; } return(null); }
private void MakeVertexList(Vector2f[] vertices) { numVertices = vertices.Length; vers = new PVertexLoop(vertices[0].x, vertices[0].y); PVertexLoop list = vers; for (int i = 1; i < numVertices; i++) { PVertexLoop next = new PVertexLoop(vertices[i].x, vertices[i].y); list.next = next; next.prev = list; list = next; } vers.prev = list; list.next = vers; }
private bool PointInPolygon(PVertexLoop v) { PVertexLoop prev = v.prev; PVertexLoop next = v.next; float nor = prev.v.Sub(v.v).Cross(prev.v.Sub(next.v)); PVertexLoop list = vers; for (int i = 0; i < numVertices; i++) { bool hit = true; if (list == prev || list == v || list == next) { hit = false; } Vector2f t1 = prev.v; Vector2f t2 = v.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } else { t1 = v.v; t2 = next.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } else { t1 = next.v; t2 = prev.v; if (list.v.Sub(t1).Cross(list.v.Sub(t2)) * nor < 0.0F) { hit = false; } } } if (hit) { return(true); } list = list.next; } return(false); }
private void ReverseVertices(PVertexLoop begin, PVertexLoop end) { if (begin.next == end) return; PVertexLoop prevBegin = begin.next; PVertexLoop prevEnd = end.prev; PVertexLoop next; for (PVertexLoop loop = begin.next; loop != end; loop = next) { next = loop.next; loop.next = loop.prev; loop.prev = next; } prevBegin.next = end; end.prev = prevBegin; prevEnd.prev = begin; begin.next = prevEnd; }
private void ReverseVertices(PVertexLoop begin, PVertexLoop end) { if (begin.next == end) { return; } PVertexLoop prevBegin = begin.next; PVertexLoop prevEnd = end.prev; PVertexLoop next; for (PVertexLoop loop = begin.next; loop != end; loop = next) { next = loop.next; loop.next = loop.prev; loop.prev = next; } prevBegin.next = end; end.prev = prevBegin; prevEnd.prev = begin; begin.next = prevEnd; }
private void MakeVertexList(Vector2f[] vertices) { vers = new PVertexLoop(vertices[0].x, vertices[0].y); PVertexLoop list = vers; int skipCount = 0; for (int i = 1; i < numVertices; i++) { if (list.v.x == vertices[i].x && list.v.y == vertices[i].y) { skipCount++; } else { PVertexLoop next = new PVertexLoop(vertices[i].x, vertices[i].y); list.next = next; next.prev = list; list = list.next; } } numVertices -= skipCount; vers.prev = list; list.next = vers; for (int i = 0; i < numVertices; i++) { vers.v.Set(vers.v.x + (float) MathUtils.Random() * 0.001F, vers.v.y + (float) MathUtils.Random() * 0.001F); vers = vers.next; } }
private void Figure() { PVertexLoop vi = vers; float e = 0.0001F; for (int i = 0; i < numVertices; i++) { PVertexLoop vj = vers; for (int j = 0; j < numVertices; j++) { if (vi != vj) { Vector2f cross = CheckCrossEdge(vi.v, vi.next.v, vj.v, vj.next.v); if (cross != null) { Vector2f epsilon1 = vi.v.Sub(vi.next.v); epsilon1.Normalize(); epsilon1.MulLocal(e); Vector2f epsilon2 = vj.next.v.Sub(vj.v); epsilon2.Normalize(); epsilon2.MulLocal(e); InsertVertex(vi, new PVertexLoop(cross.x, cross.y)); InsertVertex(vj, new PVertexLoop(cross.x, cross.y)); vi.next.crossPoint = true; vj.next.crossPoint = true; vi.next.pair = vj.next; vi.next.epsilon = epsilon1; vj.next.epsilon = epsilon2; } } vj = vj.next; } vi = vi.next; } PVertexLoop[] v = new PVertexLoop[numVertices]; for (int i = 0; i < numVertices; i++) { vers = v[i] = vers.next; } for (int i = 0; i < numVertices; i++) { if (v[i].crossPoint && v[i].pair != null) { ReverseVertices(v[i], v[i].pair); v[i].v.AddLocal(v[i].epsilon); v[i].pair.v.AddLocal(v[i].pair.epsilon); if (CheckCrossEdge(v[i].v, v[i].next.v, v[i].pair.v, v[i].pair.prev.v) != null) { float tx = v[i].v.x; float ty = v[i].v.y; v[i].v.Set(v[i].pair.v.x, v[i].pair.v.y); v[i].pair.v.Set(tx, ty); } } } done = new Vector2f[numVertices]; for (int i = 0; i < numVertices; i++) { done[i] = new Vector2f(vers.v.x, vers.v.y); vers = vers.next; } }
private void RemoveVertex(PVertexLoop v) { v.prev.next = v.next; v.next.prev = v.prev; numVertices--; }
private float GetCross(PVertexLoop v) { return((v.v.x - v.next.v.x) * (v.prev.v.y - v.v.y) - (v.v.y - v.next.v.y) * (v.prev.v.x - v.v.x)); }
private float GetCross(PVertexLoop v) { return (v.v.x - v.next.v.x) * (v.prev.v.y - v.v.y) - (v.v.y - v.next.v.y) * (v.prev.v.x - v.v.x); }