你有种再说一遍 发表于 2022-4-24 17:24:38

你有种再说一遍 发表于 2022-4-22 05:40
首先是内存有极限,这个极限来自于双精度浮点数,
而曲线求交点是经过多次牛顿迭代来逼近交点,当逼近的时 ...

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

pmq 发表于 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)

wang2006zhi 发表于 2025-2-24 20:16:42

    /// <summary>
    /// 获取两个曲线的交点集合(支持大坐标偏移优化)
    /// </summary>
    /// <param name="curve1">第一个曲线(线段或圆弧可延伸,多段线不可延伸)</param>
    /// <param name="curve2">第二个曲线(线段或圆弧可延伸,多段线不可延伸)</param>
    /// <param name="intersectOption">相交处理方式:
    /// <para>OnBothOperands - 两者都不延伸</para>
    /// <para>ExtendBoth - 两者都延伸</para>
    /// <para>ExtendThis - 仅延伸当前曲线(curve1)</para>
    /// <para>ExtendArgument - 仅延伸参数曲线(curve2)</para></param>
    /// <returns>输出的交点集合</returns>
    public static Point3dCollection GetInterPoint(
      this Curve curve1,
      Curve curve2,
      Intersect intersectOption = Intersect.OnBothOperands)
    {
      var intersectionPoints = new Point3dCollection();

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

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

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

      var centroid = combinedBox.GetCenterPoint();

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

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

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

            // 在平移后坐标系求交
            var tempPoints = new Point3dCollection();
            transCurve1.IntersectWith(
                transCurve2,
                intersectOption,
                plan,
                tempPoints,
                IntPtr.Zero,
                IntPtr.Zero);

            // 坐标逆向转换
            foreach (Point3d pt in tempPoints)
            {
                intersectionPoints.Add(pt.TransformBy(inverseTransform));
            }
      }
      else
      {
            // 直接求交
            curve1.IntersectWith(
                curve2,
                intersectOption,
                plan,
                intersectionPoints,
                IntPtr.Zero,
                IntPtr.Zero);
      }

      return intersectionPoints;
    }
页: 1 [2]
查看完整版本: IntersectWith怎么排除多余的交点