阻抗圆图,或者叫史密斯图,是无线电设计方面用的;
基本的阻抗圆图如下,
下面尝试用C#能不能画一下;
先在网上找一个画坐标的C#类,它的效果如下;
自己再增加一个函数,可以绘制中心在画布中心的坐标系;
看一下基本的阻抗圆图,它有4个圆;先把4个圆画一下如下,
那几条曲线不知道怎么画,不知道是什么曲线,用什么函数描述; 有时间继续;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace commengineer
{
public static class XYlinesFactory
{
#region 画出X轴与Y轴
/// <summary>
/// 在任意的panel里画一个坐标,坐标所在的四边形距离panel边50像素
/// </summary>
/// <param name="pan"></param>
public static void DrawXY(Panel pan)
{
Graphics g = pan.CreateGraphics();
//整体内缩move像素
float move = 50f;
float newX = pan.Width - move;
float newY = pan.Height - move;
//绘制X轴,
PointF px1 = new PointF(move, newY);
PointF px2 = new PointF(newX, newY);
g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
//绘制Y轴
PointF py1 = new PointF(move, move);
PointF py2 = new PointF(move, newY);
g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
}
#endregion
public static void DrawCXY(Panel pan)
{
Graphics g = pan.CreateGraphics();
//整体内缩move像素
float move = 50f;
float newX = pan.Width - move;
float newY = pan.Height - move;
float x1 = move / 2;
float x2 = move / 2 + newX;
float y1 = newY / 2 + move/2;
PointF p1 = new PointF(x1, y1);
PointF p2 = new PointF(x2, y1);
PointF p3 = new PointF(move/2 + newX/2, move/2);
PointF p4 = new PointF(move / 2 + newX / 2, pan.Height - move/2);
g.DrawLine(new Pen(Brushes.Black, 1), p1, p2);
g.DrawLine(new Pen(Brushes.Black, 1), p3, p4);
}
public static void DrawSmithCircle(Panel pan)
{
Graphics g = pan.CreateGraphics();
float bound = 50f;
float centerX = pan.Width / 2;
float centery = pan.Height / 2;
float scr1 = ((pan.Width - bound) /2) * 0.8f;
float scr2 = (scr1 + scr1 / 2) / 2;
float scr3 = scr1 / 2;
float scr4 = scr3 / 2;
//float r1 = ((pan.Width - 50f) / 2) * 0.8f;
//GraphicsPath circlePath = new GraphicsPath();
//circlePath.AddEllipse(pan.Width/2, pan.Height/2, r1, r1);
// 设置画笔和填充色
//Brush brush = Brushes.Blue;
// 绘制圆
g.DrawEllipse(new Pen(Brushes.Black, 1), centerX - scr1, centery - scr1, scr1*2, scr1*2);
g.DrawEllipse(new Pen(Brushes.Black, 1), centerX - scr1/2, centery - scr2, scr2 * 2, scr2 * 2);
g.DrawEllipse(new Pen(Brushes.Black, 1), centerX, centery - scr3, scr3 * 2, scr3 * 2);
g.DrawEllipse(new Pen(Brushes.Black, 1), centerX+scr3, centery - scr4, scr4 * 2, scr4 * 2);
//g.FillPath(brush, circlePath);
}
/// <summary>
/// 画出Y轴上的分值线,从零开始
/// </summary>
/// <param name="pan"></param>
/// <param name="maxY"></param>
/// <param name="len"></param>
#region 画出Y轴上的分值线,从零开始
public static void DrawYLine(Panel pan, float maxY, int len)
{
float move = 50f;
float LenX = pan.Width - 2 * move;
float LenY = pan.Height - 2 * move;
Graphics g = pan.CreateGraphics();
for (int i = 0; i <= len; i++) //len等份Y轴
{
PointF px1 = new PointF(move, LenY * i / len + move);
PointF px2 = new PointF(move + 4, LenY * i / len + move);
string sx = (maxY - maxY * i / len).ToString();
g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = StringAlignment.Far;
drawFormat.LineAlignment = StringAlignment.Center;
g.DrawString(sx, new Font("宋体", 8f), Brushes.Black, new PointF(move / 1.2f, LenY * i / len + move * 1.1f), drawFormat);
}
Pen pen = new Pen(Color.Black, 1);
g.DrawString("Y轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(move / 3, move / 2f));
}
#endregion
/// <summary>
/// 画出Y轴上的分值线,从任意值开始
/// </summary>
/// <param name="pan"></param>
/// <param name="minY"></param>
/// <param name="maxY"></param>
/// <param name="len"></param>
#region 画出Y轴上的分值线,从任意值开始
public static void DrawYLine(Panel pan, float minY, float maxY, int len)
{
float move = 50f;
float LenX = pan.Width - 2 * move;
float LenY = pan.Height - 2 * move;
Graphics g = pan.CreateGraphics();
for (int i = 0; i <= len; i++) //len等份Y轴
{
PointF px1 = new PointF(move, LenY * i / len + move);
PointF px2 = new PointF(move + 4, LenY * i / len + move);
string sx = (maxY - (maxY - minY) * i / len).ToString();
g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = StringAlignment.Far;
drawFormat.LineAlignment = StringAlignment.Center;
g.DrawString(sx, new Font("宋体", 8f), Brushes.Black, new PointF(move / 1.2f, LenY * i / len + move * 1.1f), drawFormat);
}
Pen pen = new Pen(Color.Black, 1);
g.DrawString("Y轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(move / 3, move / 2f));
}
#endregion
/// <summary>
/// 画出X轴上的分值线,从零开始
/// </summary>
/// <param name="pan"></param>
/// <param name="maxX"></param>
/// <param name="len"></param>
#region 画出X轴上的分值线,从零开始
public static void DrawXLine(Panel pan, float maxX, int len)
{
float move = 50f;
float LenX = pan.Width - 2 * move;
float LenY = pan.Height - 2 * move;
Graphics g = pan.CreateGraphics();
for (int i = 1; i <= len; i++)
{
PointF py1 = new PointF(LenX * i / len + move, pan.Height - move - 4);
PointF py2 = new PointF(LenX * i / len + move, pan.Height - move);
string sy = (maxX * i / len).ToString();
g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
g.DrawString(sy, new Font("宋体", 8f), Brushes.Black, new PointF(LenX * i / len + move, pan.Height - move / 1.1f));
}
Pen pen = new Pen(Color.Black, 1);
g.DrawString("X轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(pan.Width - move / 1.5f, pan.Height - move / 1.5f));
}
#endregion
#region 画出X轴上的分值线,从任意值开始
/// <summary>
/// 画出X轴上的分值线,从任意值开始
/// </summary>
/// <param name="pan"></param>
/// <param name="minX"></param>
/// <param name="maxX"></param>
/// <param name="len"></param>
public static void DrawXLine(Panel pan, float minX, float maxX, int len)
{
float move = 50f;
float LenX = pan.Width - 2 * move;
float LenY = pan.Height - 2 * move;
Graphics g = pan.CreateGraphics();
for (int i = 0; i <= len; i++)
{
PointF py1 = new PointF(LenX * i / len + move, pan.Height - move - 4);
PointF py2 = new PointF(LenX * i / len + move, pan.Height - move);
string sy = ((maxX - minX) * i / len + minX).ToString();
g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
g.DrawString(sy, new Font("宋体", 8f), Brushes.Black, new PointF(LenX * i / len + move, pan.Height - move / 1.1f));
}
Pen pen = new Pen(Color.Black, 1);
g.DrawString("X轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(pan.Width - move / 1.5f, pan.Height - move / 1.5f));
}
#endregion
}
}
调用代码;
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
//XYlinesFactory.DrawXY(panel1);
//XYlinesFactory.DrawXLine(panel1, 100.00f, 12);
//XYlinesFactory.DrawYLine(panel1, 100.00f, 12);
XYlinesFactory.DrawCXY(panel1);
XYlinesFactory.DrawSmithCircle(panel1);
}
private void Form8_Load(object sender, EventArgs e)
{
panel1.Width = 600;
panel1.Height = 600;
}