public List <Vector3> AsPointGrid(double pointSpacing) { try { var gridPoints = new List <Vector3>(); var side1Points = new List <Vector3>(); var side2Points = new List <Vector3>(); var side12 = new Line(vert[1], vert[2]); var side01 = new Line(vert[0], vert[1]); var side02 = new Line(vert[0], vert[2]); Vector3 v20 = vert[0] - vert[2]; Vector3 v02 = vert[2] - vert[0]; Vector3 v01 = vert[1] - vert[0]; Vector3 v12 = vert[2] - vert[1]; Vector3 v21 = vert[1] - vert[2]; Vector3 v10 = vert[0] - vert[1]; double theta0 = Math.Acos(v01.Dot(v02) / (v01.Length * v02.Length)); double theta1 = Math.Acos(v10.Dot(v12) / (v01.Length * v12.Length)); double theta2 = Math.Acos(v20.Dot(v21) / (v02.Length * v12.Length)); double thetaMax = Math.Max(theta1, Math.Max(theta0, theta2)); double side1Spacing = pointSpacing / Math.Sin(thetaMax); Vector3 basePoint = new Vector3(vert[0]); if (theta0 == thetaMax) { side1Points.AddRange(GeomUtilities.BreakMany(side01, side1Spacing)); side2Points.AddRange(GeomUtilities.BreakMany(side02, pointSpacing)); basePoint = vert[0]; } else { if (theta1 == thetaMax) { side1Points.AddRange(GeomUtilities.BreakMany(side01, side1Spacing)); side2Points.AddRange(GeomUtilities.BreakMany(side12, pointSpacing)); basePoint = vert[1]; } else { if (theta2 == thetaMax) { side1Points.AddRange(GeomUtilities.BreakMany(side02, side1Spacing)); side2Points.AddRange(GeomUtilities.BreakMany(side12, pointSpacing)); basePoint = vert[2]; } } } foreach (Vector3 side1Point in side1Points) { Vector3 translation = side1Point - basePoint; foreach (Vector3 side2Point in side2Points) { Vector3 s2Trans = side2Point.Translate(translation); if (Contains(s2Trans)) { gridPoints.Add(s2Trans); } } } return(gridPoints); } catch (Exception) { throw; } }