找到连接两个移动物体的矩形的 4 个角

ran*_*ing 2 c++ math sfml

我正在尝试在两点之间画一条线,我正在sf::VertexArray shape(sf::Quads, 4);为此使用。

这是我的整个draw功能:

void Stick::draw(sf::RenderTarget& target, sf::RenderStates states) const {
sf::VertexArray shape(sf::Quads, 4);

sf::Vector2f p1Pos = this->p1->getPosition();
sf::Vector2f p2Pos = this->p2->getPosition();

shape[0].position = sf::Vector2f(p1Pos.x + 10.f, p1Pos.y + 10.f);
shape[1].position = sf::Vector2f(p1Pos.x - 10.f, p1Pos.y - 10.f);
shape[2].position = sf::Vector2f(p2Pos.x - 10.f, p2Pos.y - 10.f);
shape[3].position = sf::Vector2f(p2Pos.x + 10.f, p2Pos.y + 10.f);
shape[0].color = sf::Color::Green;
shape[1].color = sf::Color::Green;
shape[2].color = sf::Color::Green;
shape[3].color = sf::Color::Green;
target.draw(shape, states);
}
Run Code Online (Sandbox Code Playgroud)

p1Posp2Pos是点的中心坐标。

这给我带来的是一条显然不适用于移动物体的线,因为矩形的角点是固定的,这里有一些例子:(红点不移动,而白点在本例中)

例子 实施例2

我想实现一个解决方案,以便“棒”(矩形)无论两点的位置如何都可以工作,稍后我将为棒添加某种 onClick 事件,以便我可以通过单击删除它们在他们身上,所以解决方案也需要与之兼容......谢谢!

Sta*_*nny 6

你可以找到该线的法线。这可以通过减去位置p1Posp2Pos(并翻转 x 或 y 的符号以获得 90\xc2\xb0 旋转)并将其除以线的长度来完成。线的长度可以通过毕达哥拉斯定理找到,因为它可以被认为是直角三角形的斜边。

\n
auto diff = p1Pos - p2Pos;\nauto length = std::sqrt(diff.x * diff.x + diff.y * diff.y);\nauto normal = sf::Vector2f(p1Pos.y - p2Pos.y, p2Pos.x - p1Pos.x) / length;\nauto thickness = 15.0f;\n\nshape[0].position = sf::Vector2f(p1Pos.x + normal.x * thickness, p1Pos.y + normal.y * thickness);\nshape[1].position = sf::Vector2f(p1Pos.x - normal.x * thickness, p1Pos.y - normal.y * thickness);\nshape[2].position = sf::Vector2f(p2Pos.x - normal.x * thickness, p2Pos.y - normal.y * thickness);\nshape[3].position = sf::Vector2f(p2Pos.x + normal.x * thickness, p2Pos.y + normal.y * thickness);\n
Run Code Online (Sandbox Code Playgroud)\n

这是结果:\n线

\n