我想将2D图像向点击的方向旋转到所有象限。为此,我需要计算相对于对象的角度。我需要2个向量。
我尝试这样做:一个向量是“点击”点,另一个向量是一个“虚构”水平向量,它离开对象时具有与“点击”点相同的X,但Y等于宾语。它将作为第二个矢量,可以计算出我与物体之间的角度。
我制作了一个包含3个对象的测试程序,以查看是否可以获得这些角度。 b6
是对象,b7
是距b6
约45º的“点击点”,而b8
是距b6
约135º的另一个“点击点”。
这是我正在使用的代码:
#define PI 3.14159265
int main(int argc, char** argv) {
Button b6(100,100);
Button b7(150,50);
Button b8(150,150);
int dot1 = b7.getX() * b7.getX() + b7.getY() * b6.getY();
int det1 = b7.getX() * b6.getY() - b7.getY() * b7.getX();
double angle1 = atan2(det1,dot1)* 180/PI;
int dot2 = b8.getX() * b8.getX() + b8.getY() * b6.getY();
int det2 = b8.getX() * b6.getY() - b8.getY() * b8.getX();
double angle2 = atan2(det2,dot2)* 180/PI;
}
结果与b7
和b8
的实际位置不符。 angle1
是15.25,而angle2
是-11.31。
我是这方面的新手,我不知道我在干什么。谁能帮我计算这些角度?
答案 0 :(得分:0)
正如Sam在评论中所写-尚不清楚,OP希望通过dot
和det
实现什么。听起来有点像点积,但是这里没有必要。
从一个点到另一个点的向量只是点的减法(点向量)。
点矢量的减法就是矢量分量的减法。
在atan2()
中使用这些向量的分量可得出这些向量的斜率:
#include <iostream>
#include <cmath>
const double Pi = 3.14159265;
struct Vec2 {
const double x, y;
Vec2(double x, double y): x(x), y(y) { }
~Vec2() = default;
Vec2(const Vec2&) = default;
Vec2& operator=(const Vec2&) = delete;
};
int main()
{
const Vec2 b6(100, 100);
const Vec2 b7(150, 50);
const Vec2 b8(150, 150);
// vector b6->b7
const Vec2 b67(b7.x - b6.x, b7.y - b6.y);
// vector b6->b8
const Vec2 b68(b8.x - b6.x, b8.y - b6.y);
// slope b67
const double angle1 = atan2(b67.y, b67.x) * 180 / Pi;
// slope b68
const double angle2 = atan2(b68.y, b68.x) * 180 / Pi;
// output
std::cout
<< "angle1: " << angle1 << '\n'
<< "angle2: " << angle2 << '\n';
// done
return 0;
}
输出:
angle1: -45
angle2: 45
Vec2
实例的草图: