Vb.net 双圆弧渲染

Vb.net 双圆弧渲染,vb.net,graphics,gdi+,dxf,Vb.net,Graphics,Gdi+,Dxf,我正在创建一个DXF解析器,供工业机器人使用。机器人只能在直线和圆弧中移动,所以我不得不将椭圆实体分解成一系列的biarc,这要归功于圆弧函数。转换工作得很完美,但当我尝试在画布上绘制圆弧作为路径时,有些未对齐 我知道这些弧实际上是共切的,否则我的轮廓分组算法会使它们分开路径,所以这肯定是一个显示问题。我还手动检查了起点和终点,并确认了这一点。我还使用相同的方法导出了一系列BIARC,但是是通过SolidWorks手工导出的,并且遇到了相同的问题 这是表格上的输出图像,我在BIARC未对齐的地方

我正在创建一个DXF解析器,供工业机器人使用。机器人只能在直线和圆弧中移动,所以我不得不将椭圆实体分解成一系列的biarc,这要归功于圆弧函数。转换工作得很完美,但当我尝试在画布上绘制圆弧作为路径时,有些未对齐

我知道这些弧实际上是共切的,否则我的轮廓分组算法会使它们分开路径,所以这肯定是一个显示问题。我还手动检查了起点和终点,并确认了这一点。我还使用相同的方法导出了一系列BIARC,但是是通过SolidWorks手工导出的,并且遇到了相同的问题

这是表格上的输出图像,我在BIARC未对齐的地方画了一个圆圈:

这里是椭圆转换代码供参考,它只是对椭圆段进行2n次采样,其中n是所需的弧数。然后使用“3点圆弧”功能,为每组3个点绘制圆弧

公共函数Ellipse2DToArcsByVal中心点为XYZPoint,ByVal MajorRadius为Double,ByVal MinorRadius为Double,ByVal StartAngle为Double,ByVal EndAngle为Double,ByVal OffsetAngle为Double Dim PointList作为XYZPoint的新列表 Dim ArcList作为ShapeClasses.ArcClass的新列表 对于i=StartAngle到EndAngle步长EndAngle-StartAngle/My.Settings.EllipseApprox*2 PointList.ADDNOW XYZPoint带有{.X=中心点.X+MajorRadius*Math.Cosi*Math.CosOffsetAngle-MinorRadius*Math.Sini*Math.Sini*SinoOffsetAngle、.Y=中心点.Y+MajorRadius*Math.Cosi*Math.SinoOffsetAngle+MinorRadius*Math.Sini*Math.CosOffsetAngle} 下一个 对于i As UInteger=1到PointList.Count-2步骤2 尺寸D为Double=2*PointListi-1.X-PointListi+1.X*PointListi+1.Y-PointListi.Y+2*PointListi.X-PointListi+1.X*PointListi-1.Y-PointListi+1.Y 将M1的尺寸调整为Double=PointListi-1.X^2-PointListi+1.X^2+PointListi-1.Y^2-PointListi+1.Y^2 将M2的尺寸调整为Double=PointListi+1.X^2-PointListi.X^2+PointListi+1.Y^2-PointListi.Y^2 尺寸NX为Double=M1*PointListi+1.Y-PointListi.Y+M2*PointListi+1.Y-PointListi-1.Y Dim NY为Double=M1*PointListi.X-PointListi+1.X+M2*PointListi-1.X-PointListi+1.X 尺寸CX为双精度=NX/D 尺寸CY为双精度=NY/D ArcList.AddNew ShapeClasses.ArcClass带{.Radius=Math.SqrtCX-PointListi+1.X^2+CY-PointListi+1.Y^2、.CenterPoint=New XYZPoint带{.X=CX、.Y=CY}、.StartPoint=PointListi-1、.EndPoint=PointListi+1} 下一个 返回ArcList.ToArray 端函数 这是将圆弧对象转换为图形的代码,它存储为起点、终点、中心点和半径:

公共函数Arc2DToDrawByVal弧作为ShapeClasses.ArcClass '计算起始角 将StartAngle变为Single=Math.Atan2Arc.StartPoint.Y-Arc.CenterPoint.Y,Arc.StartPoint.X-Arc.CenterPoint.X*180/Math.PI '计算端角 将EndAngle标注为Single=Math.Atan2Arc.EndPoint.Y-Arc.CenterPoint.Y,Arc.EndPoint.X-Arc.CenterPoint.X*180/Math.PI 如果StartAngle=EndAngle,则“a”是一个圆 '359.99是一个防止在0和270之间形成和弦的乱码,为什么我不知道 Return{New System.Drawing.RectangleArc.CenterPoint.X-弧.半径,弧.中心点.Y-弧.半径,弧.半径*2,弧.半径*2,StartAngle,CSng359.99} 其他的 Return{New System.Drawing.RectangleArc.CenterPoint.X-弧.半径,弧.中心点.Y-弧.半径,弧.半径*2,弧.半径*2,StartAngle,-StartAngle-EndAngle} 如果结束 端函数 是否有解决此问题的方法,或者是固有的显示问题?

已解决:

问题是,我使用的是基于整数的矩形,而不是基于浮点的矩形,在绘制圆弧时,它会调用缩小转换

新系统。绘图。矩形弧。中心点。X-弧。半径,弧。中心点。Y-弧。半径,弧。半径*2,弧。半径*2 应改为:

新系统。绘图。矩形FARC。中心点。X-弧。半径,弧。中心点。Y-弧。半径,弧。半径*2,弧。半径*2
@谢谢你的清理工作。