fork download
  1. import java.awt.geom.Path2D;
  2. import java.util.Scanner;
  3. import java.util.stream.Stream;
  4.  
  5. /*
  6. プログラミングのお題スレ Part12
  7. //mevius.5ch.net/test/read.cgi/tech/1538096947/803
  8. > 803 名前:デフォルトの名無しさん[] 投稿日:2018/12/12(水) 02:35:41.59 ID:84v7sPOJ
  9. > お題
  10. > 2次元平面上で点(x,y)が点列(X1,Y1), (X2,Y2), ..., (Xn,Yn), (X1,Y1)を順に結んでできる多角形の内部にあるかどうか判定せよ
  11.  
  12. 内側の定義
  13. //docs.oracle.com/javase/jp/8/docs/api/java/awt/Shape.html#def_insideness
  14. */
  15. class Ideone
  16. {
  17. public static void main(String[] args)
  18. {
  19. try (Scanner in = new Scanner(System.in))
  20. {
  21. while (in.hasNextLine())
  22. {
  23. double[] ds = Stream.of(in.nextLine().split("[ ,]")).mapToDouble(Double::parseDouble).toArray();
  24. Path2D path = new Path2D.Double();
  25. path.moveTo(ds[2], ds[3]);
  26. for (int i = 4; i < ds.length - 1; i += 2)
  27. {
  28. path.lineTo(ds[i], ds[i + 1]);
  29. }
  30. boolean non_zero = path.contains(ds[0], ds[1]);
  31. path.setWindingRule(Path2D.WIND_EVEN_ODD);
  32. boolean even_odd = path.contains(ds[0], ds[1]);
  33. System.out.printf("non_zero:%s\teven_odd:%s%n", non_zero, even_odd);
  34. }
  35. }
  36. }
  37. }
  38.  
Success #stdin #stdout 0.16s 2184192KB
stdin
0.5,0.5 0,0 1,0 1,1 0,1
1.76,1.75 0,0 3,0 2,1.5 1,2.5 0,3
50,50 2,35 98,35 21,90 50,0 79,90
stdout
non_zero:true	even_odd:true
non_zero:false	even_odd:false
non_zero:true	even_odd:false