var vertices = new List<XYZ>(); var newVertices = new List<XYZ>(); //因为Revit中顶点都是逆时针排序,只需要取出点即可 foreach (var curve in array) { vertices.Add(curve.GetEndPoint(0)); } //每个点遍历获取前一个点与后一个点,获取两个向量,此处位置的**向量方向会与缩放形式有关** for (int i = 0; i < vertices.Count; i++) { int iPrevious = -1; int iEnd = -1; if (i == 0) { iPrevious = vertices.Count - 1; iEnd = i + 1; } elseif (i == vertices.Count - 1) { iPrevious = i - 1; iEnd = 0; } else { iPrevious = i - 1; iEnd = i + 1; } XYZ pPrevious = vertices[iPrevious]; XYZ point = vertices[i]; XYZ pEnd = vertices[iEnd]; //normalize var v1 = (pPrevious - point).Normalize(); var v2 = (pEnd - point).Normalize(); var cross = (v1.X*v2.Y - v1.Y*v2.X);//叉积 , v1 , v2单位向量模为1 var lb = 0.00; if (cross == 0) continue; lb = k / cross; var tPoint = point + lb * (v1 + v2); newVertices.Add(tPoint);
}
//output var loop = new CurveLoop(); for (int i = 0; i < newVertices.Count; i++) { if(i == newVertices.Count - 1) { var c = Line.CreateBound(newVertices[i], newVertices[0]); loop.Append(c); } else { var c = Line.CreateBound(newVertices[i], newVertices[i + 1]); loop.Append(c); } } return loop; }