Class: HexaPDF::Content::GraphicObject::SolidArc

Inherits:
Object
  • Object
show all
Defined in:
lib/hexapdf/content/graphic_object/solid_arc.rb

Overview

This graphic object represents a solid elliptical arc, i.e. an arc that has an inner and an outer set of a/b values.

Note that only the path itself is added to the canvas. So depending on the use-case the path itself still has to be, for example, stroked.

This graphic object is registered under the :solid_arc key for use with the HexaPDF::Content::Canvas class.

It can be used to create

  • an (elliptical) disk (when the inner a/b are zero and the difference between start and end angles is greater than or equal to 360),

    #>pdf-center
    canvas.fill_color("hp-blue").
      draw(:solid_arc, outer_a: 80, outer_b: 50).
      fill_stroke
    
  • an (elliptical) sector (when the inner a/b are zero and the difference between start and end angles is less than 360),

    #>pdf-center
    canvas.fill_color("hp-blue").
      draw(:solid_arc, outer_a: 80, outer_b: 50, start_angle: 20, end_angle: 230).
      fill_stroke
    
  • an (elliptical) annulus (when the inner a/b are nonzero and the difference between start and end angles is greater than or equal to 360),

    #>pdf-center
    canvas.fill_color("hp-blue").
      draw(:solid_arc, outer_a: 80, outer_b: 50, inner_a: 70, inner_b: 30).
      fill_stroke
    
  • and an (elliptical) *annular sector* (when the inner a/b are nonzero and the difference between start and end angles is less than 360)

    #>pdf-center
    canvas.fill_color("hp-blue").
      draw(:solid_arc, outer_a: 80, outer_b: 50, inner_a: 70, inner_b: 30,
           start_angle: 20, end_angle: 230).
      fill_stroke
    

See: Arc

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSolidArc

Creates a solid arc with default values (a unit disk at the origin).

Examples:

#>pdf-center
canvas.draw(:solid_arc).stroke


204
205
206
207
208
209
210
211
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 204

def initialize
  @cx = @cy = 0
  @inner_a = @inner_b = 0
  @outer_a = @outer_b = 1
  @start_angle = 0
  @end_angle = 0
  @inclination = 0
end

Instance Attribute Details

#cxObject (readonly)

x-coordinate of center point, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50).stroke


104
105
106
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 104

def cx
  @cx
end

#cyObject (readonly)

y-coordinate of center point, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cy: 50).stroke


115
116
117
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 115

def cy
  @cy
end

#end_angleObject (readonly)

End angle of the solid arc in degrees, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, end_angle: 120).stroke


185
186
187
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 185

def end_angle
  @end_angle
end

#inclinationObject (readonly)

Inclination in degrees of semi-major axis in respect to x-axis, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inclination: 40).stroke


196
197
198
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 196

def inclination
  @inclination
end

#inner_aObject (readonly)

Length of inner semi-major axis which (without altering the #inclination) is parallel to the x-axis, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inner_a: 5).stroke


127
128
129
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 127

def inner_a
  @inner_a
end

#inner_bObject (readonly)

Length of inner semi-minor axis which (without altering the #inclination) is parallel to the y-axis, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inner_b: 20).stroke


139
140
141
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 139

def inner_b
  @inner_b
end

#outer_aObject (readonly)

Length of outer semi-major axis which (without altering the #inclination) is parallel to the x-axis, defaults to 1.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, outer_a: 45).stroke


151
152
153
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 151

def outer_a
  @outer_a
end

#outer_bObject (readonly)

Length of outer semi-minor axis which (without altering the #inclination) is parallel to the y-axis, defaults to 1.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, outer_b: 40).stroke


163
164
165
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 163

def outer_b
  @outer_b
end

#start_angleObject (readonly)

Start angle of the solid arc in degrees, defaults to 0.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke
canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, start_angle: 60).stroke


174
175
176
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 174

def start_angle
  @start_angle
end

Class Method Details

.configure(**kwargs) ⇒ Object

Creates and configures a new solid arc object.

See #configure for the allowed keyword arguments.



91
92
93
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 91

def self.configure(**kwargs)
  new.configure(**kwargs)
end

Instance Method Details

#configure(cx: nil, cy: nil, inner_a: nil, inner_b: nil, outer_a: nil, outer_b: nil, start_angle: nil, end_angle: nil, inclination: nil) ⇒ Object

Configures the solid arc with

  • center point (cx, cy),

  • inner semi-major axis inner_a,

  • inner semi-minor axis inner_b,

  • outer semi-major axis outer_a,

  • outer semi-minor axis outer_b,

  • start angle of start_angle degrees,

  • end angle of end_angle degrees and

  • an inclination in respect to the x-axis of inclination degrees.

Any arguments not specified are not modified and retain their old value, see #initialize for the inital values.

Returns self.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc)
solid_arc.configure(outer_a: 30, outer_b: 20, inner_a: 20, inner_b: 10)
canvas.draw(solid_arc).stroke


235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 235

def configure(cx: nil, cy: nil, inner_a: nil, inner_b: nil, outer_a: nil, outer_b: nil,
              start_angle: nil, end_angle: nil, inclination: nil)
  @cx = cx if cx
  @cy = cy if cy
  @inner_a = inner_a.abs if inner_a
  @inner_b = inner_b.abs if inner_b
  @outer_a = outer_a.abs if outer_a
  @outer_b = outer_b.abs if outer_b
  @start_angle = start_angle % 360 if start_angle
  @end_angle = end_angle % 360 if end_angle
  @inclination = inclination if inclination

  self
end

#draw(canvas) ⇒ Object

Draws the solid arc on the given Canvas.

Examples:

#>pdf-center
solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
                                  inner_a: 20, inner_b: 10)
solid_arc.draw(canvas)
canvas.stroke


259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/hexapdf/content/graphic_object/solid_arc.rb', line 259

def draw(canvas)
  angle_difference = (@end_angle - @start_angle).abs
  if @inner_a == 0 && @inner_b == 0
    arc = canvas.graphic_object(:arc, cx: @cx, cy: @cy, a: @outer_a, b: @outer_b,
                                start_angle: @start_angle, end_angle: @end_angle,
                                inclination: @inclination, clockwise: false)
    if angle_difference == 0
      arc.draw(canvas)
    else
      canvas.move_to(@cx, @cy)
      canvas.line_to(*arc.start_point)
      arc.draw(canvas, move_to_start: false)
    end
  else
    inner = canvas.graphic_object(:arc, cx: @cx, cy: @cy, a: @inner_a, b: @inner_b,
                                  start_angle: @end_angle, end_angle: @start_angle,
                                  inclination: @inclination, clockwise: true)
    outer = canvas.graphic_object(:arc, cx: @cx, cy: @cy, a: @outer_a, b: @outer_b,
                                  start_angle: @start_angle, end_angle: @end_angle,
                                  inclination: @inclination, clockwise: false)
    outer.draw(canvas)
    if angle_difference == 0
      canvas.close_subpath
      inner.draw(canvas)
    else
      canvas.line_to(*inner.start_point)
      inner.draw(canvas, move_to_start: false)
    end
  end
  canvas.close_subpath
end