明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: gsy5666

IntersectWith怎么排除多余的交点

[复制链接]
发表于 2022-4-24 17:24:38 | 显示全部楼层
你有种再说一遍 发表于 2022-4-22 05:40
首先是内存有极限,这个极限来自于双精度浮点数,
而曲线求交点是经过多次牛顿迭代来逼近交点,当逼近的时 ...

那就不平移,概率出错,留点bug🤣
回复

使用道具 举报

发表于 2024-9-20 09:26:20 | 显示全部楼层
IntersectWith 投影平面 Plane 参数的值应该输入什么
回复

使用道具 举报

发表于 2024-9-23 15:48:25 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-9-23 15:50 编辑
pmq 发表于 2024-9-20 09:26
IntersectWith 投影平面 Plane 参数的值应该输入什么

求交点函数的考虑了三维的.
投影的plan一般情况就是XOY平面的法向量vector.Z==(0,0,1)
回复

使用道具 举报

发表于 2025-2-24 20:16:42 | 显示全部楼层
  1.     /// <summary>
  2.     /// 获取两个曲线的交点集合(支持大坐标偏移优化)
  3.     /// </summary>
  4.     /// <param name="curve1">第一个曲线(线段或圆弧可延伸,多段线不可延伸)</param>
  5.     /// <param name="curve2">第二个曲线(线段或圆弧可延伸,多段线不可延伸)</param>
  6.     /// <param name="intersectOption">相交处理方式:
  7.     /// <para>OnBothOperands - 两者都不延伸</para>
  8.     /// <para>ExtendBoth - 两者都延伸</para>
  9.     /// <para>ExtendThis - 仅延伸当前曲线(curve1)</para>
  10.     /// <para>ExtendArgument - 仅延伸参数曲线(curve2)</para></param>
  11.     /// <returns>输出的交点集合</returns>
  12.     public static Point3dCollection GetInterPoint(
  13.         this Curve curve1,
  14.         Curve curve2,
  15.         Intersect intersectOption = Intersect.OnBothOperands)
  16.     {
  17.         var intersectionPoints = new Point3dCollection();

  18.         // 第一阶段:快速包围盒检查
  19.         var box1 = curve1.GeometricExtents;
  20.         var box2 = curve2.GeometricExtents;
  21.         
  22.         if (!box1.IsIntersect(box2))
  23.             return intersectionPoints;

  24.         var plan = new Plane(Point3d.Origin, Vector3d.ZAxis);
  25.         // 第二阶段:大坐标偏移处理
  26.         const double coordinateThreshold = 1e9; // 坐标偏移阈值

  27.         // 计算合并包围盒中心
  28.         var combinedBox = box1.CombinedBox(box2);

  29.         var centroid = combinedBox.GetCenterPoint();

  30.         // 判断是否需要坐标偏移
  31.         bool needTransform =
  32.             Math.Abs(centroid.X) > coordinateThreshold ||
  33.             Math.Abs(centroid.Y) > coordinateThreshold;

  34.         if (needTransform)
  35.         {
  36.             // 构建平移矩阵
  37.             Vector3d offset = -centroid.GetAsVector();
  38.             Matrix3d transform = Matrix3d.Displacement(offset);
  39.             Matrix3d inverseTransform = Matrix3d.Displacement(offset.Negate());

  40.             // 克隆并平移曲线
  41.             using Curve transCurve1 = (Curve)curve1.Clone();
  42.             using Curve transCurve2 = (Curve)curve2.Clone();
  43.             transCurve1.TransformBy(transform);
  44.             transCurve2.TransformBy(transform);

  45.             // 在平移后坐标系求交
  46.             var tempPoints = new Point3dCollection();
  47.             transCurve1.IntersectWith(
  48.                 transCurve2,
  49.                 intersectOption,
  50.                 plan,
  51.                 tempPoints,
  52.                 IntPtr.Zero,
  53.                 IntPtr.Zero);

  54.             // 坐标逆向转换
  55.             foreach (Point3d pt in tempPoints)
  56.             {
  57.                 intersectionPoints.Add(pt.TransformBy(inverseTransform));
  58.             }
  59.         }
  60.         else
  61.         {
  62.             // 直接求交
  63.             curve1.IntersectWith(
  64.                 curve2,
  65.                 intersectOption,
  66.                 plan,
  67.                 intersectionPoints,
  68.                 IntPtr.Zero,
  69.                 IntPtr.Zero);
  70.         }

  71.         return intersectionPoints;
  72.     }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-3-30 01:08 , Processed in 0.130459 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表