0.3.1-dev-11 #510
@ -38,20 +38,25 @@ public fun Circle2D.tangentsToCircle(
|
|||||||
} else {
|
} else {
|
||||||
r1.absoluteValue + r2.absoluteValue
|
r1.absoluteValue + r2.absoluteValue
|
||||||
}
|
}
|
||||||
val l = (d * d - r * r).pow(0.5)
|
if (d * d > r * r) {
|
||||||
angle2 = if (r1.absoluteValue > r2.absoluteValue) {
|
val l = (d * d - r * r).pow(0.5)
|
||||||
angle1 + r1.sign * atan2(r.absoluteValue, l)
|
angle2 = if (r1.absoluteValue > r2.absoluteValue) {
|
||||||
} else {
|
angle1 + r1.sign * atan2(r.absoluteValue, l)
|
||||||
angle1 - r2.sign * atan2(r.absoluteValue, l)
|
} else {
|
||||||
}
|
angle1 - r2.sign * atan2(r.absoluteValue, l)
|
||||||
val w = vector(-cos(angle2), sin(angle2))
|
}
|
||||||
put(
|
val w = vector(-cos(angle2), sin(angle2))
|
||||||
route,
|
put(
|
||||||
LineSegment(
|
route,
|
||||||
center + w * r1,
|
LineSegment(
|
||||||
other.center + w * r2
|
center + w * r1,
|
||||||
|
other.center + w * r2
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
}
|
||||||
|
else {
|
||||||
|
throw Exception("Circles should not be")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -13,6 +13,7 @@ import space.kscience.kmath.geometry.equalsLine
|
|||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
class TangentTest {
|
class TangentTest {
|
||||||
@Test
|
@Test
|
||||||
@ -53,4 +54,28 @@ class TangentTest {
|
|||||||
assertTrue(segments[i].equalsLine(Euclidean2DSpace, tangentMapValues[i]))
|
assertTrue(segments[i].equalsLine(Euclidean2DSpace, tangentMapValues[i]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun nonExistingTangents() {
|
||||||
|
assertFailsWith<Exception> {
|
||||||
|
val c1 = Circle2D(vector(0.0, 0.0), 10.0)
|
||||||
|
val c2 = Circle2D(vector(0.0, 0.0), 1.0)
|
||||||
|
val segments = c1.tangentsToCircle(c2)
|
||||||
|
}
|
||||||
|
assertFailsWith<Exception> {
|
||||||
|
val c1 = Circle2D(vector(0.0, 0.0), 1.0)
|
||||||
|
val c2 = Circle2D(vector(0.0, 0.0), 10.0)
|
||||||
|
val segments = c1.tangentsToCircle(c2)
|
||||||
|
}
|
||||||
|
assertFailsWith<Exception> {
|
||||||
|
val c1 = Circle2D(vector(0.0, 0.0), 1.0)
|
||||||
|
val c2 = Circle2D(vector(2.0, 0.0), 1.0)
|
||||||
|
val segments = c1.tangentsToCircle(c2)
|
||||||
|
}
|
||||||
|
assertFailsWith<Exception> {
|
||||||
|
val c1 = Circle2D(vector(0.0, 0.0), 1.0)
|
||||||
|
val c2 = Circle2D(vector(0.5, 0.0), 1.0)
|
||||||
|
val segments = c1.tangentsToCircle(c2)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user