IceDragon200

[RUBY]Geometry

Apr 15th, 2012
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 6.77 KB | None | 0 0
  1. #==============================================================================#
  2. # ♥ Geometry
  3. #==============================================================================#
  4. # // • Created By    : IceDragon
  5. # // • Modified By   : IceDragon
  6. # // • Data Created  : 12/10/2011
  7. # // • Data Modified : 01/28/2012
  8. # // • Version       : 1.0
  9. #==============================================================================#
  10. # ● Change Log
  11. #     ♣ 12/10/2011 V1.0
  12. #     ♣ 01/16/2012 V1.0
  13. #         Renamed script (Oval & Circle) to Shapes
  14. #     ♣ 01/20/2012 V1.0
  15. #         Added
  16. #           Polygon
  17. #             .new(x, y, w, h, sides=6)
  18. #             side_angle_size()
  19. #             get_side_xy1(side=0)
  20. #             get_side_xy2(side=0, n=1)
  21. #     ♣ 01/24/2012 V1.0
  22. #         Renamed script (Shapes) to Geometry
  23. #     ♣ 01/24/2012 V1.0
  24. #         Added (Circle)
  25. #           calc_angle( x2, y2 )
  26. #==============================================================================#
  27. class Oval
  28.   include Mixin::Surface
  29.   include Mixin::RectExpansion
  30.   include RectOnly
  31.   attr_accessor :cx
  32.   attr_accessor :cy
  33.   attr_accessor :radius_x
  34.   attr_accessor :radius_y
  35.   attr_accessor :angle_offset
  36.  
  37.   POLE_ANGXY = {}
  38.   POLE_ANGXY[[ 0,  0]] = 0.0
  39.   POLE_ANGXY[[ 1,  0]] = 0.0
  40.   POLE_ANGXY[[ 0,  1]] = 90.0
  41.   POLE_ANGXY[[-1,  0]] = 180.0
  42.   POLE_ANGXY[[ 0, -1]] = -90.0
  43.   POLE_ANGXY[[ 1,  1]] = 45.0
  44.   POLE_ANGXY[[-1,  1]] = 135.0
  45.   POLE_ANGXY[[-1, -1]] = -135.0
  46.   POLE_ANGXY[[ 1, -1]] = -45.0
  47.   POLE_ANGXY.each_pair { |key, value| POLE_ANGXY[key] = value % 360 }
  48.   def initialize( x=0, y=0, radius_x=0, radius_y=0 )
  49.     @cx, @cy, @radius_x, @radius_y = x, y, radius_x, radius_y
  50.     @angle_offset = 0 #90
  51.   end
  52.   def ao
  53.     self.angle_offset
  54.   end  
  55.   def ao=(n)
  56.     self.angle_offset = n
  57.   end  
  58.   def x
  59.     cx - radius_x
  60.   end  
  61.   def y
  62.     cy - radius_y
  63.   end
  64.   def x=(n)
  65.     self.cx = n + radius_x
  66.   end
  67.   def y=(n)
  68.     self.cy = n + radius_y
  69.   end  
  70.   def diameter_x
  71.     @radius_x * 2
  72.   end
  73.   def diameter_y
  74.     @radius_y * 2
  75.   end
  76.   def rdx
  77.     radius_x
  78.   end
  79.   def rdy
  80.     radius_y
  81.   end  
  82.   def get_angle_xy( angle )
  83.     opangle = Math::PI * (angle - @angle_offset) / 180.0
  84.     return @cx + @radius_x * Math.cos(opangle), @cy + @radius_y * Math.sin(opangle)
  85.   end  
  86.   def get_xy_angle( x, y )
  87.     calc_angle(x, y)
  88.   end  
  89.   def calc_angle(x2, y2)
  90.     dx, dy  = Vector.xy_dist_from(x2, y2, @cx, @cy)
  91.     m = dx.abs.max(dy.abs).max(1).to_f
  92.     180 + (Math.atan2((dy)/m, (dx)/m) / Math::PI) * -180 rescue 0
  93.     #dx, dy  = Vector.xy_dist_from(@cx, @cy, x2, y2)
  94.     #poleang = POLE_ANGXY[[dx.pole, dy.pole]]
  95.     #m = dx.abs.max(dy.abs).max(1).to_f
  96.     #xang = (-dx.pole*dy.pole) * 45 * (dx.abs/m)
  97.     #yang = (dy.pole*dx.pole) * 45 * (dy.abs/m)
  98.     #return -(poleang + xang + yang) % 360
  99.   end
  100.   def calc_circ_dist(x2, y2)
  101.     dx, dy = Vector.xy_dist_from(@cx, @cy, x2, y2)
  102.     m = dx.abs.max(dy.abs).max(1).to_f
  103.     (dx * Math.cos(Math::PI * dx / m)).abs + (dy * Math.cos(Math::PI * dy / m)).abs
  104.   end  
  105.   def in_circ_area?(x,y)
  106.     calc_circ_dist(x,y).abs <= calc_circ_dist(*get_angle_xy(calc_angle(x,y))).abs
  107.   end
  108.   def set(*args)
  109.     if args[0].is_a?(Oval)
  110.       o = args[0]
  111.       self.x, self.y, self.radius_x, self.radius_y = o.x, o.y, o.rdx, o.rdy
  112.     else  
  113.       self.x, self.y = args[0] || self.x, args[1] || self.y
  114.       self.radius_x, self.radius_y = args[2] || self.rdx, args[3] || self.rdy
  115.     end
  116.     self
  117.   end  
  118.   def empty
  119.     set( 0, 0, 0, 0 )
  120.   end  
  121.   def width
  122.     @radius_x * 2
  123.   end
  124.   def height
  125.     @radius_y * 2
  126.   end  
  127.   def width=(n)
  128.     self.radius_x = n / 2
  129.   end  
  130.   def height=(n)
  131.     self.radius_y = n / 2
  132.   end  
  133.   def cyc_360_angle(n=0,clockwise=true)
  134.     clockwise ? n.next.modulo(360) : n.pred.modulo(360)
  135.   end  
  136.   def cycle_360(n=nil,clockwise=true)
  137.     i = 0
  138.     if n
  139.       n.times { |c| yield i, c ; i = cyc_360_angle(i,clockwise) }
  140.     else
  141.       loop do
  142.         yield i ; i = cyc_360_angle(i,clockwise)
  143.       end  
  144.     end
  145.   end
  146.   def circumfrence
  147.     2 * Math::PI * ((radius_x + radius_y) / 2)
  148.   end  
  149. end  
  150. class Circle < Oval
  151.   attr_reader :radius
  152.   def initialize( x=0, y=0, radius=0 )
  153.     super( x, y, 0, 0 )
  154.     self.radius = radius
  155.   end
  156.   def diameter
  157.     @radius * 2
  158.   end  
  159.   def radius=( n )
  160.     self.radius_x = self.radius_y = @radius = n
  161.   end
  162.   def set( *args )
  163.     args.push(args[2]) if args.size == 3
  164.     super( *args )
  165.   end
  166. end
  167. class Polygon < Oval
  168.   attr_accessor :sides
  169.   def initialize(sides, x=0, y=0, w=0, h=0)
  170.     super(x, y, w, h)
  171.     @sides = sides
  172.     @angle_offset = 180
  173.   end  
  174.   def side_angle_size()
  175.     360.0 / @sides
  176.   end  
  177.   def get_side_xy1(side=0) # // Exact Point
  178.     get_angle_xy(side_angle_size*side)
  179.   end  
  180.   def get_side_xy2(side=0, n=1) # // Line Point
  181.     get_angle_xy((side_angle_size*side)+(side_angle_size/2*n))
  182.   end
  183.   alias :get_side_xy :get_side_xy1
  184.   def next_side(n=0)
  185.     n.next.modulo(@sides)
  186.   end  
  187.   def prev_side(n=0)
  188.     n.pred.modulo(@sides)
  189.   end
  190.   def cyc_side(n=0,aclockwise=false)
  191.     aclockwise ? next_side(n) : prev_side(n)
  192.   end  
  193.   def cycle_sides(start_side=0, aclockwise=false, n=nil)
  194.     i = start_side
  195.     if n
  196.       n.times { |c| yield i, c ; i = cyc_side(i,aclockwise) }
  197.     else
  198.       loop do
  199.         yield i ; i = cyc_side(i,aclockwise)
  200.       end  
  201.     end  
  202.   end
  203. end  
  204. class Square < Polygon
  205.   def initialize( x, y, length )
  206.     super(4,x,y,length,length)
  207.   end
  208.   def length
  209.     return self.width
  210.   end  
  211.   def length=(n)
  212.     self.width = self.height = n
  213.   end  
  214.   def set( *args )
  215.     args.push(args[2]) if args.size == 3
  216.     super( *args )
  217.   end  
  218. end  
  219. class Cube
  220.   attr_accessor :x, :y, :z
  221.   attr_accessor :width, :length, :height
  222.   def initialize(*args)
  223.     set(*args)
  224.   end
  225.   def set(x=0,y=0,z=0,width=0,height=0,length=0)
  226.     self.x, self.y, self.z = x, y, z
  227.     self.width, self.length, self.height = width, length, height
  228.     self
  229.   end
  230.   def set2(x=0,y=0,z=0,width=0,length=0,height=0)
  231.     self.x, self.y, self.z = x, y, z
  232.     self.width, self.length, self.height = width, length, height
  233.     self
  234.   end
  235.   def xset(x=nil,y=nil,z=nil,w=nil,h=nil,l=nil)
  236.     x,y,z,w,h,l = x.get_values(:x,:y,:Z,:width,:height,:length) if(x.is_a?(Hash))
  237.     set(x||self.x,y||self.y,z||self.z,w||self.width,h||self.height,l||self.length)
  238.     self
  239.   end  
  240.   def to_a
  241.     return self.x, self.y, self.z, self.width, self.height, self.length
  242.   end  
  243.   def empty()
  244.     set()
  245.     self
  246.   end  
  247. end  
  248. #=■==========================================================================■=#
  249. #                           // ● End of File ● //                              #
  250. #=■==========================================================================■=#
Advertisement
Add Comment
Please, Sign In to add comment