Skip to main content

moregeek program

【vb.net】绘制管道接口圆环_vb.net课程的博客-多极客编程

图形绘制视频教程见《​​【VB.NET】二维图形绘制​​》

       假设我想在图纸上绘制一个管道接口处的圆环横截面图样,管道圆环接口的半径为220毫米,接口宽度为40毫米,接口上共有16个螺丝穿孔,穿孔圆环半径为15毫米,即绘制出如下的图形:

【VB.NET】绘制管道接口圆环_PI

        由以上图形分析后可以看到,绘制过程可以分为绘制一个半径为220像素(每像素对应一毫米)的大圆和16个半径为15像素的小圆。对于大圆我们可以通过调整绘制钢笔宽度为40像素来绘制;对于相同规格的小圆穿孔,我们可以先定义出共同的规格,然后通过16次图形位移变形来绘制。

1.首先建立一个Win Form窗体程序,在窗体的Paint事件处理程序中定义固定的常量值(假设我们要在图纸(60,60)处开始绘制这个大圆):

Const r1 As Integer = 220   '大环半径 
Const r2 As Integer = 15 '环孔半径
Const w As Integer = 40 '环宽
Const start As Integer = 60 '图纸绘制起点X和Y值

2.我们先绘制大圆。

       设置绘制钢笔颜色为黑色,宽度为环宽,钢笔对齐方式设置为居中对齐(居中为默认值,可以不用设置)。

Dim pen As New Pen(Color.Black, w)
pen.Alignment = PenAlignment.Center

       分析可得绘制大圆所需的矩形框宽高分别为400像素,即(r1-40/2)*2,起点为(60+20,60+20),所以绘制大圆的矩形可定义为:

Dim bigRect As New Rectangle(startXY + 20, startXY + 20,
(r1 - 20) * 2, (r1 - 20) * 2)

最后绘制出大圆的图形:

e.Graphics.DrawEllipse(pen, bigRect)

【VB.NET】绘制管道接口圆环_Math_02

3.我接着定义要绘制的小圆规格,为了便于画布的平移变形,我们先把小圆的圆心定义在图纸的左上角,即(0,0)这一点,所以要绘制的小圆的规格可写为:

Dim smallRect As New Rectangle(-r2, -r2, r2 * 2, r2 * 2)

如果绘制出来就是上图左上角显示的右下侧一小部分:

e.Graphics.DrawEllipse(Pens.Red, smallRect)

4.现在利用画布的平移变形,把小圆的圆心平移到大圆右侧的中间里面,即现在的圆心位置的p1X值为480,p1Y值为280:

Dim p1X As Single = bigRect.Width + (startXY + 20)
Dim p1Y As Single = CSng(bigRect.Height / 2) + (startXY + 20)
e.Graphics.TranslateTransform(p1X, p1Y)
e.Graphics.DrawEllipse(Pens.Red, smallRect)

        进行以上位置的平移变形后,绘制出来就是下图结果:

【VB.NET】绘制管道接口圆环_画布变形_03

5.绘制第二个穿孔小圆时,我们可以利用数学中的三角函数来计算。我们知道在一个直角三角形中,一个锐角的对边与直角三角形的斜边比率可以用此角的正弦值来表示(SinA=a/c),此角的直角边与斜边的比率可以用它的余弦值来表示(CosA=b/c)。因此在斜边和一个锐角已知的情况下,我们可以求得直角的两个直角边的长度:a = SinA*c,b=CosA*c。

【VB.NET】绘制管道接口圆环_Math_04

       而我们要绘制的16个小圆的圆心点位置,把大圆的整个圆心角(360°)分成了16个相同角度的锐角,我们知道对应360°圆心角的是2π,π在VB里是用System.Math.PI表示的,所以对于下图中第二个小圆的圆心(centerPointX,centerPointY)与第一个小圆的圆心(p1X,p1Y)之间对应的大圆的圆心角就为2π/16=π/8。i第二个小圆的圆心点坐标我们就可以这样求得:

Dim centerPointX As Single = 
CSng(bigRect.Width / 2 + (startXY + 20) +(r1 - 20) * Cos(PI / 8))
Dim centerpointY As Single =
CSng(bigRect.Height / 2 + (startXY + 20) + (r1 - 20) * Sin(PI / 8))

【VB.NET】绘制管道接口圆环_Transform_05

       将画布取消上次变形后,再将画布平移这个坐标值,绘制出的小圆就为上图中的第二个小圆位置:

e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(centerPointX, centerpointY)
e.Graphics.DrawEllipse(Pens.Red, smallRect)

6.根据以上,第一个小圆的圆心点坐标也可以三角函数来求得:

