Esempio n. 1
0
		private void InsertVertex(PVertexLoop prev, PVertexLoop add) {
			prev.next.prev = add;
			add.next = prev.next;
			add.prev = prev;
			prev.next = add;
			numVertices++;
		}
Esempio n. 2
0
		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;
		}
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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;
            }
        }
Esempio n. 5
0
 private void InsertVertex(PVertexLoop prev, PVertexLoop add)
 {
     prev.next.prev = add;
     add.next       = prev.next;
     add.prev       = prev;
     prev.next      = add;
     numVertices++;
 }
Esempio n. 6
0
		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;
		}
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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;
		}
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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;
        }
Esempio n. 11
0
		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;
		}
Esempio n. 12
0
        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;
        }
Esempio n. 13
0
		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;
			}
	
		}
Esempio n. 14
0
        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;
            }
        }
Esempio n. 15
0
		private void RemoveVertex(PVertexLoop v) {
			v.prev.next = v.next;
			v.next.prev = v.prev;
			numVertices--;
		}
Esempio n. 16
0
 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));
 }
Esempio n. 17
0
		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;
			}
	
		}
Esempio n. 18
0
		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);
		}
Esempio n. 19
0
		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();
		}
Esempio n. 20
0
 private void RemoveVertex(PVertexLoop v)
 {
     v.prev.next = v.next;
     v.next.prev = v.prev;
     numVertices--;
 }