import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.applet.Applet;

public class tocka_u_mnogokutu extends Applet implements MouseListener, ActionListener {
int br=0, brcl, xt, yt, brs, xg; /*xt, yt-ispitivana točka,  br-brojač klikova,  brcl-broj točaka od kojih se sastoji mnogokut */
int[] x=new int[30]; /*točke mnogokuta*/
int[] y=new int[30]; /*točke mnogokuta*/
TextField tekst; String s;

public void init()
{ tekst=new TextField(10);
  Button b=new Button("Pritisni");
  add(tekst);
  b.addActionListener(this);
  add(b);
  addMouseListener(this); }

public void actionPerformed(ActionEvent e) {
s=tekst.getText();
brcl=Integer.parseInt(s); /*Na ovaj način dobijemo broj točaka u mnogokutu*/
repaint(); }

public void paint(Graphics g) {
Graphics2D g2=(Graphics2D) g;
double r1=5;
if (br<=brcl) {
for (int i=0; i<br; i++) {
if (i>0) { Line2D.Double crta3 =new Line2D.Double(x[i-1], y[i-1], x[i], y[i]); g2.draw(crta3); } /*Crta crte u skladu s pikanjem točaka*/
Shape krug1=new Ellipse2D.Double (x[i]-r1, y[i]-r1, 2*r1, 2*r1);
g2.draw(krug1); } } /*Iscrtavaju se točke mnogokuta nakon klika mišem*/

if (br>brcl) {
brs=0; /*Broji sjecišta polupravca od točke sa stranicama mnogokuta*/

for (int i=1; i<brcl-1; i++) {
if ((xt<x[i] & yt==y[i]) & ((y[i-1]<y[i] & y[i]<y[i+1]) || (y[i+1]<y[i] & y[i]<y[i-1]))) { brs=brs+1; } } /*Uvjet je li polupravac prolazi kroz točku mnogokuta*/
if ((xt<x[0] & yt==y[0]) & ((y[brcl-1]<y[0] & y[0]<y[1]) || (y[1]<y[0] & y[0]<y[brcl-1]))) { brs=brs+1; } /*Poseban uvjet za prvu točku*/
if ((xt<x[brcl-1] & yt==y[brcl-1]) & ((y[brcl-2]<y[brcl-1] & y[brcl-1]<y[0]) || (y[0]<y[brcl-1] & y[brcl-1]<y[brcl-2]))) { brs=brs+1; } /*Poseban uvjet za zadnju točku*/

for (int i=0; i<brcl-1; i++) {
xg=(int) ((((double)(x[i+1]-x[i])/(double)(y[i+1]-y[i])))*(double)(yt-y[i])+x[i]); /*sjecište vodoravnog pravca sa stranicom mnogokuta*/
if (xt<xg) { /*Prihvaća se samo sjecište koje je desno od provjeravane točke*/
if ((yt<y[i] & yt>y[i+1]) || (yt>y[i] & yt<y[i+1])) { brs=brs+1; } } /*uvijet je li pravac sijeće stranicu mnogokuta*/
Line2D.Double crta =new Line2D.Double(x[i], y[i], x[i+1], y[i+1]);
g2.draw(crta); } /*Crta stranice mnogokuta*/
xg=(int) ((((double)(x[brcl-1]-x[0])/(double)(y[brcl-1]-y[0])))*(double)(yt-y[0])+x[0]); /*sjecište vodoravnog pravca sa stranicom(između prve i zadnje točke) mnogokuta*/
if (xt<xg) {
if ((yt<y[0] & yt>y[brcl-1]) || (yt>y[0] & yt<y[brcl-1])) { brs=brs+1; } } /*Posebni uvjeti za stranicu između prve i zadnje točke mnogokuta*/
Line2D.Double crta1 =new Line2D.Double(x[0], y[0], x[brcl-1], y[brcl-1]);
g2.draw(crta1);
Shape krug1=new Ellipse2D.Double (xt-r1, yt-r1, 2*r1, 2*r1);
g2.setColor(Color.blue);
g2.draw(krug1); /*Crta točku koju treba ispitati*/
if (brs%2==0) { g2.drawString("Točka je izvan mnogokuta",100,100); }
if (brs%2!=0) { g2.drawString("Točka je unutar mnogokuta",100,100); } } /*Kraj 'if (br>brcl)'*/
}

public void mouseClicked(MouseEvent e) {
  if (br<brcl) {
  x[br]=e.getX();
  y[br]=e.getY(); }
  br=br+1;
  if (br>brcl) { xt=e.getX(); yt=e.getY(); }
  repaint();
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}