Class: Topolys::Plane3D
- Inherits:
-
Object
- Object
- Topolys::Plane3D
- Defined in:
- lib/topolys/geometry.rb
Overview
Vector3D
Instance Attribute Summary collapse
-
#normal ⇒ Vector3D
readonly
Normalized vector perpendicular to plane.
-
#point ⇒ Point3D
readonly
Arbitrary point on plane.
Class Method Summary collapse
-
.from_point_axes(point, xaxis, yaxis) ⇒ Object
Initializes a Plane3D object from a point and two vectors.
-
.from_points(point1, point2, point3) ⇒ Object
Initializes a Plane3D object from three non-colinear points.
Instance Method Summary collapse
-
#initialize(point, normal) ⇒ Plane3D
constructor
Initializes a Plane3D object from a point and an outward normal.
-
#project(point) ⇒ Point3d
Project a Point3d to this plane.
- #to_s ⇒ Object
Constructor Details
#initialize(point, normal) ⇒ Plane3D
Initializes a Plane3D object from a point and an outward normal
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/topolys/geometry.rb', line 250 def initialize(point, normal) raise "Incorrect point argument for Plane3D, expected Point3D but got #{point.class}" unless point.is_a?(Topolys::Point3D) raise "Incorrect normal argument for Plane3D, expected Vector3D but got #{normal.class}" unless normal.is_a?(Topolys::Vector3D) raise "Incorrect normal argument for Plane3D, magnitude too small" unless normal.magnitude > Float::EPSILON @point = Point3D.new(point.x, point.y, point.z) @normal = Vector3D.new(normal.x, normal.y, normal.z) @normal.normalize! # coefficients for equation of a plane @a = @normal.x @b = @normal.y @c = @normal.z @d = -(@a*@point.x + @b*@point.y + @c*@point.z) end |
Instance Attribute Details
#normal ⇒ Vector3D (readonly)
Returns normalized vector perpendicular to plane.
243 244 245 |
# File 'lib/topolys/geometry.rb', line 243 def normal @normal end |
#point ⇒ Point3D (readonly)
Returns arbitrary point on plane.
240 241 242 |
# File 'lib/topolys/geometry.rb', line 240 def point @point end |
Class Method Details
.from_point_axes(point, xaxis, yaxis) ⇒ Object
Initializes a Plane3D object from a point and two vectors
293 294 295 296 297 298 299 300 301 302 |
# File 'lib/topolys/geometry.rb', line 293 def Plane3D.from_point_axes(point, xaxis, yaxis) return nil unless point.is_a?(Topolys::Point3D) return nil unless xaxis.is_a?(Topolys::Vector3D) return nil unless yaxis.is_a?(Topolys::Vector3D) normal = xaxis.cross(yaxis) return nil unless normal.magnitude > Float::EPSILON return Plane3D.new(point, normal) end |
.from_points(point1, point2, point3) ⇒ Object
Initializes a Plane3D object from three non-colinear points
276 277 278 279 280 281 282 283 284 285 |
# File 'lib/topolys/geometry.rb', line 276 def Plane3D.from_points(point1, point2, point3) return nil unless point1.is_a?(Topolys::Point3D) return nil unless point2.is_a?(Topolys::Point3D) return nil unless point3.is_a?(Topolys::Point3D) normal = (point2-point1).cross(point3-point1) return nil unless normal.magnitude > Float::EPSILON return Plane3D.new(point1, normal) end |
Instance Method Details
#project(point) ⇒ Point3d
Project a Point3d to this plane
312 313 314 315 |
# File 'lib/topolys/geometry.rb', line 312 def project(point) dist = @normal.dot(point-@point) return point + normal*(-dist) end |
#to_s ⇒ Object
266 267 268 |
# File 'lib/topolys/geometry.rb', line 266 def to_s "[#{@a}, #{@b}, #{@c}, #{@d}]" end |