C# 图像旋转一定角度后,对应坐标怎么计算?

原理分析

要计算图像内坐标在旋转一定角度后的新坐标,可以使用二维空间中的点旋转公式。假设图像的中心点(即旋转中心)为 (Cx, Cy),通常对于正方形图像而言,中心点坐标为 (Width / 2, Height / 2)。给定原坐标点 (X, Y) 要绕中心点逆时针旋转角度 θ,其旋转后的坐标 (X', Y') 计算公式如下:

7489fb1a100f40b298511da4692de7e1.png

其中,θ 通常以弧度为单位。若已知角度而非弧度,则需先将其转换为弧度:

121fe4f22ae1498e88c7a4ed61a39a56.png

对于您提供的图像尺寸(宽3072,高3072),图像中心点坐标为 (1536, 1536)。假设您要旋转的角度为 θ 度,您可以按照以下步骤计算坐标 [0] 和 [1] 在旋转后的坐标:

  1. 确定旋转角度:确保角度 θ 已转换为弧度。
  2. 应用旋转公式fc950ec6bb8245faad6f7d45ced72531.png

计算上述公式即可得到旋转后坐标 [0] 和 [1] 的新坐标 (X'_0, Y'_0) 和 (X'_1, Y'_1)

请注意,旋转后的坐标可能会超出原图像边界,这取决于旋转角度。在实际编程应用中,可能需要结合图像旋转后的裁剪或插值处理来确保结果符合预期。

可以使用如GDI+或OpenCV等库提供的旋转功能,它们通常会自动处理边界问题和插值算法。如果您需要纯数学计算后的坐标用于其他目的,只需按照上述公式计算即可。

 

代码示例

using System;  
  
public class Point  
{  
    public int X { get; set; }  
    public int Y { get; set; }  
}  
  
public class Program  
{  
    public static void Main()  
    {  
        // 示例点  
        Point point1 = new Point { X = 1490, Y = 1200 };  
        Point point2 = new Point { X = 1931, Y = 2448 };  
  
        // 图像中心和旋转角度(以度为单位)  
        int centerX = 1536;  
        int centerY = 1536;  
        double rotationAngleInDegrees = 45; // 旋转45度  
  
        // 计算旋转后的坐标  
        Point rotatedPoint1 = RotatePoint(point1, centerX, centerY, rotationAngleInDegrees);  
        Point rotatedPoint2 = RotatePoint(point2, centerX, centerY, rotationAngleInDegrees);  
  
        // 输出结果  
        Console.WriteLine($"Rotated Point 1: X={rotatedPoint1.X}, Y={rotatedPoint1.Y}");  
        Console.WriteLine($"Rotated Point 2: X={rotatedPoint2.X}, Y={rotatedPoint2.Y}");  
    }  
  
