lib/chunky_png/vector.rb in chunky_png-1.3.11 vs lib/chunky_png/vector.rb in chunky_png-1.3.12

- old
+ new

@@ -1,11 +1,10 @@ module ChunkyPNG - # Factory method for {ChunkyPNG::Vector} instances. # # @overload Vector(x0, y0, x1, y1, x2, y2, ...) - # Creates a vector by parsing two subsequent values in the argument list + # Creates a vector by parsing two subsequent values in the argument list # as x- and y-coordinate of a point. # @return [ChunkyPNG::Vector] The instantiated vector. # @overload Vector(string) # Creates a vector by parsing coordinates from the input string. # @return [ChunkyPNG::Vector] The instantiated vector. @@ -15,41 +14,39 @@ # # @return [ChunkyPNG::Vector] The vector created by this factory method. # @raise [ArgumentError] If the given arguments could not be understood as a vector. # @see ChunkyPNG::Vector def self.Vector(*args) - - return args.first if args.length == 1 && args.first.kind_of?(ChunkyPNG::Vector) - + return args.first if args.length == 1 && args.first.is_a?(ChunkyPNG::Vector) + if args.length == 1 && args.first.respond_to?(:scan) ChunkyPNG::Vector.new(ChunkyPNG::Vector.multiple_from_string(args.first)) # e.g. ['1,1 2,2 3,3'] else ChunkyPNG::Vector.new(ChunkyPNG::Vector.multiple_from_array(args)) # e.g. [[1,1], [2,2], [3,3]] or [1,1,2,2,3,3] end end - + # Class that represents a vector of points, i.e. a list of {ChunkyPNG::Point} instances. # - # Vectors can be created quite flexibly. See the {ChunkyPNG.Vector} factory methods for + # Vectors can be created quite flexibly. See the {ChunkyPNG.Vector} factory methods for # more information on how to construct vectors. class Vector - include Enumerable - + # @return [Array<ChunkyPNG::Point>] The array that holds all the points in this vector. attr_reader :points - + # Initializes a vector based on a list of Point instances. # # You usually do not want to use this method directly, but call {ChunkyPNG.Vector} instead. # # @param [Array<ChunkyPNG::Point>] points # @see ChunkyPNG.Vector def initialize(points = []) @points = points end - + # Iterates over all the edges in this vector. # # An edge is a combination of two subsequent points in the vector. Together, they will form # a path from the first point to the last point # @@ -61,49 +58,49 @@ def each_edge(close = true) raise ChunkyPNG::ExpectationFailed, "Not enough points in this path to draw an edge!" if length < 2 points.each_cons(2) { |a, b| yield(a, b) } yield(points.last, points.first) if close end - + # Returns the point with the given indexof this vector. # @param [Integer] index The 0-based index of the point in this vector. - # @param [ChunkyPNG::Point] The point instance. + # @return [ChunkyPNG::Point] The point instance. def [](index) points[index] end - + # Returns an enumerator that will iterate over all the edges in this vector. # @param (see #each_edge) # @return [Enumerator] The enumerator that iterates over the edges. # @raise [ChunkyPNG::ExpectationFailed] if the vector contains less than two points. # @see #each_edge def edges(close = true) to_enum(:each_edge, close) end - + # Returns the number of points in this vector. # @return [Integer] The length of the points array. def length points.length end - + # Iterates over all the points in this vector # @yield [ChunkyPNG::Point] The points in the correct order. # @return [void] def each(&block) points.each(&block) end - + # Comparison between two vectors for quality. # @param [ChunkyPNG::Vector] other The vector to compare with. # @return [true, false] true if the list of points are identical def eql?(other) other.points == points end - - alias_method :==, :eql? + alias == eql? + # Returns the range in x-coordinates for all the points in this vector. # @return [Range] The (inclusive) range of x-coordinates. def x_range Range.new(*points.map { |p| p.x }.minmax) end @@ -111,17 +108,17 @@ # Returns the range in y-coordinates for all the points in this vector. # @return [Range] The (inclusive) range of y-coordinates. def y_range Range.new(*points.map { |p| p.y }.minmax) end - + # Finds the lowest x-coordinate in this vector. # @return [Integer] The lowest x-coordinate of all the points in the vector. def min_x x_range.first end - + # Finds the highest x-coordinate in this vector. # @return [Integer] The highest x-coordinate of all the points in the vector. def max_x x_range.last end @@ -129,25 +126,25 @@ # Finds the lowest y-coordinate in this vector. # @return [Integer] The lowest y-coordinate of all the points in the vector. def min_y y_range.first end - + # Finds the highest y-coordinate in this vector. # @return [Integer] The highest y-coordinate of all the points in the vector. def max_y y_range.last end - + # Returns the offset from (0,0) of the minimal bounding box of all the # points in this vector # @return [ChunkyPNG::Point] A point that describes the top left corner if a # minimal bounding box would be drawn around all the points in the vector. def offset ChunkyPNG::Point.new(min_x, min_y) end - + # Returns the width of the minimal bounding box of all the points in this vector. # @return [Integer] The x-distance between the points that are farthest from each other. def width 1 + (max_x - min_x) end @@ -155,30 +152,30 @@ # Returns the height of the minimal bounding box of all the points in this vector. # @return [Integer] The y-distance between the points that are farthest from each other. def height 1 + (max_y - min_y) end - + # Returns the dimension of the minimal bounding rectangle of the points in this vector. - # @return [ChunkyPNG::Dimension] The dimension instance with the width and height + # @return [ChunkyPNG::Dimension] The dimension instance with the width and height def dimension ChunkyPNG::Dimension.new(width, height) end - + # @return [Array<ChunkyPNG::Point>] The list of points interpreted from the input array. def self.multiple_from_array(source) return [] if source.empty? - if source.first.kind_of?(Numeric) || source.first =~ /^\d+$/ + if source.first.is_a?(Numeric) || source.first =~ /^\d+$/ raise ArgumentError, "The points array is expected to have an even number of items!" if source.length % 2 != 0 points = [] source.each_slice(2) { |x, y| points << ChunkyPNG::Point.new(x, y) } return points else source.map { |p| ChunkyPNG::Point(p) } end end - + # @return [Array<ChunkyPNG::Point>] The list of points parsed from the string. def self.multiple_from_string(source_str) multiple_from_array(source_str.scan(/[\(\[\{]?(\d+)\s*[,x]?\s*(\d+)[\)\]\}]?/)) end end