C#中基于netDxf库过滤多余Arc对象的问题排查
解决netDxf转换DXF到Bitmap时出现固定参数多余Arc的问题
在使用netDxf库将DXF文件转换为Bitmap时,无论处理哪个文件都会出现参数完全相同的多余Arc对象。我编写的Arc处理代码如下:
else if (entity is Arc arc) { double sweepAngle = arc.EndAngle - arc.StartAngle; arc.EndAngle = sweepAngle; entityInfo = $"Processing Arc: Start Angle=({arc.StartAngle}), End Angle=({arc.EndAngle}), Radius={arc.Radius}, Sweep Angle =({sweepAngle})"; graphics.DrawArc(Pens.Black, (float)(arc.Center.X - arc.Radius), (float)(arc.Center.Y - arc.Radius), (float)(2 * arc.Radius), (float)(2 * arc.Radius), (float)arc.StartAngle, (float)arc.EndAngle); }
我尝试用if (arc.StartAngle == 270.565033310363) return ;过滤该多余Arc,但判断未生效,需要可行的解决方法。
问题原因及解决办法
- 浮点数精度问题导致判断失效
double类型的数值存在微小精度误差,比如实际的arc.StartAngle可能是270.56503331036302,直接用==判断会因为精度差不匹配。改用误差范围判断:
// 设定极小阈值(如1e-8),判断差值绝对值是否小于阈值 if (Math.Abs(arc.StartAngle - 270.565033310363) < 1e-8) return;
- 避免修改原Arc对象属性
代码中arc.EndAngle = sweepAngle会修改原Arc的属性,可能干扰后续逻辑或判断。建议用临时变量存储计算值:
else if (entity is Arc arc) { double sweepAngle = arc.EndAngle - arc.StartAngle; // 用临时变量存储绘制用的角度,不修改原对象 double drawEndAngle = sweepAngle; entityInfo = $"Processing Arc: Start Angle=({arc.StartAngle}), End Angle=({arc.EndAngle}), Radius={arc.Radius}, Sweep Angle =({sweepAngle})"; graphics.DrawArc(Pens.Black, (float)(arc.Center.X - arc.Radius), (float)(arc.Center.Y - arc.Radius), (float)(2 * arc.Radius), (float)(2 * arc.Radius), (float)arc.StartAngle, (float)drawEndAngle); }
- 多维度精准过滤
如果单一角度判断仍有问题,可以结合Arc的多个属性(如Center坐标、Radius、图层名称)共同判断,避免误过滤:
double targetAngle = 270.565033310363; double targetRadius = 你的目标半径值; Vector2 targetCenter = new Vector2(你的目标中心X, 你的目标中心Y); if (Math.Abs(arc.StartAngle - targetAngle) < 1e-8 && Math.Abs(arc.Radius - targetRadius) < 1e-8 && Math.Abs(arc.Center.X - targetCenter.X) < 1e-8 && Math.Abs(arc.Center.Y - targetCenter.Y) < 1e-8) { return; }
内容的提问来源于stack exchange,提问作者Martins
相关产品推荐
相关产品推荐