Dim p1X As Single = 
CSng(bigRect.Width / 2 + (startXY + 20) + (r1 - 20) * Cos(0))
Dim centerpointY As Single =
CSng(bigRect.Height / 2 + (startXY + 20) + (r1 - 20) * Sin(0))

      Cos(0)=1,Sin(0)=0,所以:

Dim p1X As Single = CSng(bigRect.Width / 2 + (r1 - 20) + (startXY + 20))
Dim p1Y As Single = CSng(bigRect.Height / 2 + (startXY + 20))

       r1-20就是bigRect.Width / 2,所以计算出的点(p1X,p1Y)与我们最初计算的值是一样的:

Dim p1X As Single = bigRect.Width + (startXY + 20)
Dim p1Y As Single = CSng(bigRect.Height / 2) + (startXY + 20)

       因此对于16个小圆的圆心点坐标,都可以根据它在大圆上对应的圆心角angle的值,表达为这样的计算公式:

Dim centerPointX As Single = 
CSng(bigRect.Width / 2 + (startXY + 20) +(r1 - 20) * Cos(angle))
Dim centerpointY As Single =
CSng(bigRect.Height / 2 + (startXY + 20) + (r1 - 20) * Sin(angle))

7.最后将画小圆变成填充小圆为白颜色,根据小圆圆心点的位置变化,利用一个For循环整理以上代码如下:

Imports System.Drawing.Drawing2D
Imports System.Math

Class Form1
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
Const r1 As Integer = 220 '大环半径
Const r2 As Integer = 15 '环孔半径
Const w As Integer = 40 '环宽
Const startXY As Integer = 60 '图纸绘制起点X和Y值

Dim bigRect As New Rectangle(startXY + 20, startXY + 20,
(r1 - 20) * 2, (r1 - 20) * 2)
Dim smallRect As New Rectangle(-r2, -r2, r2 * 2, r2 * 2)
Using pen As New Pen(Color.Black, w)
pen.Alignment = PenAlignment.Center
e.Graphics.DrawEllipse(pen, bigRect)
End Using

For angle As Single = 0 To 2 * PI Step PI / 8 '2π对应360°
Dim state As GraphicsState = e.Graphics.Save
Dim centerPointX As Single =
CSng(bigRect.Width / 2 + (startXY + 20) + (r1 - 20) * Cos(angle))
Dim centerpointY As Single =
CSng(bigRect.Height / 2 + (startXY + 20) + (r1 - 20) * Sin(angle))
e.Graphics.TranslateTransform(centerPointX, centerpointY)
e.Graphics.FillEllipse(Brushes.White, smallRect)
e.Graphics.Restore(state)
Next
End Sub
End Class

       绘制出的图形边缘会有锯齿状斑驳,可以在上面第10行代码绘制图形之前,设置画布的顺滑模式为反锯齿,以便让图形边缘显得顺滑:

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias

最后的效果为:

【VB.NET】绘制管道接口圆环_Transform_06


©著作权归作者所有:来自51CTO博客作者于锋VB课程的原创作品,请联系作者获取转载授权,否则将追究法律责任

【vb.net】创建forms项目无设计界面的解决办法_vb.net课程的博客-多极客编程

