@Baris wrote:
Hi evereyone,
I am trying to planarize some QuadMeshFaces within a loop.
I found this thread here
: https://www.grasshopper3d.com/forum/topics/vb-planar-mesh?page=1&commentId=2985220%3AComment%3A1434649&x=1#2985220Comment1434649
and started to write what @Dani_Abalde proposed:ErrorGlobal as new double
Count as new integer
Do
A tree that stores, for each vertex, a list of vectors.
Per face:
Plane from point cloud.
For each point of the face:
Projecting the point to the plane and the distance is the factor error. You need to know if the value is positive or negative.
Add the vector (vertex - Project vertex) to the tree. the branch is the index of the vertice.
End
Per vertex:
Making the average of the vectors in the respective branch in the tree.
Move the vertex of the mesh with the average vector.
errorglobal += vector length
End
errorglobal / = vertices.count 'Average error or another way to see.
count + = 1
Loop while errorglobal> 0.01 or count <1000My attempt so far:
private void RunScript(Mesh msh, ref object vertices, ref object planes, ref object distances, ref object averageVec, ref object moveVector, ref object Mesh, ref object cnt) { int count = 0; for (int co = 0; count < 20 ; co++) { var verticesTree = new DataTree<Point3d>(); var distancesTree = new DataTree<double>(); var moveVectorTree = new DataTree<Vector3d>(); var planesTree = new DataTree<Plane>(); var averageVectorTree = new DataTree<Vector3d>(); //Per face_____________________________________________ for (int i = 0; i < msh.Faces.Count; i++) { //getting the vertices and putting them in a tree Point3f a; Point3f b; Point3f c; Point3f d; msh.Faces.GetFaceVertices(i, out a, out b, out c, out d); verticesTree.Add(a, new GH_Path(i)); verticesTree.Add(b, new GH_Path(i)); verticesTree.Add(c, new GH_Path(i)); verticesTree.Add(d, new GH_Path(i)); } for (int i = 0; i < verticesTree.BranchCount; i++) { // projecting vertices to plane to get vectors and distances Plane plane; PlaneFitResult pFit = Plane.FitPlaneToPoints(verticesTree.Branch(i), out plane); planesTree.Add(plane, new GH_Path(i)); for (int j = 0; j < verticesTree.Branch(i).Count; j++) { Point3d copy = verticesTree.Branch(i)[j]; Transform xForm = Transform.PlanarProjection(plane); copy.Transform(xForm); double dis = copy.DistanceTo(verticesTree.Branch(i)[j]); distancesTree.Add(dis, new GH_Path(i)); Vector3d move = (verticesTree.Branch(i)[j] - copy); moveVectorTree.Add(move, new GH_Path(i)); } } //per vertex___________________________________________ for (int i = 0; i < verticesTree.BranchCount; i++) { for (int j = 0; j < verticesTree.Branch(i).Count; j++) { Vector3d averageVector = average(moveVectorTree.Branch(i)); averageVectorTree.Add(averageVector, new GH_Path(i)); Transform xForm = Transform.Translation(averageVector); verticesTree.Branch(i)[j].Transform(xForm); } } count += 1; vertices = verticesTree; planes = planesTree; distances = distancesTree; averageVec = averageVectorTree; moveVector = moveVectorTree; cnt = count; } } // <Custom additional code> //_________Making an average Vector public Vector3d average (List<Vector3d> vectors) { Vector3d avg = new Vector3d(0, 0, 0); for (int i = 0; i < vectors.Count; i++) avg += vectors[i]; return avg / vectors.Count; }
My issues:
- the average vector that I get is always (0,0,0)
- do I have to build the mesh afterwards or can I just move the vertices of the existing one
I hope it´s makes a little bit of sense and is not completly chaotic and far away from a working code.
Thanks in advace !
20191126_PQM.gh (6.9 KB)
Posts: 1
Participants: 1