lib/prawn/graphics.rb in prawn-2.4.0 vs lib/prawn/graphics.rb in prawn-2.5.0

- old
+ new

@@ -14,16 +14,12 @@ require_relative 'graphics/transparency' require_relative 'graphics/transformation' require_relative 'graphics/patterns' module Prawn - # Implements the drawing facilities for Prawn::Document. + # Implements the drawing facilities for {Prawn::Document}. # Use this to draw the most beautiful imaginable things. - # - # This file lifts and modifies several of PDF::Writer's graphics functions - # ruby-pdf.rubyforge.org - # module Graphics include BlendMode include Color include Dash include CapStyle @@ -36,331 +32,420 @@ ####################################################################### # Low level drawing operations must map the point to absolute coords! # ####################################################################### - # Moves the drawing position to a given point. The point can be - # specified as a tuple or a flattened argument list + # Moves the drawing position to a given point. The point can be specified as + # a tuple or a flattened argument list. # - # pdf.move_to [100,50] - # pdf.move_to(100,50) + # @example + # pdf.move_to [100, 50] + # pdf.move_to(100, 50) # + # @overload move_to(point) + # @param point [Array(Number, Number)] + # @return [void] + # @overload move_to(x, y) + # @param x [Number] + # @param y [Number] + # @return [void] def move_to(*point) xy = PDF::Core.real_params(map_to_absolute(point)) renderer.add_content("#{xy} m") end # Draws a line from the current drawing position to the specified point. # The destination may be described as a tuple or a flattened list: # - # pdf.line_to [50,50] - # pdf.line_to(50,50) + # @example + # pdf.line_to [50, 50] + # pdf.line_to(50, 50) # + # @overload line_to(point) + # @param point [Array(Number, Number)] + # @return [void] + # @overload line_to(x, y) + # @param x [Number] + # @param y [Number] + # @return [void] def line_to(*point) xy = PDF::Core.real_params(map_to_absolute(point)) renderer.add_content("#{xy} l") end # Draws a Bezier curve from the current drawing position to the # specified point, bounded by two additional points. # - # pdf.curve_to [100,100], :bounds => [[90,90],[75,75]] + # @example + # pdf.curve_to [100, 100], bounds: [[90, 90], [75, 75]] # + # @param dest [Array(Number, Number)] + # @param options [Hash] + # @option options :bounds [Array(Array(Number, Number), Array(Number, Number))] + # @return [void] def curve_to(dest, options = {}) options[:bounds] || raise( Prawn::Errors::InvalidGraphicsPath, - 'Bounding points for bezier curve must be specified ' \ - 'as :bounds => [[x1,y1],[x2,y2]]' + 'Bounding points for bezier curve must be specified as :bounds => [[x1,y1],[x2,y2]]', ) curve_points = PDF::Core.real_params( - (options[:bounds] << dest).flat_map { |e| map_to_absolute(e) } + (options[:bounds] << dest).flat_map { |e| map_to_absolute(e) }, ) renderer.add_content("#{curve_points} c") end - # Draws a rectangle given <tt>point</tt>, <tt>width</tt> and - # <tt>height</tt>. The rectangle is bounded by its upper-left corner. + # Draws a rectangle given `point`, `width and `height`. The rectangle is + # bounded by its upper-left corner. # - # pdf.rectangle [300,300], 100, 200 + # @example + # pdf.rectangle [300, 300], 100, 200 # + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @return [void] def rectangle(point, width, height) x, y = map_to_absolute(point) box = PDF::Core.real_params([x, y - height, width, height]) renderer.add_content("#{box} re") end - # Draws a rounded rectangle given <tt>point</tt>, <tt>width</tt> and - # <tt>height</tt> and <tt>radius</tt> for the rounded corner. The rectangle - # is bounded by its upper-left corner. + # Draws a rounded rectangle given `point`, `width`, `height`, and `radius` + # for the rounded corner. The rectangle is bounded by its upper-left corner. # - # pdf.rounded_rectangle [300,300], 100, 200, 10 + # @example + # pdf.rounded_rectangle [300, 300], 100, 200, 10 # + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @param radius [Number] + # @return [void] def rounded_rectangle(point, width, height, radius) x, y = point rounded_polygon( - radius, point, [x + width, y], [x + width, y - height], [x, y - height] + radius, point, [x + width, y], [x + width, y - height], [x, y - height], ) end ########################################################### # Higher level functions: May use relative coords # ########################################################### - # Sets line thickness to the <tt>width</tt> specified. + # Sets line thickness to the `width` specified. # + # @param width [Number] + # @return [void] def line_width=(width) self.current_line_width = width write_line_width end # When called without an argument, returns the current line thickness. # When called with an argument, sets the line thickness to the specified - # value (in PDF points) + # value (in PDF points). # + # @example # pdf.line_width #=> 1 # pdf.line_width(5) # pdf.line_width #=> 5 # + # @overload line_width() + # @return [Number] + # @overload line_width(width) + # @param width [Number] + # @return [void] def line_width(width = nil) if width self.line_width = width else current_line_width end end # Draws a line from one point to another. Points may be specified as - # tuples or flattened argument list: + # tuples or flattened argument list. # - # pdf.line [100,100], [200,250] - # pdf.line(100,100,200,250) + # @example + # pdf.line [100, 100], [200, 250] + # pdf.line(100, 100, 200, 250) # + # @overload line(point1, point2) + # @param point1 [Array(Number, Number)] + # @param point2 [Array(Number, Number)] + # @return [void] + # @overload line(x1, y1, x2, y2) + # @param x1 [Number] + # @param y1 [Number] + # @param x2 [Number] + # @param y2 [Number] + # @return [void] def line(*points) x0, y0, x1, y1 = points.flatten move_to(x0, y0) line_to(x1, y1) end - # Draws a horizontal line from <tt>x1</tt> to <tt>x2</tt> at the - # current <tt>y</tt> position, or the position specified by the :at option. + # Draws a horizontal line from `x1` to `x2` at the current {Document#y} + # position, or the position specified by the `:at` option. # - # # draw a line from [25, 75] to [100, 75] - # horizontal_line 25, 100, :at => 75 + # @example Draw a line from `[25, 75]` to `[100, 75]` + # horizontal_line 25, 100, at: 75 # + # @param x1 [Number] + # @param x2 [Number] + # @param options [Hash] + # @option options :at [Number] + # @return [void] def horizontal_line(x1, x2, options = {}) - y1 = options[:at] || y - bounds.absolute_bottom + y1 = options[:at] || (y - bounds.absolute_bottom) line(x1, y1, x2, y1) end # Draws a horizontal line from the left border to the right border of the - # bounding box at the current <tt>y</tt> position. + # bounding box at the current {Document#y} position. # + # @return [void] def horizontal_rule horizontal_line(bounds.left, bounds.right) end - # Draws a vertical line at the x cooordinate given by :at from y1 to y2. + # Draws a vertical line at the x coordinate given by `:at` from `y1` to + # `y2`. # - # # draw a line from [25, 100] to [25, 300] - # vertical_line 100, 300, :at => 25 + # @example Draw a line from `[25, 100]` to `[25, 300]` + # vertical_line 100, 300, at: 25 # + # @param y1 [Number] + # @param y2 [Number] + # @param params [Hash] + # @option params :at [Number] + # @return [void] def vertical_line(y1, y2, params) line(params[:at], y1, params[:at], y2) end # Draws a Bezier curve between two points, bounded by two additional # points # - # pdf.curve [50,100], [100,100], :bounds => [[90,90],[75,75]] + # @example + # pdf.curve [50, 100], [100, 100], bounds: [[90, 90], [75, 75]] # + # @param origin [Array(Number, Number)] + # @param dest [Array(Number, Number)] + # @param options [Hash] + # @option options :bounds [Array(Array(Number, Number), Array(Number, Number))] + # @return [void] def curve(origin, dest, options = {}) move_to(*origin) curve_to(dest, options) end # This constant is used to approximate a symmetrical arc using a cubic # Bezier curve. - # KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0) - # Draws a circle of radius <tt>radius</tt> with the centre-point at - # <tt>point</tt> as a complete subpath. The drawing point will be moved to + # Draws a circle of radius `radius` with the centre-point at + # `point` as a complete subpath. The drawing point will be moved to # the centre-point upon completion of the drawing the circle. # - # pdf.circle [100,100], 25 + # @example + # pdf.circle [100, 100], 25 # + # @param center [Array(Number, Number)] + # @param radius [Number] + # @return [void] def circle(center, radius) ellipse(center, radius, radius) end - # Draws an ellipse of +x+ radius <tt>radius1</tt> and +y+ radius - # <tt>radius2</tt> with the centre-point at <tt>point</tt> as a complete - # subpath. The drawing point will be moved to the centre-point upon - # completion of the drawing the ellipse. + # Draws an ellipse of `x` radius `radius1` and `y` radius `radius2` with the + # centre-point at `point` as a complete subpath. The drawing point will be + # moved to the centre-point upon completion of the drawing the ellipse. # - # # draws an ellipse with x-radius 25 and y-radius 50 - # pdf.ellipse [100,100], 25, 50 + # @example Draws an ellipse with x-radius 25 and y-radius 50 + # pdf.ellipse [100, 100], 25, 50 # + # @param point [Array(Number, Number)] + # @param radius1 [Number] + # @param radius2 [Number] + # @return [void] def ellipse(point, radius1, radius2 = radius1) x, y = point l1 = radius1 * KAPPA l2 = radius2 * KAPPA move_to(x + radius1, y) # Upper right hand corner - curve_to [x, y + radius2], - bounds: [[x + radius1, y + l2], [x + l1, y + radius2]] + curve_to( + [x, y + radius2], + bounds: [[x + radius1, y + l2], [x + l1, y + radius2]], + ) # Upper left hand corner - curve_to [x - radius1, y], - bounds: [[x - l1, y + radius2], [x - radius1, y + l2]] + curve_to( + [x - radius1, y], + bounds: [[x - l1, y + radius2], [x - radius1, y + l2]], + ) # Lower left hand corner - curve_to [x, y - radius2], - bounds: [[x - radius1, y - l2], [x - l1, y - radius2]] + curve_to( + [x, y - radius2], + bounds: [[x - radius1, y - l2], [x - l1, y - radius2]], + ) # Lower right hand corner - curve_to [x + radius1, y], - bounds: [[x + l1, y - radius2], [x + radius1, y - l2]] + curve_to( + [x + radius1, y], + bounds: [[x + l1, y - radius2], [x + radius1, y - l2]], + ) move_to(x, y) end # Draws a polygon from the specified points. # - # # draws a snazzy triangle + # @example Draws a snazzy triangle # pdf.polygon [100,100], [100,200], [200,200] # + # @param points [Array<Array(Number, Number)>] + # @return [void] def polygon(*points) - move_to points[0] - (points[1..-1] << points[0]).each do |point| + move_to(points[0]) + (points[1..] << points[0]).each do |point| line_to(*point) end # close the path - renderer.add_content 'h' + renderer.add_content('h') end # Draws a rounded polygon from specified points using the radius to define - # bezier curves + # bezier curves. # - # # draws a rounded filled in polygon + # @example Draws a rounded filled in polygon # pdf.fill_and_stroke_rounded_polygon( # 10, [100, 250], [200, 300], [300, 250], [300, 150], [200, 100], # [100, 150] # ) + # + # @param radius [Number] + # @param points [Array<Array(Number, Number)>] + # @return [void] def rounded_polygon(radius, *points) - move_to point_on_line(radius, points[1], points[0]) + move_to(point_on_line(radius, points[1], points[0])) sides = points.size points << points[0] << points[1] sides.times do |i| rounded_vertex(radius, points[i], points[i + 1], points[i + 2]) end # close the path - renderer.add_content 'h' + renderer.add_content('h') end # Creates a rounded vertex for a line segment used for building a rounded # polygon requires a radius to define bezier curve and three points. The # first two points define the line segment and the third point helps define # the curve for the vertex. + # + # @param radius [Number] + # @param points [Array(Array(Number, Number), Array(Number, Number), Array(Number, Number))] + # @return [void] def rounded_vertex(radius, *points) radial_point1 = point_on_line(radius, points[0], points[1]) bezier_point1 = point_on_line( - (radius - radius * KAPPA), + (radius - (radius * KAPPA)), points[0], - points[1] + points[1], ) radial_point2 = point_on_line(radius, points[2], points[1]) bezier_point2 = point_on_line( - (radius - radius * KAPPA), + (radius - (radius * KAPPA)), points[2], - points[1] + points[1], ) line_to(radial_point1) curve_to(radial_point2, bounds: [bezier_point1, bezier_point2]) end # Strokes the current path. If a block is provided, yields to the block - # before closing the path. See Graphics::Color for color details. + # before closing the path. See {Graphics::Color} for color details. # + # @yield + # @return [void] def stroke yield if block_given? - renderer.add_content 'S' + renderer.add_content('S') end - # Closes and strokes the current path. If a block is provided, yields to - # the block before closing the path. See Graphics::Color for color details. + # Closes and strokes the current path. If a block is provided, yields to the + # block before closing the path. See {Graphics::Color} for color details. # + # @yield + # @return [void] def close_and_stroke yield if block_given? - renderer.add_content 's' + renderer.add_content('s') end - # Draws and strokes a rectangle represented by the current bounding box + # Draws and strokes a rectangle represented by the current bounding box. # + # @return [void] def stroke_bounds - stroke_rectangle bounds.top_left, bounds.width, bounds.height + stroke_rectangle(bounds.top_left, bounds.width, bounds.height) end # Draws and strokes X and Y axes rulers beginning at the current bounding # box origin (or at a custom location). # - # == Options - # - # +:at+:: - # Origin of the X and Y axes (default: [0, 0] = origin of the bounding - # box) - # - # +:width+:: - # Length of the X axis (default: width of the bounding box) - # - # +:height+:: - # Length of the Y axis (default: height of the bounding box) - # - # +:step_length+:: - # Length of the step between markers (default: 100) - # - # +:negative_axes_length+:: - # Length of the negative parts of the axes (default: 20) - # - # +:color+: + # @param options [Hash] + # @option options :at [Array(Number, Number)] ([0, 0], origin of the bounding box) + # Origin of the X and Y axes. + # @option options :width [Number] (width of the bounding box) + # Length of the X axis. + # @option options :height [Number] (height of the bounding box) + # Length of the Y axis. + # @option options :step_length [Number] (100) + # Length of the step between markers. + # @option options :negative_axes_length [Number] (20) + # Length of the negative parts of the axes. + # @option options :color [String, Array<Number>] # The color of the axes and the text. - # + # @return [void] def stroke_axis(options = {}) options = { at: [0, 0], - height: bounds.height.to_i - (options[:at] || [0, 0])[1], - width: bounds.width.to_i - (options[:at] || [0, 0])[0], + height: bounds.height - (options[:at] || [0, 0])[1], + width: bounds.width - (options[:at] || [0, 0])[0], step_length: 100, negative_axes_length: 20, - color: '000000' + color: '000000', }.merge(options) Prawn.verify_options( %i[at width height step_length negative_axes_length color], - options + options, ) save_graphics_state do fill_color(options[:color]) stroke_color(options[:color]) dash(1, space: 4) stroke_horizontal_line( options[:at][0] - options[:negative_axes_length], options[:at][0] + options[:width], - at: options[:at][1] + at: options[:at][1], ) stroke_vertical_line( options[:at][1] - options[:negative_axes_length], options[:at][1] + options[:height], - at: options[:at][0] + at: options[:at][0], ) undash fill_circle(options[:at], 1) @@ -368,263 +453,288 @@ .step(options[:step_length]) do |point| fill_circle([options[:at][0] + point, options[:at][1]], 1) draw_text( point, at: [options[:at][0] + point - 5, options[:at][1] - 10], - size: 7 + size: 7, ) end (options[:step_length]..options[:height]) .step(options[:step_length]) do |point| fill_circle([options[:at][0], options[:at][1] + point], 1) draw_text( point, at: [options[:at][0] - 17, options[:at][1] + point - 2], - size: 7 + size: 7, ) end end end - # Closes and fills the current path. See Graphics::Color for color details. + # Closes and fills the current path. See {Graphics::Color} for color details. # - # If the option :fill_rule => :even_odd is specified, Prawn will use the + # If the option `fill_rule: :even_odd` is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # + # @param options [Hash] + # @option options :fill_rule [Symbol] + # @yield + # @return [void] def fill(options = {}) yield if block_given? renderer.add_content(options[:fill_rule] == :even_odd ? 'f*' : 'f') end # Closes, fills, and strokes the current path. If a block is provided, - # yields to the block before closing the path. See Graphics::Color for + # yields to the block before closing the path. See {Graphics::Color} for # color details. # - # If the option :fill_rule => :even_odd is specified, Prawn will use the + # If the option `fill_rule: :even_odd` is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # + # @param options [Hash] + # @option options :fill_rule [Symbol] + # @yield + # @return [void] def fill_and_stroke(options = {}) yield if block_given? renderer.add_content(options[:fill_rule] == :even_odd ? 'b*' : 'b') end # Closes the current path. # def close_path - renderer.add_content 'h' + renderer.add_content('h') end - ## - # :method: stroke_rectangle + # @!method fill_rectangle(point, width, height) + # Draws and fills a rectangle given `point`, `width`, and `height`. The + # rectangle is bounded by its upper-left corner. # - # Draws and strokes a rectangle given +point+, +width+ and +height+. The - # rectangle is bounded by its upper-left corner. - # - # :call-seq: - # stroke_rectangle(point,width,height) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @return [void] - ## - # :method: fill_rectangle + # @!method stroke_rectangle(point, width, height) + # Draws and strokes a rectangle given `point`, `width`, and `height`. The + # rectangle is bounded by its upper-left corner. # - # Draws and fills ills a rectangle given +point+, +width+ and +height+. The - # rectangle is bounded by its upper-left corner. - # - # :call-seq: - # fill_rectangle(point,width,height) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @return [void] - ## - # :method: fill_and_stroke_rectangle + # @!method fill_and_stroke_rectangle(point, width, height) + # Draws, fills, and strokes a rectangle given `point`, `width`, and + # `height`. The rectangle is bounded by its upper-left corner. # - # Draws, fills, and strokes a rectangle given +point+, +width+ and +height+. - # The rectangle is bounded by its upper-left corner. - # - # :call-seq: - # fill_and_stroke_rectangle(point,width,height) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @return [void] - ## - # :method: stroke_rounded_rectangle + # @!method fill_rounded_rectangle(point, width, height, radius) # - # Draws and strokes a rounded rectangle given +point+, +width+ and +height+ - # and +radius+ for the rounded corner. The rectangle is bounded by its - # upper-left corner. + # Draws and fills a rounded rectangle given `point`, `width` and `height`, + # and `radius` for the rounded corner. The rectangle is bounded by its + # upper-left corner. # - # :call-seq: - # stroke_rounded_rectangle(point,width,height,radius) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @param radius [Number] + # @return [void] - ## - # :method: fill_rounded_rectangle + # @!method stroke_rounded_rectangle(point, width, height, radius) + # Draws and strokes a rounded rectangle given `point`, `width` and + # `height`, and `radius` for the rounded corner. The rectangle is bounded + # by its upper-left corner. # - # Draws and fills a rounded rectangle given +point+, +width+ and +height+ - # and +radius+ for the rounded corner. The rectangle is bounded by its - # upper-left corner. - # - # :call-seq: - # fill_rounded_rectangle(point,width,height,radius) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @param radius [Number] + # @return [void] - ## - # :method: stroke_and_fill_rounded_rectangle + # @!method fill_and_stroke_rounded_rectangle(point, width, height, radius) # - # Draws, fills, and strokes a rounded rectangle given +point+, +width+ and - # +height+ and +radius+ for the rounded corner. The rectangle is bounded by - # its upper-left corner. + # Draws, fills, and strokes a rounded rectangle given `point`, `width`, + # and `height` and `radius` for the rounded corner. The rectangle is + # bounded by its upper-left corner. # - # :call-seq: - # stroke_and_fill_rounded_rectangle(point,width,height,radius) + # @param point [Array(Number, Number)] + # @param width [Number] + # @param height [Number] + # @param radius [Number] + # @return [void] - ## - # :method: stroke_line + # @!method stroke_line(*points) # - # Strokes a line from one point to another. Points may be specified as - # tuples or flattened argument list. + # Strokes a line from one point to another. Points may be specified as + # tuples or flattened argument list. # - # :call-seq: - # stroke_line(*points) + # @overload line(point1, point2) + # @param point1 [Array(Number, Number)] + # @param point2 [Array(Number, Number)] + # @return [void] + # @overload line(x1, y1, x2, y2) + # @param x1 [Number] + # @param y1 [Number] + # @param x2 [Number] + # @param y2 [Number] + # @return [void] - ## - # :method: stroke_horizontal_line + # @!method stroke_horizontal_line(x1, x2, options = {}) # - # Strokes a horizontal line from +x1+ to +x2+ at the current y position, or - # the position specified by the :at option. + # Strokes a horizontal line from `x1` to `x2` at the current y position, + # or the position specified by the :at option. # - # :call-seq: - # stroke_horizontal_line(x1,x2,options={}) + # @param x1 [Number] + # @param x2 [Number] + # @param options [Hash] + # @option options :at [Number] + # @return [void] - ## - # :method: stroke_horizontal_rule + # @!method stroke_horizontal_rule # - # Strokes a horizontal line from the left border to the right border of the - # bounding box at the current y position. + # Strokes a horizontal line from the left border to the right border of + # the bounding box at the current y position. # - # :call-seq: - # stroke_horizontal_rule + # @return [void] - ## - # :method: stroke_vertical_line + # @!method stroke_vertical_line(y1, y2, params) # - # Strokes a vertical line at the x coordinate given by :at from y1 to y2. + # Strokes a vertical line at the x coordinate given by `:at` from `y1` to + # `y2`. # - # :call-seq: - # stroke_vertical_line(y1,y2,params) + # @param y1 [Number] + # @param y2 [Number] + # @param params [Hash] + # @option params :at [Number] + # @return [void] - ## - # :method: stroke_curve + # @!method stroke_curve(origin, dest, options = {}) # - # Strokes a Bezier curve between two points, bounded by two additional - # points. + # Strokes a Bezier curve between two points, bounded by two additional + # points. # - # :call-seq: - # stroke_curve(origin,dest,options={}) + # @param origin [Array(Number, Number)] + # @param dest [Array(Number, Number)] + # @param options [Hash] + # @option options :bounds [Array(Array(Number, Number), Array(Number, Number))] + # @return [void] - ## - # :method: stroke_circle + # @!method: stroke_circle(center, radius) # - # Draws and strokes a circle of radius +radius+ with the centre-point at - # +point+. + # Draws and strokes a circle of radius `radius` with the centre-point at + # `point`. # - # :call-seq: - # stroke_circle(center,radius) + # @param center [Array(Number, Number)] + # @param radius [Number] + # @return [void] - ## - # :method: fill_circle + # @!method fill_circle(center, radius) # - # Draws and fills a circle of radius +radius+ with the centre-point at - # +point+. + # Draws and fills a circle of radius `radius` with the centre-point at + # `point`. # - # :call-seq: - # fill_circle(center,radius) + # @param center [Array(Number, Number)] + # @param radius [Number] + # @return [void] - ## - # :method: fill_and_stroke_circle + # @!method fill_and_stroke_circle(center, radius) # - # Draws, strokes, and fills a circle of radius +radius+ with the - # centre-point at +point+. + # Draws, strokes, and fills a circle of radius `radius` with the + # centre-point at `point`. # - # :call-seq: - # fill_and_stroke_circle(center,radius) + # @param center [Array(Number, Number)] + # @param radius [Number] + # @return [void] - ## - # :method: stroke_ellipse + # @!method stroke_ellipse(point, radius1, radius2 = radius1) # - # Draws and strokes an ellipse of x radius +r1+ and y radius +r2+ with the - # centre-point at +point+. + # Draws and strokes an ellipse of x radius `r1` and y radius `r2` with the + # centre-point at `point`. # - # :call-seq: - # stroke_ellipse(point, r1, r2 = r1) + # @param point [Array(Number, Number)] + # @param radius1 [Number] + # @param radius2 [Number] + # @return [void] - ## - # :method: fill_ellipse + # @!method fill_ellipse(point, radius1, radius2 = radius1) # - # Draws and fills an ellipse of x radius +r1+ and y radius +r2+ with the - # centre-point at +point+. + # Draws and fills an ellipse of x radius `r1` and y radius `r2` with the + # centre-point at `point`. # - # :call-seq: - # fill_ellipse(point, r1, r2 = r1) + # @param point [Array(Number, Number)] + # @param radius1 [Number] + # @param radius2 [Number] + # @return [void] - ## - # :method: fill_and_stroke_ellipse + # @!method fill_and_stroke_ellipse(point, radius1, radius2 = radius1) # - # Draws, strokes, and fills an ellipse of x radius +r1+ and y radius +r2+ - # with the centre-point at +point+. + # Draws, strokes, and fills an ellipse of x radius `r1` and y radius `r2` + # with the centre-point at `point`. # - # :call-seq: - # fill_and_stroke_ellipse(point, r1, r2 = r1) + # @param point [Array(Number, Number)] + # @param radius1 [Number] + # @param radius2 [Number] + # @return [void] - ## - # :method: stroke_polygon + # @!method stroke_polygon(*points) # # Draws and strokes a polygon from the specified points. # - # :call-seq: - # stroke_polygon(*points) + # @param points [Array<Array(Number, Number)>] + # @return [void] - ## - # :method: fill_polygon + # @!method fill_polygon(*points) # - # Draws and fills a polygon from the specified points. + # Draws and fills a polygon from the specified points. # - # :call-seq: - # fill_polygon(*points) + # @param points [Array<Array(Number, Number)>] + # @return [void] - ## - # :method: fill_and_stroke_polygon + # @!method fill_and_stroke_polygon(*points) # - # Draws, strokes, and fills a polygon from the specified points. + # Draws, strokes, and fills a polygon from the specified points. # - # :call-seq: - # fill_and_stroke_polygon(*points) + # @param points [Array<Array(Number, Number)>] + # @return [void] - ## - # :method: stroke_rounded_polygon + # @!method stroke_rounded_polygon(radius, *points) # - # Draws and strokes a rounded polygon from specified points, using +radius+ - # to define Bezier curves. + # Draws and strokes a rounded polygon from specified points, using + # `radius` to define Bezier curves. # - # :call-seq: - # stroke_rounded_polygon(radius, *points) + # @param radius [Number] + # @param points [Array<Array(Number, Number)>] + # @return [void] - ## - # :method: fill_rounded_polygon + # @!method fill_rounded_polygon(radius, *points) # - # Draws and fills a rounded polygon from specified points, using +radius+ to - # define Bezier curves. + # Draws and fills a rounded polygon from specified points, using `radius` + # to define Bezier curves. # - # :call-seq: - # fill_rounded_polygon(radius, *points) + # @param radius [Number] + # @param points [Array<Array(Number, Number)>] + # @return [void] - ## - # :method: fill_and_stroke_rounded_polygon + # @!method fill_and_stroke_rounded_polygon(radius, *points) # - # Draws, strokes, and fills a rounded polygon from specified points, using - # +radius+ to define Bezier curves. + # Draws, strokes, and fills a rounded polygon from specified points, using + # `radius` to define Bezier curves. # - # :call-seq: - # fill_and_stroke_rounded_polygon(radius, *points) + # @param radius [Number] + # @param points [Array<Array(Number, Number)>] + # @return [void] ops = %w[fill stroke fill_and_stroke] shapes = %w[ line_to curve_to rectangle rounded_rectangle line horizontal_line horizontal_rule vertical_line curve circle_at circle ellipse_at ellipse @@ -669,13 +779,13 @@ # Returns the coordinates for a point on a line that is a given distance # away from the second point defining the line segement def point_on_line(distance_from_end, *points) x0, y0, x1, y1 = points.flatten - length = Math.sqrt((x1 - x0)**2 + (y1 - y0)**2) + length = Math.sqrt(((x1 - x0)**2) + ((y1 - y0)**2)) p = (length - distance_from_end) / length - xr = x0 + p * (x1 - x0) - yr = y0 + p * (y1 - y0) + xr = x0 + (p * (x1 - x0)) + yr = y0 + (p * (y1 - y0)) [xr, yr] end end end