    public static Point RotatePoint(Point point, int centerX, int centerY, double rotationAngleInDegrees)  
    {  
        // 将角度转换为弧度  
        double rotationAngleInRadians = rotationAngleInDegrees * (Math.PI / 180);  
  
        // 计算旋转后的坐标  
        int rotatedX = (int)((point.X - centerX) * Math.Cos(rotationAngleInRadians) - (point.Y - centerY) * Math.Sin(rotationAngleInRadians) + centerX);
        int rotatedY = (int)((point.X - centerX) * Math.Sin(rotationAngleInRadians) + (point.Y - centerY) * Math.Cos(rotationAngleInRadians) + centerY);
  
        return new Point { X = rotatedX, Y = rotatedY };  
    }  
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10:HAL---高级定时器

前言: 高级定时器具有通用定时器的所有功能,我们在这里面只说它不一样的地方。(通用定时器不具备的功能) 一:高级定时器 1:介绍 2:重复计数器 在我们普通的定时器中当CNTCCR时直接发生溢出。然…

阿里二面凉了,难蹦。。。

分享一位同学阿里巴巴的后端面经,共有 2 面,第一面很顺利过了,可惜挂在第二面。 这两面的知识点范围,我帮大家罗列一下: 网络:TCP、HTTP mysql:索引应用、索引结构、隔离级别、最左匹配 redis…

图小灵的多线程

进程 简而言之,一个运行的程序就叫作进程 管理进程,要先将进程使用类/结构体,表示各个属性 为了后续增删改查,需要将进程通过数据结构串联起来 系统中有一个结构体专门用来表示进程的属性,叫作PCB(进程控制块) 一个进程使用一个或者多个PCB来表示 系统会使用类似于双向链…

pycharm-git 配置(1)

1.安装git2.pycharm 中配置git 插件 弹出Git版本号,即配置成功。3.创建本地仓库 VCS->VCS operations->create repository->设置本地目录 左下角可以看到git本地仓库git可以看到push,commit。 4.配置远方仓库,此时确保git上是有这个项目…

在开发板上运行spidev_test报错:“./spidev_test: line 2: h: not found”

问题 今天交叉编译spidev_test后,放到开发板上运行报错:“./spidev_test: line 2: h: not found” 原因 编译方式不同,生成的是64为程序,应该生成32位的程序。 解决办法: 修改为直接用命令编译,生成…

酷开科技抓住“客厅经济”发展的机遇,不断对酷开系统升级赋能

酷开科技抓住“客厅经济”发展的机遇,不断对酷开系统升级赋能,打造新的生活场景,满足消费者的不同生活需求,酷开科技的产品和服务让消费者能够在家庭空间中享受到更加智能、便捷和温馨的时光。同样凭借更加包容、开放的生态体验&a…

贪吃蛇项目实战——学习详解

前言:贪吃蛇是一个经典的游戏, 本节将使用c语言实现一个简易的的贪吃蛇小游戏。 本节内容适合已经学完c语言还有数据结构链表的友友们。 我们要实现的贪吃蛇是在控制台进行游戏的。 它运行起来是这样的: 贪吃蛇 那么, 为了实现这个小游戏。 我…

添加Redis缓存

1.缓存查询 在service层Impl文件中,进行查询时优先向Redis中查数据,查到就查到了,没有查到向mysql数据库中查,查到之后不先返回,而是先将数据存到数据库(缓存),在再返回数据。 1.1 代码实现(缓…

鸿蒙端云一体化开发--调用云函数--适合小白体制

如何实现在端侧调用云函数? 观看前,友情提示: 不知道《如何一键创建端云一体化模板》的小白同学,请看: 鸿蒙端云一体化开发--开发云函数--适合小白体制-CSDN博客 实现方法: 第一步:添加依赖 …

98%的企业与被入侵的第三方有关联,如何有效的防止入侵

技术供应链漏洞使威胁参与者能够以最小的努力扩展其运营,在导致第三方入侵的外部B2B关系中,75%涉及软件或其他技术产品和服务,其余25%的第三方违规涉及非技术产品或服务。 入侵通常需要几个月或更长的时间才能公之于众,受害者可能…

【Leetcode】string类刷题

🔥个人主页:Quitecoder 🔥专栏:Leetcode刷题 目录 1.仅反转字母2.字符串中第一个唯一字符3.验证回文串4.字符串相加5.反转字符串I I6.反转字符串中的单词III7.字符串相乘8.把字符串转换为整数 1.仅反转字母 题目链接:…

C++:模板详解

模板详解 1.函数模板1.概念2.语法3.原理4.实例化1.隐式实例化2.显示实例化 5.匹配原则 2.类模板1.格式2.实例化 3.非类型模板参数注意点 4.特化1.概念2.函数模板特化1.前提2.语法说明3.示例 3.类模板特化1.全特化2.偏特化/半特化3.选择顺序 4.按需实例化 5.模板的分离编译1.分离…

开发一个农场小游戏需要多少钱

开发一个农场小游戏的费用因多个因素而异,包括但不限于游戏的规模、复杂性、功能需求、设计复杂度、开发团队的规模和经验,以及项目的时间周期等。因此,无法给出确切的费用数字。 具体来说,游戏的复杂程度和包含的功能特性数量会直…

巧用断点设置查找bug【debug】

默认设置的断点,当代码运行到断点处MCU就会被挂起,从而停在断点处。 但在某些情况下,如调试FCCU时,如果设置断点,MCU停下后将会导致 FCCU 配置WDG超时。或在调试类似电机控制类的应用时,不适当的断点会导 致…

镜舟科技荣获金科创新社 2024 年度金融数据智能解决方案奖

近日, 镜舟科技凭借领先的金融实时数仓构建智能经营解决方案,在“金科创新社第六届金融数据智能优秀解决方案评选”活动中,成功入选“数据治理与数据平台创新优秀解决方案”榜单。 金科创新社主办的“鑫智奖”评选活动,旨在展示…

详解IIC通信协议以及FPGA实现

一、IIC简介 IIC也称为I2C(Inter-Integrated Circuit)由飞利浦公司(现在的恩智浦半导体)开发,是一种用于短距离数字通信的串行,同步,半双工通信接口协议;传输在标准模式下可以达到10…

python:元组,字符串,切片

一、元组# 列表可以修改内容,元组可以不被修改 # 在程序内封装数据,不希望数据被篡改,所以使用元组 # 语法: 不限制类型 # 定于元组的字面量: (元素,元素,元素.....) # 定…

apipost、postman等工具上传图片测试flask、fastapi的文件api接口

参考:https://blog.csdn.net/qq_15821487/article/details/119354129 https://www.cnblogs.com/wyxjava/p/16076176.html 选择from-data,下拉选择file上传文件发送即可

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时,有一个返利监测的调度,如果某一天返利计算调度失败了,需要重新计算,这个监测的调度就会重新计算某天的数据。 在UAT测试通过,发布生产后&#xff0c…

NVIDIA安装程序失败-Nsight Visual Studio Edition失败解决办法

博主是要升级cuda版本,那么在安装新版本之前需要卸载以前的版本。 博主一溜卸载下去,最后有这么个东西卸载不掉,Nsight Visual Studio Edition 不管是电脑系统卸载还是360卸载,都卸载不掉。 此时安装新的cuda也遇到了这个问题 由…
最新文章