【问题标题】:Finding the 4 corners of a rectangle which connects two moving objects找到连接两个移动对象的矩形的 4 个角
【发布时间】:2023-03-31 02:22:01
【问题描述】:

我试图在两点之间划一条线,为此我使用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 是点的中心坐标。

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

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

【问题讨论】:

  • 所以基本上你想继续重新计算线端的角度,应该是 1)沿点各自的直径,2)垂直于线本身?
  • @AdamSmooch 呃,我想是吗?基本上矩形应该“旋转”(它实际上不会旋转,我只是用不同的点绘制它),它应该总是由四个 90 度角组成

标签: c++ math sfml


【解决方案1】:

你可以找到线的法线。这可以通过减去位置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);

结果如下:

【讨论】:

  • 这项工作绝对完美,无需修改,非常感谢!
【解决方案2】:

如果你需要用“粗线”(即矩形)连接点(x1,y1)和(x2,y2),可以通过先计算连接点1、2的线找到顶点。然后你从点 1 和 2 计算该线的法线。您的连接线的角系数为 (y2-y1)/(x2-x1),法线将具有 (x2-x1)/(y2-y1)。

然后,您的四个顶点位于这两条线上,距离点 1 和 2 分别为 d/2(d 是矩形的厚度)。 x1 = x2 或 y1 = y2 的情况比较特殊,因为连接线或其法线将具有无限的角系数。

有几个问题与这个问题有关 - this 是一个。

【讨论】:

    【解决方案3】:

    您正在寻找的概念是一个法线向量:

    sf::Vector2f p1ToP2{p1Pos - p2Pos};
    sf::Vector2f normal{p1ToP2.y, -p1ToP2.x}; // normal is now perpendicular to p1ToP2
    normal /= sqrt(pow(normal.x, 2) + pow(normal.y, 2)); // normal is now of magnitude 1
    normal *= 5; // ten pixels on each side
    

    然后你的四个角是: { p1Pos + 正常,p1Pos - 正常,p2Pos - 正常,p2Pos + 正常 }

    【讨论】:

      【解决方案4】:

      如果您能够获得具有方角的矩形,则可能需要在每次点相对于彼此移动时包括角计算

      因此,对于每个动作,您的计算将类似于:

      • 第 1 步:计算点 A、B 之间的角度(使用三角法) -> 称之为 theta。
      • 第 2 步:角将在 +/- 90 度。来自 theta,来自各个点的 2r。

      例如:

      • 如果 theta 为 45(如您的第一个示例),您的末端将延伸到 -45(或 315)和 135。
      • 如果 theta 为 102.5,您的两端将向 12.5 和 192.5 延伸。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2022-01-14
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多