使用 Visual Studio 2022 开发工具创建VB.NET窗体应用程序项目模板的步骤如下:1.打开Visual Studio后,点击[文件]菜单,点击[创建项目]。2.在弹出的创建新项目窗口中,选择顶部的编程语言为Visual Basic,针对的平台选择为Windows,项目类型选择为桌面。3.在下面出现的Windows桌面开发所使用的项目模板中,选择用于创建依赖于.NET(注意不是.N

【vb.net】操作注册表_vb.net课程的博客-多极客编程

      Windows系统将计算机全部配置信息和各应用程序信息容纳在“注册表”数据库中,用它来管理应用程序和关联文件、硬件设备说明、状态属性以及各种状态信息和数据等。注册表由“我的电脑”分出几个根键蜂箱分支(根键名前缀为HKEY_,H由蜂箱Hive而来),都有哪类根键是由安装的操作系统来决定的。1、注册表常见的根键分支有:  HKEY_CLASSES_ROOT当前已在计算机上注册的所有COM服

vb.net绘制直线和贝塞尔曲线_vb.net课程的博客-多极客编程

用VB.NET绘制直线的方法为:画布工具Graphics.DrawLine(钢笔工具Pen,起始点Point,终止点Point)其中的参数Point对象还可以用PointF对象或分别用其横坐标X值和横坐标Y值代替。用VB.NET连续绘制多条直线的方法为:画布工具Graphics.DrawLines(钢笔工具Pen,有序点数组)其中的参数有序点数组由按照顺序连接到各个点(Point或PointF)构

【vb.net】关于绘制五角星_vb.net课程的博客-多极客编程

       在本人的视频课程《​​【VB.NET】二维图形绘制​​》里曾经演示了如何利用渐变颜色填充五角星的代码,在这里我再补充讲解下如何利用数学三角函数计算绘制五角星的10个顶点坐标。1.比如要在一个长宽均为400像素的矩形框范围内绘制一个五角星,可以定义这个矩形框为:Dim rect As New Rectangle(0, 0, 400, 400)2.我们要绘制的五角星的五个顶点,则位于这个

如何通过c#将 excel 转为pdf _carinababy的博客-多极客编程

在日常办公中我们会经常遇到Excel表格,这类型的格式文件可以帮助我们统计数据,并即时地提升办公的效率。而在某些特殊的情况下,改动一个数字都会影响整个数据的真实性,所以很多时候用户需要保证这些数据不被其他人所篡改,这个时候我们就需要把Excel表格进行文件转换,转换成PDF格式的文件。​​整个 Excel 工作薄转为 PDF​​​​指定 Excel 工作表转为 PDF​​使用工具: ​​​Free

如何通过c#/vb.net将pdf转为word_carinababy的博客-多极客编程

众所周知,PDF文档支持特长文件,集成度和安全可靠性都较高,可有效防止他人对PDF内容进行更改,所以在工作中深受大家喜爱。但是在工作中,我们不可避免的会对PDF文档进行修改或再编辑,这时我们可以将PDF转换为Word文档格式进行修改。本文将分为两部分介绍如何以编程的方式将PDF转换为Word。将 PDF 转换为固定布局的Doc/Docx 文档将 PDF 转换为流动形态的Doc/Docx 文档固定布

c++ 不知树系列之初识树(树的邻接矩阵、双亲孩子表示法……)_一枚大果壳的博客-多极客编程

1. 前言 树是一种很重要的数据结构,最初对数据结构的定义就是指对树和图的研究,后来才广义化了数据结构这个概念。从而可看出树和图在数结构这一研究领域的重要性。 树和图重要的原因是,它让计算机能建模出现实世界中更多领域里错综复杂的信息关系,让计算机服务这些领域成为可能。 本文将和大家聊聊树的基本概念,以及树的物理存储结构以及实现。 2. 基本概念 数据结构的研究主要是从 2 点出发: 洞悉数据与数

java中的重载和重写的区别_write less,do more。的博客-多极客编程

重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法 重载 发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,与修饰符和返回值类型无关。 下面是《Java 核心技术》对重载这个概念的介绍: 综上:重载就是同一个类中多个同名方法根据不同的传参来执行不同的

java数组定义和内存原理_write less,do more。的博客-多极客编程

数组定义和访问 容器概念 容器:是将多个数据存储到一起,每个数据称为该容器的元素。 数组概念 数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。 数组的定义 方式一 格式: 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]; 数组定义格式详解: 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。 [] : 表示数组。 数组名字:为定义的

手把手教你shiro整合jwt实现登录认证!_wx630f055ce23fc的博客-多极客编程

1.所用技术SpringBootMybatis-plusShiroJWTRedis2.前置知识Shiro:Shiro 是一个基于 Java 的开源的安全框架。在 Shiro 的核心架构里面,Subject 是访问系统的用户。SecurityManager 是安全管理器,负责用户的认证和授权,相当于 Shiro 的老大哥。Realm 相当于数据源,用户的认证和授权都在 Realm 的方法中进行。cr

java语言中的swing组件编程_wx630f055ce23fc的博客-多极客编程

##Swing包的介绍Java基础类数据库(Java Foundation Class)给java应用程序增加了图形界面、丰富的功能性以及与用户交互性。从JDK1.2开始,Java就开始推出了Swing组件。与AWT组件比较的话,它要更加美观,组件数量更多的优势。它也是轻量级组件,它没有本地代码又不需要操作系统支持。 ##Swing功能分类 如果Swing按功能来分的话,有以下六类:顶层容器:如J

jvm参数_wx630f055ce23fc的博客-多极客编程

简介经过前面的各种分析学习,知道了关于JVM很多的知识,比如版本信息,类加载,堆,方法区,垃圾回收等,但是总觉得心里不踏实,原因是没看到实际的一些东西。所以这一章节,咱们就好好来聊一聊关于怎么将这些内容进行直观地展示在我们面前,包括怎么进行相应的一些设置。OK,let's go!标准参数-version-help-server-cp-X参数非标准参数,也就是在JDK各个版本中可能会变动。-Xint