围绕枢轴点重复旋转点

2024-02-16

一段时间以来,我一直在使用以下函数在我的各种程序中围绕枢轴点旋转一系列点。

private Point RotatePoint(Point point, Point pivot, double radians)
{
    var cosTheta = Math.Cos(radians);
    var sinTheta = Math.Sin(radians);

    var x = (cosTheta * (point.X - pivot.X) - sinTheta * (point.Y - pivot.Y) + pivot.X);
    var y = (sinTheta * (point.X - pivot.X) + cosTheta * (point.Y - pivot.Y) + pivot.Y);

    return new Point((int)x, (int)y);
}

这一直很有效,直到我尝试反复少量旋转形状。例如,这是我在由 4 个点组成的矩形多边形上调用 45° 得到的结果:

foreach (var point in points)
    Rotate(point, center, Math.PI / 180f * 45);

但这是我通过调用旋转 45 次 1° 得到的结果:

for (var i = 0; i < 45; ++i)
    foreach (var point in points)
        Rotate(point, center, Math.PI / 180f * 1)

只要调用一次就可以了,而且似乎旋转度越低,情况就逐渐变差。该函数是否存在一些缺陷,或者我是否误解了该函数的一些基本功能?

我怎样才能少量地重复旋转呢?我可以保存基点并在旋转发生变化时使用它们来更新当前点,但这是唯一的方法吗?


Your Point位置测量因由生成的整数舍入而关闭RotatePoint() method.

对方法返回值进行简单修正,使用float坐标,将产生正确的测量:

要测试它,请创建一个计时器并注册它Tick事件作为RotateTimerTick():

添加了旋转增量(参见rotationSpinField)来强调运动效果。

PointF pivotPoint = new PointF(100F, 100F);
PointF rotatingPoint = new PointF(50F, 100F);
double rotationSpin = 0D;

private PointF RotatePoint(PointF point, PointF pivot, double radians)
{
    var cosTheta = Math.Cos(radians);
    var sinTheta = Math.Sin(radians);

    var x = (cosTheta * (point.X - pivot.X) - sinTheta * (point.Y - pivot.Y) + pivot.X);
    var y = (sinTheta * (point.X - pivot.X) + cosTheta * (point.Y - pivot.Y) + pivot.Y);

    return new PointF((float)x, (float)y);
}

private void RotateTimerTick(object sender, EventArgs e)
{
    rotationSpin += .5;
    
    if (rotationSpin > 90) rotationSpin = 0;
    rotatingPoint = RotatePoint(rotatingPoint, pivotPoint, (Math.PI / 180f) * rotationSpin);
    Panel1.Invalidate(new Rectangle(new Point(50,50), new Size(110, 110)));
}

private void Panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    e.Graphics.FillEllipse(Brushes.White, new RectangleF(100, 100, 8, 8));
    e.Graphics.FillEllipse(Brushes.Yellow, new RectangleF(rotatingPoint, new SizeF(8, 8)));
}

这是使用的结果float values:

这就是使用时发生的情况integer values:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

围绕枢轴点重复旋转点 的相关文章

  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • Opengl 像素完美 2D 绘图

    我正在研究 2d 引擎 它已经工作得很好 但我不断收到像素错误 例如 我的窗口是 960x540 像素 我从 0 0 到 959 0 画一条线 我希望扫描线 0 上的每个像素都会被设置为一种颜色 但事实并非如此 最右边的像素没有被绘制 当我
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List

