在旋转矩形内查找一个点
Find a point inside a rotated rectangle
好吧,这应该非常简单,但我不是一个聪明人。 从技术上讲,我想知道一个点是否位于矩形内,但是矩形可以处于不同的状态。在我当前的上下文中,当我想绘制一个顺时针旋转 45° 的矩形时,我所做的是将整个 x,y 轴旋转到矩形的左上角中心,然后我只是绘制矩形,就好像什么都没发生过一样。如果我想在随机坐标上绘制矩形,也是如此。鉴于这是被抛掷和旋转的坐标系,矩形总是认为它是在 (0,0) 处以 0° 绘制的,因此,查找给定点是否在矩形内的最佳方法是根据矩形的平移 + 旋转找到该点的投影。但我不知道该怎么做。
这是我目前所做的,以确定一个点是否在矩形内(不考虑旋转):
bool Image::isPointInsideRectangle(int x, int y, const ofRectangle & rectangle){
return x - xOffset >= rectangle.getX() && x - xOffset <= rectangle.getX() + rectangle.getWidth() &&
y - yOffset >= rectangle.getY() && y - yOffset <= rectangle.getY() + rectangle.getHeight();
}
我已经存储了angleInDegrees
,只要我能用它来投影我收到的 (x,y) 点,我应该能够找出该点是否在矩形内。
干杯!
阿克塞尔
最简单的方法是相对于矩形的原点和旋转以相反的方向取消旋转 x,y。
例如,如果 angleInDegrees 为 45 度,则可以旋转该点以测试 -45 度(如果旋转例程仅允许正旋转,则旋转 315 度)。 这将在与未旋转的矩形相同的坐标系上绘制 x,y。
然后,您可以使用已经提供的函数来测试该点是否在矩形内。
请注意,在旋转 x,y 之前,您可能需要相对于旋转点(矩形的左上角)调整 x,y。 由于旋转是相对于该点而不是整体坐标原点 0,0。 您可以计算 x,y 与矩形左上角之间的差值(在旋转过程中不会更改),然后只需按 -angleToRotate 旋转调整后的点,然后将原点差添加回未旋转的点即可获得坐标系上的绝对坐标。
已编辑:
#include <cmath>
bool Image::isPointInsideRectangle(int x, int y, const ofRectangle & rectangle){
return x*cosd(deg) - y*sin(deg) + xOffset >= rectangle.getX()
&& x*cosd(deg) - y*sin(deg) + xOffset <= rectangle.getX() + rectangle.getWidth()
&& x*sind(deg) + y*cosd(deg) + yOffset >= rectangle.getY()
&& x*sind(deg) + y*cosd(deg) + yOffset <= rectangle.getY() + rectangle.getHeight();
就像你已经说过的,你可以将点的坐标转换为矩形的空间。这是许多使用几何图形的软件产品中的常见任务。每个对象都有自己的坐标空间,并且无需旋转即可在位置 (0, 0) 处工作。如果您的矩形位于位置 v 并旋转约 b 度/弧度,则可以使用以下公式将点 P 转换为矩形的空间:
| cos(-b) -sin(-b) | | P_x - v_x |
| | ⋅ | |
| sin(-b) cos(-b) | | P_y - v_y |
许多最重要的变换都可以表示为矩阵。至少如果您使用的是均匀坐标。这样做也很常见。根据程序的复杂性和目标,您可以考虑使用一些数学库,如glm,并以矩阵的形式使用对象的转换。然后你可以写一些类似inverse(rectangle.transformation()) * point
的东西,point
翻译成rectangle
的空间。
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 查找最小的下一个更大的元素
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 尝试创建一个程序来查找非二叉树的高度.最终得到一个很长的循环,没有答案
- 如何制作一个查找数字平方值的 c++ 程序
- 查找下一个具有真值C++的数组索引
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- 查找 2D 向量的位置,该向量是类C++的一个元素
- 将两个双数组集组合为一个查找其并集和交集的最简单方法
- 是因为两个查找而不是一个查找,所以速度变慢了吗
- 在c++中实现一个查找和替换过程