Точка в многоугольнике или нет тест

Я пытаюсь запрограммировать приложение Java, которое распечатывает, находится ли заданная мышь Point внутри или за пределами данного многоугольника. Но я не знаю, как работать с публичным логическим значением, содержащим Method. Кто-нибудь может мне помочь? Мои массивы arrx и arry сохранили координаты полигона, но как бы я мог сказать, что он должен проверить, есть ли точка внутри или вне моего полигона.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PiP extends JPanel implements MouseListener,MouseMotionListener  {
int x0,x1,y0,y1,i = 0,z = 1; 
int [][] pkt;
boolean zeichnen;
int []points = new int[100];
double y;
public static void main(String[] args) {
PiP p= new PiP();
}
public PiP() {
  JFrame fenster = new JFrame("Fenster");
  fenster.setBounds(0,0,600,600);
  fenster.setVisible(true);
  fenster.add(this); 
  fenster.addMouseListener(this);
  fenster.addMouseMotionListener(this);
  fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}  

public void mousePressed(MouseEvent e) {          //if mouse pressed
  pkt = new int[z][4]; 
  zeichnen = true;
  x1 = e.getX();
  y1 = e.getY();    
  pkt[i][0] = x1;
  pkt[i][1] = y1;
  System.out.println("x = "+pkt[i][0]+" und"+" y = "+pkt[i][1]);
  repaint();
  i++;
  z++;
}
public void Polygon(int arrx, int arry){
return arrx;
}
public boolean contains(int x1,int y1){     //here I tried to use contains, but I am 
return true;                                 //not sure how to take the variables from 
}                                           //the polygon to test if the Points are in
else {                                      //the Polygon
 return false;
}
}
public void mouseClicked(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseMoved(MouseEvent e) { }
public void mouseDragged(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void paint(Graphics g) {
    g.setColor(Color.RED);
int []arrx = {163,123,81,163,293,332,426,461,493,491,383,328,313,263};     //Poly x coordinates
int []arry = {143,219,359,433,478,523,448,401,306,238,219,205,168,158};   //Poly y coordinates
    g.drawPolygon(arrx,arry,arrx.length);
    if (zeichnen) {
     g.drawRect(x1,y1,10,10);
    g.fillRect(x1,y1,10,10);  
    } // end of if
  }
  }

1) Для более быстрой помощи опубликуйте минимальный воспроизводимый пример или Краткий, автономный, правильный пример. 2) Используйте логичную и последовательную форму отступов строк и блоков кода. Отступы предназначены для облегчения выполнения кода!

Andrew Thompson 02.11.2018 01:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
44
1

Ответы 1

//here I tried to use contains, but I am 
//not sure how to take the variables from 
//the polygon to test if the Points are in
//the Polygon

Установите Polygon на основе AWT из значений массива arrx и arry, затем вызовите метод contains(x,y).

НАПРИМЕР.

public boolean containsPoint(int x1, int y1) {
    Polygon polygon = new Polygon(arrx, arry, arrx.length);
    return polygon.contains(x1,y1);
}

В стороне

В код необходимо внести изменения до того, как можно будет выполнить этот тест (или до того, как код будет даже скомпилирован). Например, массивы arrx и arry должны быть доступны (в рамках) метода, который проверяет точку на включение.

подсказки

  • Для любого JComponent (например, JPanel) правильным методом переопределения для рисования является метод paintComponent(Graphics), а не метод paint(Graphics). Всегда сначала вызывайте супер-метод, чтобы очистить предыдущий рисунок.
  • Слушатели мыши должны быть добавлены на панель, а не во фрейм.
  • Вместо того, чтобы устанавливать размер фрейма, лучше переопределить getPreferedSize() из JPanel и pack() фрейм после добавления всех компонентов.
  • Графические интерфейсы Swing (& AWT) должны создаваться и обновляться на EDT.

Другие вопросы по теме