Class: GeometricSegment

Inherits:
Struct
  • Object
show all
Defined in:
lib/flash_math/modules/geometry/geometric_segment.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#point1Object

Returns the value of attribute point1

Returns:

  • (Object)

    the current value of point1



4
5
6
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 4

def point1
  @point1
end

#point2Object

Returns the value of attribute point2

Returns:

  • (Object)

    the current value of point2



4
5
6
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 4

def point2
  @point2
end

Class Method Details

.new_by_arrays(point1_coordinates, point2_coordinates) ⇒ Object



6
7
8
9
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 6

def self.new_by_arrays(point1_coordinates, point2_coordinates)
  self.new(GeometricPoint.new_by_array(point1_coordinates),
           GeometricPoint.new_by_array(point2_coordinates))
end

Instance Method Details

#bottommost_endpointObject



11
12
13
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 11

def bottommost_endpoint
  ((point1.y <=> point2.y) == -1) ? point1 : point2
end

#contains_point?(point) ⇒ Boolean

Returns:

  • (Boolean)


27
28
29
30
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 27

def contains_point?(point)
  GeometricDistance.new(point1, point2).distance ===
    GeometricDistance.new(point1, point).distance + GeometricDistance.new(point, point2).distance
end

#distance_to(point) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 32

def distance_to(point)
  q = point.to_vector
  p1 = point1.to_vector
  p2 = point2.to_vector

  u = p2 - p1
  v = q - p1

  a = u.scalar_product(v)
  if a < 0
    p = p1
  else
    b = u.scalar_product(u)
    if a > b
      p = p2
    else
      p = p1 + (a.to_f / b * u)
    end
  end

  return GeometricDistance.new(q, p).distance
end

#intersection_point_with(segment) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 55

def intersection_point_with(segment)
  raise GeometricSegmentsDoNotIntersect unless intersects_with?(segment)
  raise GeometricSegmentsOverlap if overlaps?(segment)

  numerator = (segment.point1.y - point1.y) * (segment.point1.x - segment.point2.x) -
    (segment.point1.y - segment.point2.y) * (segment.point1.x - point1.x);
  denominator = (point2.y - point1.y) * (segment.point1.x - segment.point2.x) -
    (segment.point1.y - segment.point2.y) * (point2.x - point1.x);

  t = numerator.to_f / denominator;

  x = point1.x + t * (point2.x - point1.x)
  y = point1.y + t * (point2.y - point1.y)

  GeometricPoint.new(x, y)
end

#intersects_with?(segment) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
75
76
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 72

def intersects_with?(segment)
  GeometricSegment.have_intersecting_bounds?(self, segment) &&
    lies_on_line_intersecting?(segment) &&
    segment.lies_on_line_intersecting?(self)
end

#leftmost_endpointObject



15
16
17
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 15

def leftmost_endpoint
  ((point1.x <=> point2.x) == -1) ? point1 : point2
end

#lengthObject



78
79
80
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 78

def length
  GeometricDistance.new(point1, point2).distance
end

#lies_on_one_line_with?(segment) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 82

def lies_on_one_line_with?(segment)
  GeometricSegment.new(point1, segment.point1).parallel_to?(self) &&
    GeometricSegment.new(point1, segment.point2).parallel_to?(self)
end

#overlaps?(segment) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
90
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 87

def overlaps?(segment)
  GeometricSegment.have_intersecting_bounds?(self, segment) &&
    lies_on_one_line_with?(segment)
end

#parallel_to?(segment) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 92

def parallel_to?(segment)
  to_vector.collinear_with?(segment.to_vector)
end

#rightmost_endpointObject



19
20
21
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 19

def rightmost_endpoint
  ((point1.x <=> point2.x) == 1) ? point1 : point2
end

#to_vectorObject



96
97
98
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 96

def to_vector
  GeometricVector.new(point2.x - point1.x, point2.y - point1.y)
end

#topmost_endpointObject



23
24
25
# File 'lib/flash_math/modules/geometry/geometric_segment.rb', line 23

def topmost_endpoint
  ((point1.y <=> point2.y) == 1) ? point1 : point2
end