当前位置: 首页 > news >正文

C#绘制阻抗圆图初步

阻抗圆图,或者叫史密斯图,是无线电设计方面用的;

基本的阻抗圆图如下,

下面尝试用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);}#endregionpublic 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;}

看了一点资料,这图上都是圆;曲线的那几根是圆弧,是圆的一部分;

把圆在脑子里想出来,按照C#画弧的方式,只画出圆的一部分;加上如下四句画弧的代码,

            g.DrawArc(new Pen(Brushes.Black, 1), centerX,centery-scr1*2, scr1*2,scr1*2,  90, 90);g.DrawArc(new Pen(Brushes.Black, 1), centerX, centery, scr1 * 2, scr1 * 2, 180, 90);g.DrawArc(new Pen(Brushes.Black, 1), centerX-scr1/2, centery-scr2*3, scr2 * 3, scr2 * 3, 90, 78);g.DrawArc(new Pen(Brushes.Black, 1), centerX - scr1 / 2, centery, scr2 * 3, scr2 * 3, 192, 78);

效果如下,

还没完全理解它的规律;

所取的画弧的正方形的边长分别是scr1 * 2,   scr2*3,转78的角度也是大致试出来的;

scr1是最大圆的半径,scr2是第二大圆的半径;

g.DrawArc()的第一个参数是画笔,接下来2个参数是画弧参照正方形的左上角x和y坐标,再接下来2个参数是正方形的长和宽,然后是画弧的起始角度,最后一个参数是需要画多大的角度;

相关文章:

C#绘制阻抗圆图初步

阻抗圆图&#xff0c;或者叫史密斯图&#xff0c;是无线电设计方面用的&#xff1b; 基本的阻抗圆图如下&#xff0c; 下面尝试用C#能不能画一下&#xff1b; 先在网上找一个画坐标的C#类&#xff0c;它的效果如下&#xff1b; 自己再增加一个函数&#xff0c;可以绘制中心在…...

【STC89C51单片机】定时器/计数器的理解

目录 定时器/计数器1. 定时器怎么定时简单理解&#xff08;加1经过了多少时间&#xff09;什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器&#xff08;Timers and Counter…...

数据建模标准-关系建模

数据模型定义&#xff1a;DAMA数据治理体系中将数据模型定义为一种文档形式&#xff0c;数据模型是用来将数据需求从业务传递到IT,以及在IT内部从分析师、建模师和架构师到数据库设计人员和开发人员的主要媒介&#xff1b; 作用&#xff1a;记录数据需求和建模过程中产生的数据…...

Qt日志库QsLog使用教程

前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库&#xff0c;这个库有个麻烦的点是要配置config文件&#xff0c;所以这次切换到了QsLog。用了后这个库的感受是&#xff0c;比较轻量级&#xff0c;嘎嘎好用&#xff0c;推荐一波。 下载QsLog库 https://github.c…...

07. Hibernate 会话工厂(SessionFactory)

1. 前言 Hibernate 的核心价值观是&#xff1a;开发者们&#xff01;做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一&#xff1a;会话工厂&#xff08;SessionFactory&#xff09;。 通过本节课&#xff0c;你…...

使用Nginx实现高效负载均衡

概述 Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;广泛用于Web服务的负载均衡。它能有效分发流量至多个后端服务器&#xff0c;提高网站的可用性和响应速度&#xff0c;同时增强系统的可扩展性和安全性。本文将介绍如何配置Nginx进行负载均衡&#xff0c;并提供具体的…...

华为OD机考题(基础API)

基础API 字典排序 List<String> listnew ArrayList(); //add list member Arrays.sort(list);List<Map<String,Integer>> listnew ArrayList(); //add list member Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {Over…...

<数据集>UA-DETRAC车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;20500张 标注数量(xml文件个数)&#xff1a;20500 标注数量(txt文件个数)&#xff1a;20500 标注类别数&#xff1a;4 标注类别名称&#xff1a;[car, van, others, bus] 序号类别名称图片数框数1car201871259342…...

学生管理系统(C语言)(Easy-x)

课 程 报 告 课 程 名 称&#xff1a; 程序设计实践 专 业 班 级 &#xff1a; XXXXX XXXXX 学 生 姓 名 &#xff1a; XXX 学 号 &#xff1a; 231040700302 任 课 教 师 &a…...

C# 解析省份、城市、区域 json文件

一、json文件内容如下&#xff0c;&#xff08;小程序里好像有用到...&#xff09;: 二、读取包含省份城市区域的json文件&#xff0c;并整理成想要的结果&#xff1a; string path Server.MapPath("/js"); string file System.IO.Path.Combine(path, "数据.…...

用C语言写的一个扫雷小游戏

头文件 调用头文件和声明函数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2#define EASY_CONT 10//声明函数 //初始化棋盘函数 void InitB…...

C++——类和对象(初始化列表和运算符重载与静态与友元)

文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员&#xff1a; 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…...

【WPF】图片剪裁-ImageCropping

【WPF】图片剪裁-ImageCropping 背景技术栈实现思路核心代码界面布局Style处理逻辑使用技巧预览下载背景 机缘巧合吧,当时在全网寻找图像剪裁工具,但大都不能满足需求,于是决定动手写。当然如果只是为了完成这么一个功能就没有必要记录了,主要是不依赖与第三方图像库,且实…...

C++的模板(十二):forward模板

标准库的std::forward模板有一个类型T参数。在实际使用时&#xff0c;T取什么值应该不存在疑惑&#xff1a; class A { public:A() {}A(int n):n(n) {}template <class T> A(T &&a);void print(A &&a) { printf("A&&\n"); }void pri…...

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…...

Ubuntu系统成功安装Docker教程

服务器版本&#xff1a; Ubuntu 22.04.3 LTS 1. 卸载旧版本 Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;需要卸载&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc2. 更新 apt 软件包 …...

C++ 匹配并提取包括加中括号的日期时间的正则表达式

在C中&#xff0c;你可以使用std::regex库来匹配包含日期和时间的字符串。以下是一个简单的例子&#xff0c;它展示了如何使用正则表达式来匹配形如[YYYY-MM-DD HH:MM:SS]的字符串。include <iostream> #include <string> #include <regex> int main() { …...

一文-深入了解Ansible常见模块、安装和部署

1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的&#xff08;集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点&#xff09;自动化运维工具, 其功能实现基于ss…...

etcd的备份与恢复

一 为什么使用etcd 与ZooKeeper相比&#xff0c;etcd更简单&#xff0c;安装、部署和使用更加容易&#xff0c;并且etcd的某些功能是ZooKeeper所没有的。因此&#xff0c;在很多场景下&#xff0c;etcd 比ZooKeeper更受用户的青&#xff0c;具体表现在如下几个方面: 1 etcd更…...

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起&#xff0c;这些库的受欢迎程度呈指数级增长。 在这篇文章中&#xff0c;我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...