C#使用GDI对一个矩形进行任意角度旋转

C#对一个矩形进行旋转GDI绘图,可以指定任意角度进行旋转

我们可以认为一张图片Image,本质就是一个矩形Rectangle,旋转矩形也就是旋转图片

在画图密封类 System.Drawing.Graphics中,

矩形旋转的两个关键方法

//设置旋转的中心点

public void TranslateTransform(float dx, float dy);

//旋转指定的角度【单位°】:旋转角度 从 X+ 到 Y+之间的旋转角度认为是正数

public void RotateTransform(float angle);

矩形旋转WindowsForms应用程序

新建窗体应用程序RotatedRectangleDemo,将默认的Form1重命名为FormRotatedRectangle

窗体FormRotatedRectangle设计如图:

窗体设计FormRotatedRectangle设计器代码如下:

文件FormRotatedRectangle.Designer.cs


namespace RotatedRectangleDemo
{partial class FormRotatedRectangle{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.btnRotate = new System.Windows.Forms.Button();this.label1 = new System.Windows.Forms.Label();this.numRotate = new System.Windows.Forms.NumericUpDown();((System.ComponentModel.ISupportInitialize)(this.numRotate)).BeginInit();this.SuspendLayout();// // btnRotate// this.btnRotate.Font = new System.Drawing.Font("宋体", 13F);this.btnRotate.Location = new System.Drawing.Point(271, 7);this.btnRotate.Name = "btnRotate";this.btnRotate.Size = new System.Drawing.Size(75, 33);this.btnRotate.TabIndex = 0;this.btnRotate.Text = "旋转";this.btnRotate.UseVisualStyleBackColor = true;this.btnRotate.Click += new System.EventHandler(this.btnRotate_Click);// // label1// this.label1.AutoSize = true;this.label1.Location = new System.Drawing.Point(25, 20);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(119, 12);this.label1.TabIndex = 1;this.label1.Text = "旋转角度(0°~360°)";// // numRotate// this.numRotate.DecimalPlaces = 2;this.numRotate.Location = new System.Drawing.Point(150, 16);this.numRotate.Maximum = new decimal(new int[] {360,0,0,0});this.numRotate.Name = "numRotate";this.numRotate.Size = new System.Drawing.Size(97, 21);this.numRotate.TabIndex = 2;this.numRotate.Value = new decimal(new int[] {30,0,0,0});// // FormRotatedRectangle// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(945, 508);this.Controls.Add(this.numRotate);this.Controls.Add(this.label1);this.Controls.Add(this.btnRotate);this.Name = "FormRotatedRectangle";this.Text = "GDI旋转示例:矩形旋转任意角度";((System.ComponentModel.ISupportInitialize)(this.numRotate)).EndInit();this.ResumeLayout(false);this.PerformLayout();}#endregionprivate System.Windows.Forms.Button btnRotate;private System.Windows.Forms.Label label1;private System.Windows.Forms.NumericUpDown numRotate;}
}

旋转矩形示例代码如下:

文件FormRotatedRectangle.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace RotatedRectangleDemo
{public partial class FormRotatedRectangle : Form{public FormRotatedRectangle(){InitializeComponent();/* 定义了一个名为FormRotatedRectangle的窗体类,* 它覆盖(override)了OnPaint方法来绘制旋转的矩形。* 在OnPaint方法中,我们首先设置矩形的位置和大小,然后保存图形状态,* 接着设置旋转变换的中心点,通过RotateTransform方法设置旋转角度,并绘制旋转后的矩形,最后恢复图形状态。* 程序运行时,会显示一个旋转了30度的矩形。*/}/// <summary>/// 窗体重绘事件/// </summary>/// <param name="e"></param>protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g = e.Graphics;// 设置矩形的位置和大小Rectangle rect = new Rectangle(100, 100, 200, 100);RotateRectangle(g, rect, (float)numRotate.Value);}/// <summary>/// 将初始矩形旋转指定的角度数/// </summary>/// <param name="g">窗体画图对象</param>/// <param name="rect">初始矩形对象(x,y,width,height)</param>/// <param name="rotateAngle">旋转角度,单位°</param>private void RotateRectangle(Graphics g, Rectangle rect, float rotateAngle) {// 保存原始状态GraphicsState state = g.Save();// 设置旋转的中心点为矩形的中心g.TranslateTransform(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);// 旋转矩形:旋转角度 从 X+ 到 Y+之间的旋转角度认为是正数g.RotateTransform(rotateAngle);// 恢复变换的中心点g.TranslateTransform(-(rect.X + rect.Width / 2), -(rect.Y + rect.Height / 2));// 绘制矩形g.DrawRectangle(Pens.Black, rect);// 恢复图形状态g.Restore(state);}private void btnRotate_Click(object sender, EventArgs e){this.Invalidate();//引起触发重绘OnPaint事件}}
}

程序运行如图:

旋转45°【π/4】

旋转90°【π/2】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设计创新型薪酬福利体系?

薪酬福利体系是企业吸引和留住人才的重要工具&#xff0c;然而&#xff0c;传统的薪酬福利体系缺少一定的灵活性&#xff0c;同时在满足员工多样性需求方面也比较欠缺。所以越来越多的企业选择建立创新型的薪酬福利体系。那么应该如何建立兼具灵活和激励的创新型的薪酬福利体系…

sns报错 UserWarning: Dataset has 0 variance; skipping density estimate.

报错信息 UserWarning: Dataset has 0 variance; skipping density estimate. Pass warn_singularFalse to disable this warning. 三维数组维度(1000, 27,1)&#xff0c;取出第一个元素画出分布图保存检查错误原因&#xff0c;print(Mcases[:,:,0].shape) 显示维度(1000, 27)修…

生成随机图片

package com.zhuguohui.app.lib.tools;/*** Created by zhuguohui* Date: 2024/6/1* Time: 13:39* Desc:获取随机图片*/ public class RandomImage {// static final String url "https://picsum.photos/%d/%d?random%d";static final String url "https://…

FPGA定点数FFT过后转换为浮点数与Matlab计算的FFT结果进行比对

目录 1.前言2.FPGA的testbench中如何读取数据文件3.FPGA的testbench中如何将输出数据存储在文件中4.Matlab去读取testbench存储的文件数据4.1纯数字不带编码4.2 带编码的数据&#xff0c;如定点数 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 前面一篇文章讲了&…

ESP32-C3模组上实现蓝牙BLE配网功能(2)

接前一篇文章&#xff1a;ESP32-C3模组上实现蓝牙BLE配网功能&#xff08;1&#xff09; 本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 乐鑫科技 蓝牙的名字由来是怎样的&#xff1f;为什么不叫它“白牙”&#xff1f; 特此致谢&#xff01; 一、蓝牙知识基础…

[数据集][目标检测]吉他检测数据集VOC+YOLO格式66张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;66 标注数量(xml文件个数)&#xff1a;66 标注数量(txt文件个数)&#xff1a;66 标注类别数…

Three.js——tween动画、光线投射拾取、加载.obj/.mtl外部文件、使用相机控制器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

数据结构基础篇(6)

二十三、队列的表示和操作的实现 相关术语 队列是仅在表尾进行插入操作&#xff0c;在表头进行删除操作的线性表表尾既a~n段&#xff0c;称对尾&#xff1b;表头a~1段&#xff0c;称队头它是一种先进先出&#xff08;FIFO&#xff09;的线性表 入队&#xff1a;插入元素出队&a…

YOLOv8 segment介绍

1.YOLOv8图像分割支持的数据格式&#xff1a; (1).用于训练YOLOv8分割模型的数据集标签格式如下: 1).每幅图像对应一个文本文件&#xff1a;数据集中的每幅图像都有一个与图像文件同名的对应文本文件&#xff0c;扩展名为".txt"; 2).文本文件中每个目标(object)占一行…

iReport的下载与安装

下载官网&#xff1a;Home - Jaspersoft Community 网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Oy5opY4GxPZ_mllTlBZ-2w 提取码&#xff1a;75do 安装就是双击后一直点击下一步 安装好了之后要配置jdk环境 iReport 目前 并不支持 高版本jdk 只支持…

TQSDRPI开发板教程:UDP收发测试

项目资源分享 链接&#xff1a;https://pan.baidu.com/s/1gWNSA9czrGwUYJXdeuOwgQ 提取码&#xff1a;tfo0 LWIP自环教程&#xff1a;https://blog.csdn.net/mcupro/article/details/139350727?spm1001.2014.3001.5501 在lwip自环的基础上修改代码实现UDP的收发测试。新建一…

嫁接打印:经济与实用的完美结合

在制造领域&#xff0c;寻求经济且好用的技术方案至关重要。而在模具制造中&#xff0c;3D 打印随形水路在提升冷却效率和产品良率方面的卓越表现已得到广泛认同。如何更经济的应用3D打印技术&#xff0c;就不得不说嫁接打印了。 在嫁接打印的制造过程中&#xff0c;产品的一部…

Codeforces Round 900 (Div. 3)

文章目录 A. How Much Does Daytona Cost?题意&#xff1a;题解&#xff1a;代码&#xff1a; B. Aleksa and Stack题意&#xff1a;题解&#xff1a;代码&#xff1a; C. Vasilije in Cacak题意&#xff1a;题解&#xff1a;代码&#xff1a; E. Iva & Pav题意&#xff1…

音视频开发—H264 SPS 和 PPS 参数说明

文章目录 序列参数集 (SPS, Sequence Parameter Set)SPS的主要内容&#xff1a; 图像参数集 (PPS, Picture Parameter Set)PPS的主要内容&#xff1a; Slice Header 结构 在H.264视频编码标准中&#xff0c;SPS和PPS是关键的参数集&#xff0c;它们提供了解码所需的各种配置信息…

Pytorch创建张量

文章目录 1.torch.from_numpy()2. torch.zeros()3. torch.ones()4. torch.arange()5. torch.linspace()6. torch.logspace()7. torch.eye()8. torch.empty()9. torch.full()10. torch.complex()10. torch.rand()10. torch.randint()11. torch.randn12. torch.normal()13. torch…

Django模型的使用

系统Ubuntu20.04 1.安装Mysql 2.用pip3安装mysqlclient&#xff0c;这个连接Python和Mysql的工具 3.更改配置文件 setting.py其中 DATABASES文件如下。 ...76 DATABASES {77 default: {78 ENGINE: django.db.backends.mysql,79 NAME: sqltest,80 …

[数据集][目标检测]剪刀石头布检测数据集VOC+YOLO格式1973张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1973 标注数量(xml文件个数)&#xff1a;1973 标注数量(txt文件个数)&#xff1a;1973 标注…

Docker 简介和安装

目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念&#xff1a;镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚…

SAP揭秘者- SAP PP模块日常常见运维问题之工单入库失败原因分析及快速处理

文章摘要&#xff1a; 无论您是负责SAP实施项目还是负责SAP运维项目&#xff0c;当用户发现有SAP PP模块的各种异常问题的时都需要作为SAP PP顾问的您快速地理解用户提交的问题&#xff0c;并快速地解决这些问题&#xff0c; 上篇文章跟大家聊了基本单位维护错了怎么修改的解决…

ARC学习(2)基本编程模型认识(二)

笔者继续来学习一下arc的编程模型的寄存器信息。 1、core寄存器深入 参数寄存器&#xff1a;r0-r7&#xff0c;8个参数&#xff0c;暂存器&#xff1a;r10-r15保存寄存器&#xff1a;r16-r25 调用函数需要保存的寄存器指针寄存器&#xff1a;gp&#xff08;全局指针&#xff09…