Project1

标题: 计算两多边形是否香蕉的代码…… [打印本页]

作者: yangff    时间: 2011-5-29 13:37
标题: 计算两多边形是否香蕉的代码……
  1. module CV
  2.         module_function
  3.         class Point
  4.                 def initialize(x,y)
  5.                         @x=x.to_f
  6.                         @y=y.to_f
  7.                 end
  8.                 def x
  9.                         return @x
  10.                 end
  11.                 def y
  12.                         return @y
  13.                 end
  14.                 def x=(v)
  15.                         return (@x=v)
  16.                 end
  17.                 def y=(v)
  18.                         return (@y=v)
  19.                 end

  20.                 def in_polygon(p)
  21.                         p=p.points
  22.                         nCross=0
  23.                         for i in 0...p.size
  24.                                 p1=p[i]
  25.                                 p2=p[(i+1) % p.size]
  26.                                 next if p1.y == p2.y
  27.                                 next if y < [p1.y, p2.y].min
  28.                                 next if y >= [p1.y, p2.y].max
  29.                                
  30.                                 x1=(y - p1.y)*(p2.x - p1.x)/(p2.y - p1.y) + p1.x
  31.                                 #p  (p2.y - p1.y)
  32.                                 nCross+=1 if x1>x
  33.                         end
  34.                         #p nCross
  35.                         return (nCross % 2 == 1)
  36.                 end
  37.         end
  38.         class Grap
  39.        
  40.         end
  41.         class Polygon<Grap
  42.                 def initialize(*args)
  43.                         @points=args
  44.                 end
  45.                 def points
  46.                         return @points
  47.                 end
  48.                 def &(v)
  49.                         if v.is_a?(Grap)
  50.                                 if v.is_a?(Polygon)
  51.                                         for i in @points
  52.                                                 if i.in_polygon(v)==true
  53.                                                         return true
  54.                                                 end
  55.                                         end
  56.                                         for i in v.points
  57.                                                 if i.in_polygon(self)==true
  58.                                                         return true
  59.                                                 end
  60.                                         end
  61.                                 end
  62.                         end
  63.                         return false
  64.                 end
  65.         end
  66.         class Vector
  67.                
  68.         end

  69. end
  70. poy=CV::Polygon.new(CV::Point.new(0,0),CV::Point.new(1,2),CV::Point.new(5,5),CV::Point.new(5,15))
  71. poy1=CV::Polygon.new(CV::Point.new(300,500),CV::Point.new(100,200),CV::Point.new(500,500),CV::Point.new(500,1500))
  72. p poy&poy1
复制代码
效率一般……没做粗判定……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1