C#使用GraphicsPath绘制IEEE标准OR逻辑门出错该如何解决?
C# 绘制IEEE标准OR门的问题修正
现有代码的核心问题
- 大量使用硬编码的固定像素值(如
1、16、-4、固定角度参数),没有和控件高度iHeight做比例绑定,无法适配不同控件尺寸,也不符合IEEE标准的等比要求 - 左侧内凹弧的拼接逻辑错误:你当前用两个参数不匹配的圆弧拼接,角度和外接矩形没有对齐,导致拼接处出现突兀拐点,无法形成平滑的内凹轮廓
- 圆弧的圆心、半径参数不符合IEEE标准比例:标准OR门宽高比约为1:1,右侧外凸弧半径等于门体高度的1/2,左侧内凹弧的圆心位于门体左侧外部,半径等于门体整体高度
修正后的实现代码
你可以参考以下适配比例的实现,所有参数均和iHeight绑定,严格匹配IEEE标准比例:
Pen pen = new Pen(Color.Black, 2); GraphicsPath pathOR = new GraphicsPath(); float width = iHeight; // 宽高比1:1符合IEEE标准 float radiusRight = iHeight / 2; // 右侧圆弧半径为高度的1/2 float radiusLeft = iHeight; // 左侧凹弧半径等于整体高度 // 上半部分左侧弧 pathOR.AddArc(-radiusLeft, 0, radiusLeft * 2, radiusLeft * 2, 270, 30); // 上边缘直线 pathOR.AddLine(radiusLeft * (float)Math.Sin(Math.PI / 6), 0, width - radiusRight, 0); // 右侧凸弧 pathOR.AddArc(width - radiusRight * 2, 0, radiusRight * 2, radiusRight * 2, 270, 180); // 下边缘直线 pathOR.AddLine(width - radiusRight, iHeight, radiusLeft * (float)Math.Sin(Math.PI / 6), iHeight); // 下半部分左侧弧 pathOR.AddArc(-radiusLeft, -iHeight, radiusLeft * 2, radiusLeft * 2, 60, 30); pathOR.CloseAllFigures(); e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 开启抗锯齿避免边缘锯齿 e.Graphics.DrawPath(pen, pathOR);
额外优化建议
- 所有坐标、角度参数都用比例计算,不要写死固定像素值,避免控件缩放时图案变形
- 可以把宽高比、圆弧角度作为可配置参数,方便后续适配其他逻辑门的绘制需求
内容的提问来源于stack exchange,提问作者Marcelo C.
相关产品推荐
相关产品推荐

