【问题标题】:How to click a Polygon border and add this point to polygon如何单击多边形边框并将此点添加到多边形
【发布时间】:2016-09-23 12:54:40
【问题描述】:

这是我在 Stackoverflow 中的第一个问题。 我正在为 JAVA 中的冒险游戏创建一个 IDE,我需要设置可步行区域。这个形状是一个多边形,我已经可以用他的顶点绘制,我可以添加新点。问题是我无法检测鼠标位置是否仅在多边形的边界上。这是为了创建新的顶点而不使形状变形。

是否存在任何方法来选择多边形的边框/笔划并将此事件注册到 PaintComponent 之外?

感谢您的帮助

【问题讨论】:

    标签: java graphics awt polygon graphics2d


    【解决方案1】:

    您可以遍历多边形的点并确定您是否命中了一条线。

    Polygon p; //your polygon
    int x_mouse;//your mouse click pos
    int y_mouse;
    for (int i = 0; i < p.npoints; i ++){
        int x_from = 0;
        int y_from = 0;         
        int x_to = 0;
        int y_to = 0;
    
        if (i == 0){ //i-1 == -1 -> p.npoints-1
            x_from = p.xpoints[p.npoints-1];
            y_from = p.ypoints[p.npoints-1];
        }else{
            x_from = p.xpoints[i-1];
            y_from = p.ypoints[i-1];
        }       
        x_to = p.xpoints[i];
        y_to = p.ypoints[i];
    
    
        Line2D line = new Line2D.Double(x_from, y_from, x_to, y_to);
        if (line.ptLineDist(new Point(x_mouse, y_mouse)) <= 0.01){
            //you hit
        }
    
    }
    

    查看Java - Point on line,了解为什么应该首选 'ptLineDist(p)

    【讨论】:

    • 它有效!现在我只需要实现一种方法来对多边形的顶点进行排序而不使其变形,我会自己做。但是多边形边框中的点击事件完美无缺。非常感谢!
    • 多边形点已经排序了,已经....顺序是如何绘制的。如果你想围绕一个中心对点进行排序(可能是顺时针或逆时针),你可以使用Math.atan2(double theta)(另见gamedev.stackexchange.com/questions/13229/…
    【解决方案2】:

    为了知道用户是否点击了绘制多边形边界上的某个点,您需要计算点击的点与每条线段之间的距离。搜索“point to line distance”。

    由于边缘在技术上是无限薄的(它不占用任何区域),因此您需要测试该点是否在边缘的某个小的阈值距离内。

    【讨论】:

    • 首先感谢您的帮助。问题在于如何用鼠标事件注册该距离。有一些方法,例如“distance()”示例:mouseEvent.getPoint().distance(point) 来计算它,但我也需要形状的笔画宽度才能单击它并使用它
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多