我的java程序需要一个检查多边形碰撞的函数,但我尝试的算法(对于多边形点)对我的需求不正确,退化情况对我来说是个问题。
这是我试图通过我的程序达到的目标:我有2个多边形,并希望将它们放在一起。我想将它们放在它们的顶点上并沿着边缘旋转以适合最佳状态。因此,如果他们相交或不相交,我需要碰撞检测。
我最大的问题是那些多边形边缘可能在同一点上。研究的算法决定它是否在多边形a或b中(主要是y值)。
我用的是什么
我要求的规则:
我也试过像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
我希望你能得到一些想法,链接,算法或任何东西。我被这个问题困扰了太长时间; - )
答案 0 :(得分:0)
真可惜 - 我无法做一个完整正确的算法,解决了我的问题。
这就是我现在使用JTS-Library的原因! 有了重叠和封面/内部,我的测试用例中的所有内容都是正确的。