- UID
- 735305
- 积分
- 32
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2014-8-6
- 最后登录
- 1970-1-1
|
发表于 2014-8-29 16:35:50
|
显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-29 19:02 编辑
应该是最终版了吧,,,基本修正了Bug 封闭曲线起点断开的问题也解决了
 - public static bool IsEqual(this Tolerance tol,double d1, double d2)
- {
- return Math.Abs(d1 - d2) < tol.EqualPoint;
- }
- public static List<CompositeCurve3d> GetSplitCurves(this CompositeCurve3d c3d, List<double> pars)
- {
- Interval inter = c3d.GetInterval();
- Curve3d[] c3ds = c3d.GetCurves();
- pars.Sort();
- for (int i = pars.Count - 1; i > 0; i--)
- {
- if (Tolerance.Global.IsEqual(pars[i],pars[i - 1]))
- pars.RemoveAt(i);
- }
- if (pars.Count == 0)
- return new List<CompositeCurve3d>();
- if (c3ds.Length == 1 && c3ds[0].IsClosed())
- {
- //闭合曲线不允许打断于一点
- if (pars.Count > 1)
- {
- //如果包含起点
- if (Tolerance.Global.IsEqual(pars[0], inter.LowerBound))
- {
- pars[0] = inter.LowerBound;
- //又包含终点,去除终点
- if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
- {
- pars.RemoveAt(pars.Count - 1);
- if (pars.Count == 1)
- return new List<CompositeCurve3d>();
- }
- }
- else if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
- {
- pars[pars.Count - 1] = inter.UpperBound;
- }
- //加入第一点以支持反向打断
- pars.Add(pars[0]);
- }
- else
- {
- return new List<CompositeCurve3d>();
- }
- }
- else
- {
- //非闭合曲线加入起点和终点
- if (Tolerance.Global.IsEqual(pars[0], inter.LowerBound))
- pars[0] = inter.LowerBound;
- else
- pars.Insert(0, inter.LowerBound);
- if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
- pars[pars.Count - 1] = inter.UpperBound;
- else
- pars.Add(inter.UpperBound);
- }
-
-
- List<CompositeCurve3d> curves = new List<CompositeCurve3d>();
- for (int i = 0; i < pars.Count - 1; i++)
- {
- List<Curve3d> cc3ds = new List<Curve3d>();
- //复合曲线参数转换到包含曲线参数
- CompositeParameter cp1 = c3d.GlobalToLocalParameter(pars[i]);
- CompositeParameter cp2 = c3d.GlobalToLocalParameter(pars[i + 1]);
- if (cp1.SegmentIndex == cp2.SegmentIndex)
- {
- cc3ds.Add(
- c3ds[cp1.SegmentIndex].GetSubCurve(
- cp1.LocalParameter,
- cp2.LocalParameter));
- }
- else
- {
- inter = c3ds[cp1.SegmentIndex].GetInterval();
- cc3ds.Add(
- c3ds[cp1.SegmentIndex].GetSubCurve(
- cp1.LocalParameter,
- inter.UpperBound));
- for (int j = cp1.SegmentIndex + 1; j < cp2.SegmentIndex; j++)
- {
- cc3ds.Add((Curve3d)c3ds[j].Clone());
- }
- inter = c3ds[cp2.SegmentIndex].GetInterval();
- cc3ds.Add(
- c3ds[cp2.SegmentIndex].GetSubCurve(
- inter.LowerBound,
- cp2.LocalParameter));
- }
- curves.Add(new CompositeCurve3d(cc3ds.ToArray()));
- }
- if (c3d.IsClosed() && c3ds.Length > 1)
- {
- var cs = curves[curves.Count - 1].GetCurves().ToList();
- cs.AddRange(curves[0].GetCurves());
- curves[curves.Count - 1] = new CompositeCurve3d(cs.ToArray());
- curves.RemoveAt(0);
- }
- return curves;
- }
 - public static Curve3d GetSubCurve(this Curve3d curve, double from, double to)
- {
- Interval inter = curve.GetInterval();
- bool atStart = Tolerance.Global.IsEqual(inter.LowerBound, from);
- bool atEnd = Tolerance.Global.IsEqual(inter.UpperBound, to);
- if (atStart && atEnd)
- return (Curve3d)curve.Clone();
- if (curve is NurbCurve3d)
- {
-
- if (from < to)
- {
- NurbCurve3d clone = (NurbCurve3d)curve.Clone();
- if (atStart || atEnd)
- {
- clone.HardTrimByParams(from, to);
- return clone;
- }
- else
- {
- clone.HardTrimByParams(inter.LowerBound, to);
- clone.HardTrimByParams(from, to);
- return clone;
- }
- }
- else
- {
- NurbCurve3d clone1 = (NurbCurve3d)curve.Clone();
- clone1.HardTrimByParams(from, inter.UpperBound);
- NurbCurve3d clone2 = (NurbCurve3d)curve.Clone();
- clone2.HardTrimByParams(inter.LowerBound, to);
- clone1.JoinWith(clone2);
- return clone1;
- }
- }
- else
- {
- Curve3d clone = (Curve3d)curve.Clone();
- clone.SetInterval(new Interval(from, to, 0));
- return clone;
- }
- }
|
|