明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 440|回复: 2

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

[复制链接]
发表于 2024-6-25 09:00:45 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2024-6-25 09:19 编辑

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

  16. /// <summary>
  17. /// 判断给定角度在匹配的集合中是否存在容差范围内的匹配项
  18. /// </summary>
  19. /// <param name="angle">给定角度</param>
  20. /// <param name="angles">匹配的集合</param>
  21. /// <param name="tolerance">容差</param>
  22. /// <param name="matchedAngle">匹配项</param>
  23. /// <returns>存在返回:true,否则返回:false</returns>
  24. public static bool IsWithInSet(this double angle, List<double> angles, double tolerance, out double matchedAngle)
  25. {
  26.     // 先对角度集合进行排序
  27.     angles.Sort();
  28.     // 用默认值表示未找到匹配项
  29.     matchedAngle = double.NaN;
  30.     // 检查相邻角度之间是否有重叠
  31.     for (int i = 1; i < angles.Count; i++)
  32.     {
  33.         if (angles - angles[i - 1] < 2 * tolerance)
  34.         {
  35.             //Console.WriteLine("给定集合和容差范围存在重叠。");
  36.             return false; // 存在重叠,直接返回
  37.         }
  38.     }

  39.     // 没有重叠,检查ang是否在集合中的角度的容差范围内
  40.     foreach (var ang in angles)
  41.     {
  42.         if (angle.IsWithInTo(ang, tolerance))
  43.         {
  44.             //Console.WriteLine($"角度{ang}在集合中的角度{angle}的容差范围内。");
  45.             matchedAngle = ang; // 找到匹配的角度
  46.             return true;
  47.         }
  48.     }
  49.     //没有找到匹配的角度
  50.     matchedAngle = double.NaN;
  51.     return false;
  52. }


测试及辅助方法:
  1. /// <summary>
  2. /// 角度转换为[0,360]的角度值
  3. /// </summary>
  4. /// <param name="degree">角度值</param>
  5. /// <returns>[0,360]的角度值</returns>
  6. public static double AngTo0To360(this double degree)
  7. {
  8.     if (degree == 0) return 0;
  9.     else if (degree % 360 == 0) return 360;
  10.     else
  11.     {
  12.         // 调整至0到360区间
  13.         degree %= 360;
  14.         return degree < 0 ? degree += 360 : degree;
  15.     }
  16. }

  17. /// <summary>
  18. /// 测试命令Tt
  19. /// </summary>
  20. [CommandMethod(nameof(Tt), CommandFlags.Session | CommandFlags.UsePickSet)]
  21. public void Tt()
  22. {
  23.     var db = HostApplicationServices.WorkingDatabase;
  24.     db.TrStart((tr, ed) =>
  25.     {
  26.         var ppr = ed.GetPointEx("\n指定起始点");
  27.         if (ppr.Status != PromptStatus.OK) return;
  28.         var jigBls = new JigBls("\n指定结束点", ppr.Value,
  29.          (jppr, entities) =>
  30.          {
  31.              var point = jppr.Value;
  32.              var ang = ppr.Value.GetAngle(point);
  33.              if (ang.IsWithInSet([0, 45, 90, 135, 180, 225, 270, 315], 15, out double matchang))
  34.              {
  35.                  $"当前角度:{ang};匹配到:{matchang}".PrintLine();
  36.              }
  37.              //entities.Enqueue();
  38.          });
  39.         var jigPr = ed.Drag(jigBls);
  40.     });
  41. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-25 09:29:11 | 显示全部楼层
难得有c#的源码,多多益善。
 楼主| 发表于 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)


当然多多益善了,也得大家多多支持啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 02:54 , Processed in 0.149211 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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