随机推荐

  • 如何在Python 3.x中强制输入整数? [复制]

    这个问题在这里已经有答案了 我正在尝试用 Python 编写一个程序 该程序接受输入以重复斐波那契数列的次数 i 1 timeNum input How many times do you want to repeat the sequen
  • 用 C++ 读/写设备

    如何用 C 读取 写入设备 该设备位于 dev ttyPA1 我考虑过 fstream 但我不知道设备是否具有我可以在不阻塞应用程序的情况下读取的输出 我的目标是创建一个应用程序 您可以在终端中写入一些内容 然后将其发送到 dev ttyP
  • 简单 SparkSQL 查询中未修剪分区

    我正在尝试从 SparkSQL 表 S3 中的 parquet 有效地选择各个分区 但是 我看到 Spark 打开表中所有 parquet 文件的证据 而不仅仅是那些通过过滤器的文件 对于具有大量分区的表来说 即使是小型查询也会变得昂贵 这
  • IOS Swift - 无法从地址簿中检索个人笔记

    有人有什么建议为什么我可以获得名字 姓氏和生日 但是我无法检索从 iphone 通讯录中提交的笔记吗 准备工作 已授予地址簿访问权限 添加到地址簿中的人员包含所有字段 包括注释 当前结果 nil 仅用于注释 所有其他字段均已正确检索 使用的
  • Firebase 中如何计算连接

    连接数是如何计算的 假设我有一个 Web 应用程序 其中一个负载会向所有连接的客户端发送一条消息 假设我有 5 个连接的客户端 这是否意味着只要打开了 Web 应用程序的浏览器选项卡 它就会计为 1 个连接 这意味着我将有 6 个并发连接
  • 无法从groovy连接到oracle数据库

    您好 我无法连接到 groovy 中的 Oracle 数据库 我在 groovy 控制台中使用了以下代码 但出现以下编译错误 unable to resolve class oracle jdbc driver OracleTypes at
  • 找不到 ViewModel 的视图

    我有一个使用 Caliburn Micro 的 wpf 应用程序 我有一个视图 MyView
  • Python:没有名为“dash.development”的模块。 “dash”不是一个包

    我正在尝试运行这个 Dash 教程https github com cryptopotluck alpha vantage tutorial tree master dash bootstrap https github com crypt
  • R:如何相对于 x 轴分散(抖动)点?

    我在 R 中有以下代码片段 dat lt data frame cond factor rep A 10 rating c 1 2 3 4 6 6 7 8 9 10 ggplot dat aes x cond y rating geom b
  • 无法在 Visual Studio 2013 中显示 SQL Azure 表定义

    我收到的错误是 加载问题 设计器在加载表定义时遇到错误 我可以很好地查看VS内表中的数据 甚至还可以查询数据 这是我的计算机上的全新安装 我尝试过的 尝试在 服务器资源管理器 和 SQL Server 对象资源管理器 检查我的登录凭据是否有
  • 我应该使用什么标记来描述使用 schema.org 的社交媒体链接?

    我有一个地方 本地企业 其中有多个字段可以很好地映射到 schema org 条目 有一个字段我不确定如何标记 我们有该企业社交媒体帐户的链接 例如 Twitter 帐户 Facebook 页面和 Pinterest 帐户 这些应该如何在
  • Django:ModelChoiceField 删除默认--------- 选择

    如何从 ModelChoiceField 中删除默认的 选择 Use empty label None field2 forms ModelChoiceField queryset empty label None 请检查文档模型选择字段
  • 如何使用 SFINAE 检测 noexcept 方法

    我问的是一个 流行 问题的变体 检测类方法的存在 我在 SO 中读过很多答案 大多数 C 17 后 解决方案看起来像this https stackoverflow com questions 55191505 c compile time
  • 分发依赖于静态框架的动态框架的正确方法是什么?

    我正在构建一个闭源动态框架 它依赖于第三方闭源静态框架 我将静态依赖框架链接到我的框架的项目 目标 如中所述这个苹果技术说明 https developer apple com library content technotes tn243
  • 如何使用 RestClient 修复 Ruby 中的套接字错误?

    我在用RestClient在 ruby 类中进行网络调用 我得到了SocketError每当我没有连接到互联网时 我已经添加了一个救援块来捕获异常 但我仍然无法这样做 错误消息是 SocketError Failed to open TCP
  • 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

    好吧 问题就在这里 我必须编写一个 MIPS 程序 从用户那里获取 2 个输入数字 然后 我必须编写一个代码来输出用户输入的 2 个数字的乘积 商和余数 现在 这非常简单 但是 我没有意识到我们不能在程序中使用乘法和除法操作数 现在我不知道
  • Mongodb递归查询

    我的中有以下架构taxon收藏 id 1 na root 1 root 2 root 3 pa 1 id 2 na name 1 name 2 name 3 pa 1 id 4 na otherName 1 otherName 2 othe
  • R:用 dplyr 替换按小时计算的 NA 值

    我正在学习 R 中的 dplyr 包 我真的很喜欢它 但现在我正在处理数据中的 NA 值 我想用相应小时的平均值替换任何 NA 例如用这个非常简单的例子 create an example day c 1 1 2 2 3 3 hour c
  • 我在 chrome 91 中的选项卡更新/激活/焦点事件中收到错误“选项卡现在无法编辑(用户可能正在拖动选项卡)”

    最近的 Chrome 更新后 当我尝试使用 chrome tabs API 时 我的扩展程序开始触发 未检查的运行时 lastError 现在无法编辑选项卡 用户可能正在拖动选项卡 目前还没有关于此问题的太多信息 但我相信这是一个浏览器错误
  • 围绕枢轴点重复旋转点

    一段时间以来 我一直在使用以下函数在我的各种程序中围绕枢轴点旋转一系列点 private Point RotatePoint Point point Point pivot double radians var cosTheta Math