Property definitions

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