2016-05-25 10 views
0

это мой первый вопрос в Stackoverflow. Я создаю IDE для приключенческих игр в JAVA, и мне нужно установить зону, где можно передвигаться. Эта фигура - это многоугольник, который я могу рисовать уже с его вершиной, и я могу добавить новые точки. Проблема в том, что я не могу определить, находится ли положение мыши только над границей полигона. Это для создания новой вершины без деформации формы.Как нажимать на границу многоугольника и добавлять эту точку к полигону

Существует ли какой-либо способ выбрать границу/ход полигона и зарегистрировать это событие из PaintComponent?

Спасибо за любую помощь

ответ

0

вы можете перебирать точку полигона и определять, попали ли вы в линию.

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 (р) < 0,01' должно быть предпочтительным.

+0

Это работает !. Теперь мне нужно только реализовать метод сортировки вершин полигона, чтобы не деформировать его, я сделаю это сам. Но событие click на границе многоугольника работает отлично. Большое спасибо! –

+0

точки многоугольника отсортированы, уже ... заказ - порядок, как он нарисован. если вы хотите отсортировать точки вокруг центра (по часовой стрелке или против часовой стрелки), вы можете использовать 'Math.atan2 (double theta)' (см. также http://gamedev.stackexchange.com/questions/13229/sorting-array-of -точек-в-часовой порядка) –

0

Для того, чтобы знать, если пользователь нажал на точку вдоль границы вашего окрашенного многоугольника, вам нужно вычислить расстояние между точкой и щелкнули каждый отрезок. Найдите «point to line distance».

Поскольку край технически бесконечно тонкий (он не занимает никакой области), вам нужно будет проверить, находится ли точка в пределах небольшого порогового расстояния от края.

+0

Сначала, спасибо за вашу помощь. Проблема заключается в том, как регистрировать это расстояние с помощью события мыши. Есть несколько методов, таких как «distance()» Пример: mouseEvent.getPoint(). Distance (point), чтобы вычислить его, но мне понадобится также ширина обводки формы, чтобы щелкнуть ее и работать с ней. –