geometry :: IPoint3d :: defaultinit
# Abstract 3d point, strongly linked to its implementation `Point3d`
interface IPoint3d[N: Numeric]
super IPoint[N]
# Depth coordinate
fun z: N is abstract
redef fun to_s do return "({x}, {y}, {z})"
redef fun dist2(other)
do return x.value_of(other.dist2_with_3d(self))
redef fun dist2_with_2d(other)
do return dist2_xy(other).add(z.mul(z))
redef fun dist2_with_3d(other)
do
var dz = other.z.sub(z)
var s = dist2_xy(other).add(dz.mul(dz))
return x.value_of(s)
end
# Get a new `Point3d[Float]` at an offset of `x, y, z` from `self`
#
# ~~~
# var origin = new Point3d[Float](1.0, 1.0, 1.0)
# assert origin.offset(1.0, 2.0, 3.0).to_s == "(2.0, 3.0, 4.0)"
# ~~~
fun offset(x, y, z: Numeric): Point3d[Float]
do return new Point3d[Float](self.x.to_f+x.to_f,
self.y.to_f+y.to_f,
self.z.to_f+z.to_f)
end
lib/geometry/points_and_lines.nit:124,1--156,3