0.3.1-dev-11 #510
@ -21,4 +21,11 @@ public interface GeometrySpace<V : Vector> : Group<V>, ScaleOperations<V>, Norm<
|
|||||||
* Scalar product
|
* Scalar product
|
||||||
*/
|
*/
|
||||||
public infix fun V.dot(other: V): Double
|
public infix fun V.dot(other: V): Double
|
||||||
|
|
||||||
|
public companion object{
|
||||||
|
/**
|
||||||
|
* Default precision for geometry objects comparison
|
||||||
|
*/
|
||||||
|
internal const val DEFAULT_PRECISION = 1e-6
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,34 +5,52 @@
|
|||||||
|
|
||||||
package space.kscience.kmath.geometry
|
package space.kscience.kmath.geometry
|
||||||
|
|
||||||
internal const val defaultPrecision = 1e-6
|
import space.kscience.kmath.geometry.GeometrySpace.Companion.DEFAULT_PRECISION
|
||||||
|
|
||||||
public fun Double.equalsFloat(other: Double, precision: Double = defaultPrecision): Boolean =
|
/**
|
||||||
|
* Float equality within given [precision]
|
||||||
|
*/
|
||||||
|
public fun Double.equalsFloat(other: Double, precision: Double = DEFAULT_PRECISION): Boolean =
|
||||||
kotlin.math.abs(this - other) < precision
|
kotlin.math.abs(this - other) < precision
|
||||||
|
|
||||||
public fun Double.equalsFloat(other: Float, precision: Double = defaultPrecision): Boolean =
|
/**
|
||||||
|
* Float equality within given [precision]
|
||||||
|
*/
|
||||||
|
public fun Double.equalsFloat(other: Float, precision: Double = DEFAULT_PRECISION): Boolean =
|
||||||
kotlin.math.abs(this - other) < precision
|
kotlin.math.abs(this - other) < precision
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vector equality within given [precision] (using [GeometrySpace.norm] provided by the space
|
||||||
|
*/
|
||||||
public fun <V : Vector> V.equalsVector(
|
public fun <V : Vector> V.equalsVector(
|
||||||
space: GeometrySpace<V>,
|
space: GeometrySpace<V>,
|
||||||
other: V,
|
other: V,
|
||||||
precision: Double = defaultPrecision,
|
precision: Double = DEFAULT_PRECISION,
|
||||||
): Boolean = with(space) {
|
): Boolean = with(space) {
|
||||||
norm(this@equalsVector - other) < precision
|
norm(this@equalsVector - other) < precision
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vector equality using Euclidian L2 norm and given [precision]
|
||||||
|
*/
|
||||||
public fun Float64Vector2D.equalsVector(
|
public fun Float64Vector2D.equalsVector(
|
||||||
other: Float64Vector2D,
|
other: Float64Vector2D,
|
||||||
precision: Double = defaultPrecision,
|
precision: Double = DEFAULT_PRECISION,
|
||||||
): Boolean = equalsVector(Euclidean2DSpace, other, precision)
|
): Boolean = equalsVector(Euclidean2DSpace, other, precision)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vector equality using Euclidian L2 norm and given [precision]
|
||||||
|
*/
|
||||||
public fun Float64Vector3D.equalsVector(
|
public fun Float64Vector3D.equalsVector(
|
||||||
other: Float64Vector3D,
|
other: Float64Vector3D,
|
||||||
precision: Double = defaultPrecision,
|
precision: Double = DEFAULT_PRECISION,
|
||||||
): Boolean = equalsVector(Euclidean3DSpace, other, precision)
|
): Boolean = equalsVector(Euclidean3DSpace, other, precision)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Line equality using [GeometrySpace.norm] provided by the [space] and given [precision]
|
||||||
|
*/
|
||||||
public fun <V : Vector> LineSegment<V>.equalsLine(
|
public fun <V : Vector> LineSegment<V>.equalsLine(
|
||||||
space: GeometrySpace<V>,
|
space: GeometrySpace<V>,
|
||||||
other: LineSegment<V>,
|
other: LineSegment<V>,
|
||||||
precision: Double = defaultPrecision,
|
precision: Double = DEFAULT_PRECISION,
|
||||||
): Boolean = begin.equalsVector(space, other.begin, precision) && end.equalsVector(space, other.end, precision)
|
): Boolean = begin.equalsVector(space, other.begin, precision) && end.equalsVector(space, other.end, precision)
|
@ -11,6 +11,10 @@ import space.kscience.kmath.geometry.Euclidean2DSpace
|
|||||||
import space.kscience.kmath.geometry.LineSegment
|
import space.kscience.kmath.geometry.LineSegment
|
||||||
import kotlin.math.*
|
import kotlin.math.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create inner and outer tangents between two circles.
|
||||||
|
* This method returns a map of segments using [DubinsPath] connection type notation.
|
||||||
|
*/
|
||||||
public fun Circle2D.tangentsToCircle(
|
public fun Circle2D.tangentsToCircle(
|
||||||
other: Circle2D,
|
other: Circle2D,
|
||||||
): Map<DubinsPath.Type, LineSegment<DoubleVector2D>> = with(Euclidean2DSpace) {
|
): Map<DubinsPath.Type, LineSegment<DoubleVector2D>> = with(Euclidean2DSpace) {
|
||||||
|
Loading…
Reference in New Issue
Block a user