void AddNewArètesAndFace(int i1, int i2, int i3) { Vector3 v1 = PointHandler.pointList[i1].transform.position; Vector3 v2 = PointHandler.pointList[i2].transform.position; Vector3 v3 = PointHandler.pointList[i3].transform.position; Arète a1 = FindOrCreateArète(sommets[i1], sommets[i3]); Arète a2 = FindOrCreateArète(sommets[i3], sommets[i2]); Arète a3 = FindOrCreateArète(sommets[i2], sommets[i1]); faces.Add(new Face(a1, a2, a3)); }
Arète FindOrCreateArète(Sommet a, Sommet b) { foreach (Arète arète in arètes) { if (arète.A == a && arète.B == b || arète.B == a && arète.A == b) { return(arète); } } Arète ar = new Arète(a, b); arètes.Add(ar); return(ar); }
public void AddPq1(Vector3 v) { Sommet Pq1 = new Sommet(v); sommets.Add(Pq1); Arète[] ars = arètes.ToArray(); foreach (Arète a in ars) { if (a.color != EPolyColor.Violet) { continue; } Arète a1 = FindOrCreateArète(a.A, Pq1); Arète a2 = FindOrCreateArète(a.B, Pq1); Face f = new Face(a1, a2, a); faces.Add(f); } }
IEnumerator StartTriangulation() { //if (PointHandler.pointList.Count < 3) return; //Tri du plus a gauche puis si égalité le plus en bas PointHandler.pointList.Sort(delegate(GameObject go1, GameObject go2) { if (go1.transform.position.x == go2.transform.position.x) { return(go1.transform.position.y > go2.transform.position.y ? 1 : -1); } else { return(go1.transform.position.x > go2.transform.position.x ? 1 : -1); } }); triangles = new List <Triangle>(); arètes = new List <Arète>(); sommets = new List <Sommet>(); Vector3 startDir = (PointHandler.pointList[1].transform.position - PointHandler.pointList[0].transform.position).normalized; Vector3 nextDir = (PointHandler.pointList[2].transform.position - PointHandler.pointList[1].transform.position).normalized; { Sommet s1 = new Sommet(PointHandler.pointList[0].transform.position); Sommet s2 = new Sommet(PointHandler.pointList[1].transform.position); Sommet s3 = new Sommet(PointHandler.pointList[2].transform.position); sommets.Add(s1); sommets.Add(s2); sommets.Add(s3); if (startDir == nextDir) { Sommet s4 = new Sommet(PointHandler.pointList[3].transform.position); sommets.Add(s4); Arète a1 = new Arète(0, 1); Arète a2 = new Arète(1, 3); Arète a3 = new Arète(3, 0); arètes.Add(a1); arètes.Add(a2); arètes.Add(a3); Triangle t1 = new Triangle(0, 1, 2); triangles.Add(t1); Arète a4 = new Arète(1, 2); arètes.Add(a4); Arète a5 = new Arète(2, 3); arètes.Add(a5); Triangle t2 = new Triangle(3, 4, 2); triangles.Add(t2); } else { Arète a1 = new Arète(0, 1); Arète a2 = new Arète(1, 2); Arète a3 = new Arète(2, 0); arètes.Add(a1); arètes.Add(a2); arètes.Add(a3); Triangle t1 = new Triangle(0, 1, 2); triangles.Add(t1); } } // Ajouter tout les autres points for (int p = sommets.Count; p < PointHandler.pointList.Count; ++p) { Sommet sommetToAdd = new Sommet(PointHandler.pointList[p].transform.position); sommets.Add(sommetToAdd); Vector2 sommet2 = new Vector2(sommetToAdd.pos.x, sommetToAdd.pos.y); foreach (Arète A in arètes) { //if (A.isInterior) continue; A.isInterior = false; Vector3 center = A.GetCenter(); Vector2 centerA = new Vector2(center.x, center.y); foreach (Arète B in arètes) { if (A == B) { continue; } Vector2 pi = new Vector2(0, 0); if (LineSegmentsIntersection(centerA, sommet2, new Vector2(sommets[B.s1].pos.x, sommets[B.s1].pos.y), new Vector2(sommets[B.s2].pos.x, sommets[B.s2].pos.y), out pi)) { A.isInterior = true; break; } } } int count = arètes.Count; for (int i = 0; i < count; ++i) { Arète A = arètes[i]; if (!A.isInterior) { Arète a1 = new Arète(A.s1, sommets.Count - 1); arètes.Add(a1); Arète a2 = new Arète(A.s2, sommets.Count - 1); arètes.Add(a2); Triangle tri = new Triangle(arètes.Count - 2, arètes.Count - 1, i); triangles.Add(tri); } } } yield return(0); }
public Face(Arète A, Arète B, Arète C) { this.A = A; this.B = B; this.C = C; }