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
难得有c#的源码,多多益善。 本帖最后由 fangmin723 于 2024-6-25 09:50 编辑
jun353835273 发表于 2024-6-25 09:29
难得有c#的源码,多多益善。
可以去使用ifoxcad啊,难道ifoxcad不香么
IFoxCAD: 基于.NET的Cad二次开发类库 (gitee.com)
当然多多益善了,也得大家多多支持啊
页:
[1]