RGeom Visual Examples

RGeom is a Ruby-driven geometrically-aware mathematical diagram tool. The specification environment is a cartesian plane, not pixel-coordinates, and implicit construction means you rarely enter coordinates anyway.

The images below were generated by RGeom to have a width of 300px. The width in RGeom units (think of a cartesian plane) is shown below the image for your information.

This document is divided into logical segments, beginning with core concepts and interesting demonstrations, and continuing with in-depth examples of RGeom's various capabilities (triangles, circles, ...).

Both the code and this example file are in their relative infancy. You can find the code at github .

Table of contents

1 - General

2 - Showcase

3 - Triangles

4 - Circles

Chapter 1 -- General

Example 1.01 Frame of reference

The next three examples will demonstrate how RGeom zooms in to the diagram.

The triangle in this example is created near the origin and has a base of 5 units (the default).

Width: 5.0 units

triangle()

Example 1.02

The triangle is the same (default) one as above, but this time we have a circle in a distant location. The image is therefore "zoomed out" and the triangle appears much smaller.

Width: 10.0 units

triangle()
circle(:centre => p(8,9), :radius => 2)

Example 1.03

Once more the image must zoom out to include the segment in the top left.

Width: 24.0 units

triangle()
circle(:centre => p(8,9), :radius => 2)
points :A => p(-14,20), :B => p(-9,15)
segment(:AB)

Example 1.04 Extending segments

Here we create a triangle, extend its base, and join the extended point to the apex.

Width: 10.5 units

triangle(:ABC, :equilateral)
segment(:AB).extend(2.1, :E)
segment(:CE)

Chapter 2 -- Showcase

Example 2.01 Generating a spiral of right-angled triangles

The <b>Shape.generate</b> function allows us to build any number of shapes, each based on the previous one.

In this case, the hypotenuse of one triangle forms the base of the next one.

The hypotenuses have length sqrt(2), sqrt(3), sqrt(4), ...

Width: 6.9 units

first = triangle(:right_angle => :first, :base => 3, :height => 1)
generate(10, first) { |tn|
  base = tn.hypotenuse.reverse
  triangle(:right_angle => :first, :base => base, :height => 1)
}

Triangle[-1].hypotenuse.length == Math.sqrt(19)   # true

Example 2.02 Circles

A group of circles defined along a linear path, with radii desisgned to reach just beyond the origin.

Width: 16.2 units

(0..30).each do |d|
  centre = Point[sqrt(d), sqrt(d)]
  radius = sqrt(2.2*d)
  circle(:centre => centre, :radius => radius)
end

Example 2.03 Pythagoras's Theorem

The right-angle mark is achieved using a square, which is not nice, but it's all we've got at the moment.

The order in which you specify the vertices of a square is important. Like a triangle, it is constructed clockwise.

Width: 10.0 units

triangle :ABC, :right_angle => :A, :base => 4, :height => 3
square :base => :BA
square :base => :CB
square :base => :AC
square :A___, :side => 0.4    # right-angle mark

Example 2.04 Pythagoras's Theorem again

Pythagoras's Theorem is stated with squares on the hypotenuse, but any similar shape will do. Here we use semicircles.

Width: 6.0 units

triangle :ABC, :right_angle => :A, :base => 4, :height => 3
semicircle :diameter => :BA
semicircle :diameter => :CB
semicircle :diameter => :AC
square :A___, :side => 0.4    # right-angle mark

Example 2.05 Radioactive sign

No colour fills yet, but this diagram demonstrates the use of arcs.

Width: 24.0 units

circle :radius => 3

# Create a series of arcs starting at the given angles and continuing
# for 60 degrees.
[-60, 60, 180].each do |angle|
  arc1 = arc :radius => 4,  :angles => [angle, angle+60]
  arc2 = arc :radius => 12, :angles => [angle, angle+60]
  segment :p => arc1.start, :q => arc2.start
  segment :p => arc1.end,   :q => arc2.end
end

Chapter 3 -- Triangles

Example 3.01 Various triangle constructions

We can create all sorts of triangles using natural specifications.

The vertices of a triangle (any shape, really) are constructed in anti-clockwise order. So if A and B are defined, then triangle(:ABC) will be different from triangle(:BAC).

Width: 15.7 units

points :A => p(1,4), :B => p(6,3)

triangle(:ABC, :isosceles, :side => 8)
triangle(:CBD, :equilateral)
triangle(:DBE, :scalene, :angles => [110.d, 19.d])

points :X => p(10,10)
triangle(:XYZ, :sides => [5.2,4.1,7.9])

triangle(:YEW, :right_angle => :W, :height => 1.5)

# dot(:A, :B, :C, :D, :E, :X, :Y, :Z, :label)

Example 3.02 Medians of a triangle

When demonstrating the properties of a triangle, it's sufficient to use the default scalene triangle construction. (It's a 5-6-7 triangle.)

Here we construct segments from each vertex to the midpoint of the opposite side. We do this explicitly, although there are (or should be) Triangle methods to do this for us.

Width: 5.0 units

triangle(:ABC)
points :M => midpoint(:AB), :N => midpoint(:BC), :O => midpoint(:CA)
segment(:AN)
segment(:BO)
segment(:CM)

Example 3.03 Medians of a triangle (anonymous points)

We construct the medians of a triangle again, but this time we don't name the midpoints of each side.

Width: 10.0 units

triangle(:ABC, :base => 10, :angles => [51.d, 73.d])
segment(:start => :A, :end => midpoint(:BC))
segment(:start => :B, :end => midpoint(:AC))
segment(:start => :C, :end => midpoint(:AB))

Chapter 4 -- Circles

Generated by html-demo/generate.rb on 2009-11-22 at 09:41:05 (AUS Eastern Daylight Time).