|
@@ -1689,7 +1689,8 @@ namespace SAGA.RevitUtils.Extends
|
|
|
#endregion
|
|
|
//以给定点,向x正方向做射线
|
|
|
//线段端点在射线上的集合
|
|
|
- List<XYZ> points = new List<XYZ>();
|
|
|
+ //List<XYZ> points = new List<XYZ>();
|
|
|
+ List<PointGroup> groups = new List<PointGroup>();
|
|
|
//默认是偶数
|
|
|
bool isEven = true;
|
|
|
double baseX = inputPoint.X;
|
|
@@ -1717,23 +1718,8 @@ namespace SAGA.RevitUtils.Extends
|
|
|
}
|
|
|
else if (baseX.IsLess(minX))
|
|
|
{
|
|
|
- //凸字形形状
|
|
|
- //记录射线的两个交点
|
|
|
- points.Add(start);
|
|
|
- points.Add(end);
|
|
|
- #region 与射线共线处理
|
|
|
- List<Line> useLines = new List<Line>(lines);
|
|
|
- useLines.Remove(line);
|
|
|
- var extendStart = LineUtil.GetFirstPoint(useLines, start, p => !p.Y.IsEqual(start.Y));
|
|
|
- var extendEnd = LineUtil.GetFirstPoint(useLines, end, p => !p.Y.IsEqual(end.Y));
|
|
|
- if (extendStart.Y.IsLess(baseY) == extendEnd.Y.IsThan(baseY))
|
|
|
- {
|
|
|
- if (!extendStart.Y.IsEqual(baseY) && !extendEnd.Y.IsEqual(baseY))
|
|
|
- {
|
|
|
- isEven = !isEven;
|
|
|
- }
|
|
|
- }
|
|
|
- #endregion
|
|
|
+ PointGroup.AddGroup(groups, new PointGroup() { start, end });
|
|
|
+
|
|
|
}
|
|
|
#endregion
|
|
|
}
|
|
@@ -1759,11 +1745,11 @@ namespace SAGA.RevitUtils.Extends
|
|
|
var intersectionPoint = new XYZ(useX, baseY,0);
|
|
|
if (start.IsEqual(intersectionPoint))
|
|
|
{
|
|
|
- points.Add(start);
|
|
|
+ PointGroup.AddGroup(groups, new PointGroup() { start });
|
|
|
}
|
|
|
else if (end.IsEqual(intersectionPoint))
|
|
|
{
|
|
|
- points.Add(end);
|
|
|
+ PointGroup.AddGroup(groups, new PointGroup() { end });
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1775,10 +1761,32 @@ namespace SAGA.RevitUtils.Extends
|
|
|
}
|
|
|
}
|
|
|
//整理通过的端点
|
|
|
- var validPoints = points.Distinct(new XyzEqualComparer());
|
|
|
- if (validPoints.Count() % 2 == 1)
|
|
|
+ if (groups.Any())
|
|
|
{
|
|
|
- isEven = !isEven;
|
|
|
+ foreach (var group in groups)
|
|
|
+ {
|
|
|
+ var usePoint = group.FirstOrDefault();
|
|
|
+ var refLines = lines.Where(l => LineUtil.GetPosition(l, usePoint) != -1).ToList();
|
|
|
+ if (refLines.Count < 2)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<double> results = new List<double>();
|
|
|
+ foreach (Line line in refLines)
|
|
|
+ {
|
|
|
+ List<Line> useLines = new List<Line>(lines);
|
|
|
+ useLines.Remove(line);
|
|
|
+ var extendPoint = LineUtil.GetFirstPoint(useLines, usePoint, p => !p.Y.IsEqual(usePoint.Y));
|
|
|
+ results.Add(extendPoint.Y);
|
|
|
+ }
|
|
|
+ if (results[0].IsLess(baseY) == results[1].IsThan(baseY))
|
|
|
+ {
|
|
|
+ if (!results[0].IsEqual(baseY) && !results[1].IsEqual(baseY))
|
|
|
+ {
|
|
|
+ isEven = !isEven;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
return isEven ? -1 : 1;
|
|
|
}
|