1 module beziermeshmaker.datastructures.input.polygon; 2 3 import beziermeshmaker.datastructures.vec3; 4 5 class Polygon { 6 vec3[] vertices; 7 vec3 centroid; 8 9 //Used to carry forward information from the initial polygons to the output surfaces 10 string[string] metadata; 11 12 this(float[3][] vertices) { 13 foreach (float[3] coords ; vertices) { 14 this.vertices ~= new vec3(coords[0], coords[1], coords[2]); 15 } 16 17 centroid = getCentroid(); 18 } 19 20 //Algorithm is from https://bell0bytes.eu/centroid-convex/ 21 private vec3 getCentroid() { 22 vec3 weightedCenterSum = new vec3(0, 0, 0); 23 float totalWeight = 0; 24 25 //We're not doing anything special with the triangulation here since the polygons are supposed to be convex. 26 vec3 root = vertices[0]; 27 for (int i = 0; i < vertices.length - 2; i++) { 28 vec3 a = vertices[i+1]; 29 vec3 b = vertices[i+2]; 30 31 vec3 center = (root + a + b) / 3; 32 float weight = 0.5 * (a - root).cross(b - root).length(); 33 34 weightedCenterSum = weightedCenterSum + (center * weight); 35 totalWeight += weight; 36 } 37 38 return weightedCenterSum / totalWeight; 39 } 40 }