从一个对象到另一个对象的 C++/SDL 角度
C++/SDL angle from one object to another
我想按照我点击的方向旋转二维图像,旋转到所有象限。为此,我需要计算相对于物体的角度。我需要 2 个向量。
我试过这样做:一个向量是 "click" 点,另一个是 "imaginary" 水平向量,离开与 [=32= 具有相同 X 的对象] 点,但带有对象的 Y。这将作为第二个向量,我将在其中计算与对象的角度。
我已经用 3 个对象制作了一个测试程序,看看我是否可以获得这些角度。 b6
是对象,b7
是 "click point" 与 b6
约 45º,b8
是另一个 "click point" 与 [=11= 约 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。
我是这方面的新手,我不知道我做的是不是一团糟。谁能帮我计算这些角度?
正如 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
个实例的草图:
我想按照我点击的方向旋转二维图像,旋转到所有象限。为此,我需要计算相对于物体的角度。我需要 2 个向量。
我试过这样做:一个向量是 "click" 点,另一个是 "imaginary" 水平向量,离开与 [=32= 具有相同 X 的对象] 点,但带有对象的 Y。这将作为第二个向量,我将在其中计算与对象的角度。
我已经用 3 个对象制作了一个测试程序,看看我是否可以获得这些角度。 b6
是对象,b7
是 "click point" 与 b6
约 45º,b8
是另一个 "click point" 与 [=11= 约 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。
我是这方面的新手,我不知道我做的是不是一团糟。谁能帮我计算这些角度?
正如 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
个实例的草图: