fangmin723 发表于 2024-6-25 09:00:45

CAD.Net 判断角度是否在匹配角度的容差范围内

本帖最后由 fangmin723 于 2024-6-25 09:19 编辑

关键方法:
/// <summary>
/// 判断给定角度是否在匹配角度的容差范围内
/// </summary>
/// <param name="angle">给定角度</param>
/// <param name="matchangle">匹配角度</param>
/// <param name="tolerance">容差</param>
/// <returns>在匹配角度的容差范围内返回:true,否则返回:false</returns>
public static bool IsWithInTo(this double angle, double matchangle, double tolerance = 1e-8)
{
    var minang = (matchangle - tolerance).AngTo0To360();
    var maxang = (matchangle + tolerance).AngTo0To360();
    return minang > maxang
      ? (minang < angle && angle <= 360) || (0 <= angle && angle < maxang)
      : (minang < angle && angle < maxang);
}

/// <summary>
/// 判断给定角度在匹配的集合中是否存在容差范围内的匹配项
/// </summary>
/// <param name="angle">给定角度</param>
/// <param name="angles">匹配的集合</param>
/// <param name="tolerance">容差</param>
/// <param name="matchedAngle">匹配项</param>
/// <returns>存在返回:true,否则返回:false</returns>
public static bool IsWithInSet(this double angle, List<double> angles, double tolerance, out double matchedAngle)
{
    // 先对角度集合进行排序
    angles.Sort();
    // 用默认值表示未找到匹配项
    matchedAngle = double.NaN;
    // 检查相邻角度之间是否有重叠
    for (int i = 1; i < angles.Count; i++)
    {
      if (angles - angles < 2 * tolerance)
      {
            //Console.WriteLine("给定集合和容差范围存在重叠。");
            return false; // 存在重叠,直接返回
      }
    }

    // 没有重叠,检查ang是否在集合中的角度的容差范围内
    foreach (var ang in angles)
    {
      if (angle.IsWithInTo(ang, tolerance))
      {
            //Console.WriteLine($"角度{ang}在集合中的角度{angle}的容差范围内。");
            matchedAngle = ang; // 找到匹配的角度
            return true;
      }
    }
    //没有找到匹配的角度
    matchedAngle = double.NaN;
    return false;
}

测试及辅助方法:

/// <summary>
/// 角度转换为的角度值
/// </summary>
/// <param name="degree">角度值</param>
/// <returns>的角度值</returns>
public static double AngTo0To360(this double degree)
{
    if (degree == 0) return 0;
    else if (degree % 360 == 0) return 360;
    else
    {
      // 调整至0到360区间
      degree %= 360;
      return degree < 0 ? degree += 360 : degree;
    }
}

/// <summary>
/// 测试命令Tt
/// </summary>

public void Tt()
{
    var db = HostApplicationServices.WorkingDatabase;
    db.TrStart((tr, ed) =>
    {
      var ppr = ed.GetPointEx("\n指定起始点");
      if (ppr.Status != PromptStatus.OK) return;
      var jigBls = new JigBls("\n指定结束点", ppr.Value,
         (jppr, entities) =>
         {
             var point = jppr.Value;
             var ang = ppr.Value.GetAngle(point);
             if (ang.IsWithInSet(, 15, out double matchang))
             {
               $"当前角度:{ang};匹配到:{matchang}".PrintLine();
             }
             //entities.Enqueue();
         });
      var jigPr = ed.Drag(jigBls);
    });
}
attach://135265.flv

jun353835273 发表于 2024-6-25 09:29:11

难得有c#的源码,多多益善。

fangmin723 发表于 2024-6-25 09:31:49

本帖最后由 fangmin723 于 2024-6-25 09:50 编辑

jun353835273 发表于 2024-6-25 09:29
难得有c#的源码,多多益善。
可以去使用ifoxcad啊,难道ifoxcad不香么
IFoxCAD: 基于.NET的Cad二次开发类库 (gitee.com)


当然多多益善了,也得大家多多支持啊
页: [1]
查看完整版本: CAD.Net 判断角度是否在匹配角度的容差范围内