用于多边形碰撞的Java算法(多边形点):退化的@边界问题

时间:2015-10-27 17:37:23

标签: java algorithm polygon intersect point-in-polygon

我的java程序需要一个检查多边形碰撞的函数,但我尝试的算法(对于多边形点)对我的需求不正确,退化情况对我来说是个问题。

这是我试图通过我的程序达到的目标:我有2个多边形,并希望将它们放在一起。我想将它们放在它们的顶点上并沿着边缘旋转以适合最佳状态。因此,如果他们相交或不相交,我需要碰撞检测。

我最大的问题是那些多边形边缘可能在同一点上。研究的算法决定它是否在多边形a或b中(主要是y值)。

我用的是什么

  • 具有x和y的双坐标的多边形
  • 标准java
  • 没有外部图书馆

我要求的规则:

  • 多边形可以具有相同的边和相同的顶点(可以在相同的边界上,但不是完整的多边形覆盖)
  • 不允许边缘相交
  • 不允许,一个多边形由另一个多边形(一个孔)完全包围。
  • (算法中可选的非常小的epsilon会很好,因为用double旋转不是很精确)

我也试过像Path2D.Double()这样的内部类,但是这个问题也没有成功。 我试过的最后一个算法(大约8个)是这样的: wiki.cizmar.org/doku.php?id=physics:point-in-polygon_problem_with_simulation_of_simplicity

这是链接算法的C代码(我试过的最后一个)

private boolean testPointInsidePolygon3c(Punkt p, Form f){
    int number_of_vertices = f.getCoords().size();
    int i, j = 0;
    boolean odd = false;
    for (i = 0, j = number_of_vertices-1; i < number_of_vertices; j = i++) {
        if ( ((f.getCoords().get(i).getY() >p.getY()) != (f.getCoords().get(j).getY() >p.getY())) &&
            (   p.getX() < (f.getCoords().get(j).getX() -f.getCoords().get(i).getX())
                * (p.getY() -f.getCoords().get(i).getY())
                / (f.getCoords().get(j).getY() -f.getCoords().get(i).getY())
                + f.getCoords().get(i).getX())
            ){
            odd = !odd;
        }
    }
    return odd;
}

我改编的JAVA代码(Punkt = Point,Form.getCoords =带x,y的坐标列表)

typedef boost::asio::ip::tcp::socket    sock;

class server
{
public:
    server() : _ios(), _acceptor(_ios)
    {
        boost::asio::ip::tcp::resolver  resolver(_ios);
        boost::asio::ip::tcp::endpoint  endpoint(boost::asio::ip::tcp::v4(), PORT);

        _acceptor.open(endpoint.protocol());
        _acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
        _acceptor.bind(endpoint);
        _acceptor.listen();

        do_accept();
    }

    void run()
    {
        _ios.run();
    }

private:
    void do_accept()
    {
        auto socket = std::make_shared<TSock>(_ios);
        _acceptor.async_accept(*socket, std::bind(&server::handle_accept,
                                                  this, socket, std::placeholders::_1));
    }

    void handle_accept(std::shared_ptr<sock> socket, const boost::system::error_code& ec)
    {
        auto connection = std::make_shared<CCon>();

        if (connection->Accept(socket))
        {
            std::cout << "Connection accepted" << std::endl;
        }
        else
        {
            std::cout << "Connection not accepted" << std::endl;
        }

        do_accept();
    }

    boost::asio::io_service         _ios;
    boost::asio::ip::tcp::acceptor  _acceptor;

    std::set<std::shared_ptr<CCon>> _connections;
};

int32_t main(int32_t argc, char *argv[])
{
    server s;
    s.run();
}

要显示该问题:这是带有2个多边形的图片。蓝色顶点是麻烦。 source code Problem Example #1

我希望你能得到一些想法,链接,算法或任何东西。我被这个问题困扰了太长时间; - )

1 个答案:

答案 0 :(得分:0)

真可惜 - 我无法做一个完整正确的算法,解决了我的问题。

这就是我现在使用JTS-Library的原因! 有了重叠和封面/内部,我的测试用例中的所有内容都是正确的。