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#绘制阻抗圆图初步
阻抗圆图,或者叫史密斯图,是无线电设计方面用的; 基本的阻抗圆图如下, 下面尝试用C#能不能画一下; 先在网上找一个画坐标的C#类,它的效果如下; 自己再增加一个函数,可以绘制中心在…...
【STC89C51单片机】定时器/计数器的理解
目录 定时器/计数器1. 定时器怎么定时简单理解(加1经过了多少时间)什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器(Timers and Counter…...
数据建模标准-关系建模
数据模型定义:DAMA数据治理体系中将数据模型定义为一种文档形式,数据模型是用来将数据需求从业务传递到IT,以及在IT内部从分析师、建模师和架构师到数据库设计人员和开发人员的主要媒介; 作用:记录数据需求和建模过程中产生的数据…...
Qt日志库QsLog使用教程
前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库,这个库有个麻烦的点是要配置config文件,所以这次切换到了QsLog。用了后这个库的感受是,比较轻量级,嘎嘎好用,推荐一波。 下载QsLog库 https://github.c…...
07. Hibernate 会话工厂(SessionFactory)
1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你…...
使用Nginx实现高效负载均衡
概述 Nginx是一款高性能的HTTP和反向代理服务器,广泛用于Web服务的负载均衡。它能有效分发流量至多个后端服务器,提高网站的可用性和响应速度,同时增强系统的可扩展性和安全性。本文将介绍如何配置Nginx进行负载均衡,并提供具体的…...
华为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车辆识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:20500张 标注数量(xml文件个数):20500 标注数量(txt文件个数):20500 标注类别数:4 标注类别名称:[car, van, others, bus] 序号类别名称图片数框数1car201871259342…...
学生管理系统(C语言)(Easy-x)
课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : XXXXX XXXXX 学 生 姓 名 : XXX 学 号 : 231040700302 任 课 教 师 &a…...
C# 解析省份、城市、区域 json文件
一、json文件内容如下,(小程序里好像有用到...): 二、读取包含省份城市区域的json文件,并整理成想要的结果: 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++——类和对象(初始化列表和运算符重载与静态与友元)
文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员: 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…...
【WPF】图片剪裁-ImageCropping
【WPF】图片剪裁-ImageCropping 背景技术栈实现思路核心代码界面布局Style处理逻辑使用技巧预览下载背景 机缘巧合吧,当时在全网寻找图像剪裁工具,但大都不能满足需求,于是决定动手写。当然如果只是为了完成这么一个功能就没有必要记录了,主要是不依赖与第三方图像库,且实…...
C++的模板(十二):forward模板
标准库的std::forward模板有一个类型T参数。在实际使用时,T取什么值应该不存在疑惑: 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教程
服务器版本: Ubuntu 22.04.3 LTS 1. 卸载旧版本 Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,需要卸载: sudo apt-get remove docker docker-engine docker.io containerd runc2. 更新 apt 软件包 …...
C++ 匹配并提取包括加中括号的日期时间的正则表达式
在C中,你可以使用std::regex库来匹配包含日期和时间的字符串。以下是一个简单的例子,它展示了如何使用正则表达式来匹配形如[YYYY-MM-DD HH:MM:SS]的字符串。include <iostream> #include <string> #include <regex> int main() { …...
一文-深入了解Ansible常见模块、安装和部署
1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ss…...
etcd的备份与恢复
一 为什么使用etcd 与ZooKeeper相比,etcd更简单,安装、部署和使用更加容易,并且etcd的某些功能是ZooKeeper所没有的。因此,在很多场景下,etcd 比ZooKeeper更受用户的青,具体表现在如下几个方面: 1 etcd更…...
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起,这些库的受欢迎程度呈指数级增长。 在这篇文章中,我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…...
【postgresql】pg_dump备份数据库
pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件,以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host:指定数据库服务器的主…...
服务器的80和443端口关闭也能申请SSL证书
一、简介 在服务器的80和443端口关闭的情况下,确实可以申请SSL证书,但申请过程和方法会根据证书类型和验证方式的不同而有所差异。 通常如果是网站域名申请SSL证书,哪怕服务器的80、443端口都打不开,也可以通过DNS解析的方式来验…...
Odoo17应用、模型、字段
新建最简应用 先启用开发人员模式。 新建一个没有菜单项的空壳应用(模块/插件): 必须至少包含 2 个文件: __manifest__.py 文件和文件 __init__.py 。 该 __init__.py 文件目前可以保持为空,我们将在下一章中返回。另一方面,该…...
Airtest的控制手机滑动位置偏差修正方法总结
提起Airtest的控制手机滑动位置,就会想起swipe,因为这种方法比较常见,对于没有精度控制的朋友完全够用, 我现在遇到精度控制时,大家都觉得精度不够,现在我对滑动精度控制,找到比较好的方法&…...
【机器学习】Grid Search: 一种系统性的超参数优化方法
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 Grid Search: 一种系统性的超参数优化方法引言什么是Grid Search?Gr…...
Laravel Passport:API认证的瑞士军刀
Laravel Passport:API认证的瑞士军刀 在现代Web应用中,API的安全认证是一个核心问题。Laravel Passport提供了一个全面的解决方案,用于构建OAuth2.0认证服务器。它使得API的认证变得简单而强大,支持多种认证方式,包括…...
SpringBoot Bean管理
我们知道可以通过Spring当中提供的注解Component以及它的三个衍生注解(Controller、Service、Repository)来声明IOC容器中的bean对象,同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象,也就是依赖注入DI。 本篇主要…...
Qt5.12.2安装教程
文章目录 文章介绍下载连接安装教程 文章介绍 安装Qt5.12.2 下载连接 点击官网下载 安装包下载完毕 安装教程 点开设置,添加临时储存库,复制连接“https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/” 点击测试࿰…...
2024年大数据高频面试题(中篇)
文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…...
Python编程工具PyCharm和Jupyter Notebook的使用差异
在编写Python程序时需要用到相应的编程工具,PyCharm和Jupyter Notebook是最常用2款软件。 PyCharm是很强大的综合编程软件,代码提示、代码自动补全、语法检验、文本彩色显示等对于新手来说实在太方便了,但在做数据分析时发现不太方便…...
想学企业管理课程/北京网站优化哪家好
试图编写一个程序来计算彼此相邻的匹配字母对的数量(“密西西比”包含3个)并输出该数字.不知道我做错了什么,但我必须使用字符串,while循环和变量作为代码的一部分.它似乎适用于第一行并输出3,然后抛出一个IndexError:字符串索引超出第二个字符串示例的范围.def cou…...
wordpress管理员独立地址/aso优化app推广
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://whatagoodboy.blogbus.com/logs/6619417.html MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder, andwhy?”。我觉得挺有意思的,也来凑个热闹。排名…...
使用二级域名会影响网站收录/seo排名优化培训价格
半个多月没学了,加班,私事,各种事。 链式哈希表用一个二维数组实现,一维存放桶索引,二维存放链表。 线性探测哈希表缺陷: 1 发生哈希冲突,靠近O(n)的时间复杂度,存储删除等操作变慢了…...
兼职做放单主持那个网站好/小红书搜索指数
在这之前,UWA在逻辑代码方面,可以反馈性能占用最为耗时的Top10函数运行效率,并配合运行截图快速了解它们的性能瓶颈,如下图所示。 我们都知道,这些函数中很可能包含了成百甚至上千行逻辑代码。比如,我们发现…...
使用vue做的商城网站/如何做网络销售平台
/** POJ 2488* DFS进行遍历就好,记录走过的路径,只要不重复地走过p*q个方格就行了(结束条件) */#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int Max 30; int kase;int p,q;int vi…...
对网站建设功能的情况说明/什么是seo
#-*- coding:utf-8 -*-#特征筛选的目标:一句话来说就是去冗余特征;与PCA不同,不会修改特征值,而是寻找那些对模型性能提升较大的少量特征#使用Titanic数据集,通过特征筛选的方法一步步提升决策树的预测性能import pand…...