class Line
Attributes
point[RW]
vector[RW]
Public Class Methods
construct_with_two_points(first_point, second_point)
click to toggle source
Construct a line with two points.
Example:
>> Line.construct_with_two_points(Point.new(1, 2, 3), Point.new(3, 2, 1)) => Line.new(Point.new(1, 2, 3), Vector.new(2, 0, -2))
Arguments:
first_point: (Point) second_point: (Point)
# File lib/geometry_3d/line.rb, line 20 def self.construct_with_two_points(first_point, second_point) v = Vector.construct_with_two_points(first_point, second_point) Line.new(first_point, v) end
new(point, vector)
click to toggle source
# File lib/geometry_3d/line.rb, line 5 def initialize(point, vector) @point = point @vector = vector end
Public Instance Methods
==(line)
click to toggle source
# File lib/geometry_3d/line.rb, line 142 def ==(line) point == line.point and vector == line.vector end
find_angle_with_plane(plane)
click to toggle source
Find the angle(degrees) between line and plane. If the line and the plane do not intersect nil is returned.
Example:
>> Line.new(Point.new(1, 0, 1), Vector.new(2, 1, 2)).find_angle_with_plane(Plane.new(1, 1, 0, -6)) => 45
Arguments:
plane: (Plane)
# File lib/geometry_3d/line.rb, line 66 def find_angle_with_plane(plane) if (intersect_plane? plane) numer = (vector.scalar_product(plane.find_normal_vector)).abs denom = (vector.length * plane.find_normal_vector.length) Math.asin(numer / denom) * (180 / Math::PI) end end
find_intersecting_point_with_line(line)
click to toggle source
Finds the intersecting point of two lines. If the two lines do not intersect returns nil.
Example:
>> Line.new(Point.new(4, 19, 12), Vector.new(1, 6, 5)).find_intersecting_point_with_line(Line.new(Point.new(-3, -15, -19), Vector.new(2, 8, 8))) => Point.new(1, 1, -3)
Arguments:
line: (Line)
# File lib/geometry_3d/line.rb, line 34 def find_intersecting_point_with_line(line) if (intersect? line) eq1 = LinearEquation.new(vector.x, -line.vector.x, point.x - line.point.x) eq2 = LinearEquation.new(vector.y, -line.vector.y, point.y - line.point.y) find_point (eq1.solve_system(eq2)[0]) end end
find_intersecting_point_with_plane(plane)
click to toggle source
Find intersecting point of line and plane. If the line and the plane do not intersect nil is returned.
Example:
>> Line.new(Point.new(1, 0, 1), Vector.new(3, -2, 1)).find_intersecting_point_with_plane(Plane.new(1, 1, 1, -6)) => Point.new(7, -4, 3)
Arguments:
plane: (Plane)
# File lib/geometry_3d/line.rb, line 51 def find_intersecting_point_with_plane(plane) if (intersect_plane? plane) find_point(- plane.substitute(point) / (plane.substitute(vector) - plane.d).to_f) end end
intersect?(line)
click to toggle source
Check if two lines intersect.
Example:
>> Line.new(Point.new(4, 19, 12), Vector.new(1, 6, 5)).intersect?(Line.new(Point.new(-3, -15, -19), Vector.new(2, 8, 8))) => true
Arguments:
line: (Line)
# File lib/geometry_3d/line.rb, line 96 def intersect?(line) eq1 = LinearEquation.new(vector.x, -line.vector.x, point.x - line.point.x) eq2 = LinearEquation.new(vector.y, -line.vector.y, point.y - line.point.y) eq3 = LinearEquation.new(vector.z, -line.vector.z, point.z - line.point.z) (eq1.solve_system(eq2) == eq2.solve_system(eq3)) and (not parallel? line) end
intersect_plane?(plane)
click to toggle source
Check if a line and a plane intersect.
Example:
>> Line.new(Point.new(4, -5, 1), Vector.new(2, 4, 3)).intersect_plane?(Plane.new(1, 2, 1, 3)) => true
Arguments:
plane: (Plane)
# File lib/geometry_3d/line.rb, line 138 def intersect_plane?(plane) not parallel_to_plane? plane end
parallel?(line)
click to toggle source
Check if two lines are parallel.
Example:
>> Line.new(Point.new(1, 0, 1), Vector.new(3, -2, 1)).parallel?(Line.new(Point.new(2, 0, 1), Vector.new(6, -4, 2))) => true
Arguments:
line: (Line)
# File lib/geometry_3d/line.rb, line 83 def parallel? (line) vector.x * line.vector.y == vector.y * line.vector.x and vector.y * line.vector.z == vector.z * line.vector.y end
parallel_to_plane?(plane)
click to toggle source
Check if a line and a plane are parallel.
Example:
>> Line.new(Point.new(4, -5, 1), Vector.new(2, 4, 3)).parallel_to_plane?(Plane.new(1, 1, 1, 3)) => true
Arguments:
plane: (Plane)
# File lib/geometry_3d/line.rb, line 125 def parallel_to_plane?(plane) plane.find_normal_vector.scalar_product(vector) == 0 end
skew?(line)
click to toggle source
Check if two lines are skew.
Example:
>> Line.new(Point.new(4, -5, 1), Vector.new(2, 4, 3)).skew?(Line.new(Point.new(2, -1, 0), Vector.new(1, 3, 2))) => true
Arguments:
line: (Line)
# File lib/geometry_3d/line.rb, line 112 def skew?(line) not (parallel? line) and not(intersect? line) end
Private Instance Methods
find_point(parameter)
click to toggle source
# File lib/geometry_3d/line.rb, line 147 def find_point(parameter) Point.new(*point.to_a.zip(vector.to_a).map { |a, b| a + b * parameter}) end