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

标签 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);
}

p1Posp2Pos 是点的中心坐标。

这让我明白了一条线显然不适用于移动的物体,因为矩形的角点是固定的,下面是一些例子:(在这个例子中,红点没有移动,而白点在移动)

Example Example 2

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

最佳答案

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

auto diff = p1Pos - p2Pos;
auto length = std::sqrt(diff.x * diff.x + diff.y * diff.y);
auto normal = sf::Vector2f(p1Pos.y - p2Pos.y, p2Pos.x - p1Pos.x) / length;
auto thickness = 15.0f;

shape[0].position = sf::Vector2f(p1Pos.x + normal.x * thickness, p1Pos.y + normal.y * thickness);
shape[1].position = sf::Vector2f(p1Pos.x - normal.x * thickness, p1Pos.y - normal.y * thickness);
shape[2].position = sf::Vector2f(p2Pos.x - normal.x * thickness, p2Pos.y - normal.y * thickness);
shape[3].position = sf::Vector2f(p2Pos.x + normal.x * thickness, p2Pos.y + normal.y * thickness);

结果如下: the line

关于c++ - 找到连接两个移动物体的矩形的 4 个角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69075168/

相关文章:

c++ - 有什么想法可以实现简单的 2D 天空吗?

c++ - unique_ptr - 无效指针和段错误

C++:友元函数

c++ - 你如何确定 MySQLCPPConn 库文件在哪里?

c++ - Win32 窗口样式重叠问题

php - 以百分比计算值范围

ruby - 十进制与任何其他 n 进制数字系统之间的相互转换

c++ - 调试时的奇怪值

c++ - 组件-实体-系统 - 输入处理

c++ - 黑莓 10 联系人图片到字节数组