Tape bobbin holes: rounded trapezoids, narrow side outward (v0.13.3)
Replace the inward-pointing triangular reel cutouts with rounded trapezoids — wide toward the hub, narrow toward the rim. Generalize the corner-rounding helper (roundedTri → roundedPoly) to handle the four-corner shape. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -22,8 +22,8 @@ android {
|
||||
// (android.media.midi) and AAudio low-latency audio we rely on.
|
||||
minSdk = 26
|
||||
targetSdk = 34
|
||||
versionCode = 35
|
||||
versionName = "0.13.2"
|
||||
versionCode = 36
|
||||
versionName = "0.13.3"
|
||||
|
||||
// We provide our own instrumentation runner if/when tests are added.
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -197,29 +197,34 @@ private fun DrawScope.drawReel(
|
||||
) {
|
||||
val center = Offset(cx, cy)
|
||||
drawCircle(flange, radius = r, center = center) // metal flange
|
||||
for (k in 0 until 3) drawPath(bobbinHole(cx, cy, r, angle + k * 120f), hole) // triangular cutouts
|
||||
for (k in 0 until 3) drawPath(bobbinHole(cx, cy, r, angle + k * 120f), hole) // trapezoidal cutouts
|
||||
drawCircle(hole, radius = r * 0.26f, center = center) // bobbin centre (open)
|
||||
drawCircle(accent, radius = r * 0.26f, center = center, style = Stroke(width = 3f))
|
||||
drawCircle(accent, radius = r * 0.14f, center = center, style = Stroke(width = 2f))
|
||||
drawCircle(rim, radius = r, center = center, style = Stroke(width = 2.5f)) // flange edge
|
||||
}
|
||||
|
||||
/** One inward-pointing rounded-triangular bobbin hole at [thetaDeg] around the reel. */
|
||||
/** One rounded-trapezoidal bobbin hole at [thetaDeg] around the reel: wide toward the
|
||||
* hub, narrow toward the rim (the narrow side faces outward). */
|
||||
private fun bobbinHole(cx: Float, cy: Float, r: Float, thetaDeg: Float): Path {
|
||||
val apex = polar(cx, cy, r * 0.36f, thetaDeg) // point toward the hub
|
||||
val baseL = polar(cx, cy, r * 0.82f, thetaDeg - 34f) // wide base toward the rim
|
||||
val baseR = polar(cx, cy, r * 0.82f, thetaDeg + 34f)
|
||||
return roundedTri(apex, baseL, baseR, r * 0.10f)
|
||||
val rIn = r * 0.40f; val rOut = r * 0.86f
|
||||
val inner = 44f // angular half-spread at the hub (wide side)
|
||||
val outer = 13f // angular half-spread at the rim (narrow side)
|
||||
val innerL = polar(cx, cy, rIn, thetaDeg - inner)
|
||||
val outerL = polar(cx, cy, rOut, thetaDeg - outer)
|
||||
val outerR = polar(cx, cy, rOut, thetaDeg + outer)
|
||||
val innerR = polar(cx, cy, rIn, thetaDeg + inner)
|
||||
return roundedPoly(arrayOf(innerL, outerL, outerR, innerR), r * 0.09f)
|
||||
}
|
||||
|
||||
/** A triangle through [v0],[v1],[v2] with corners rounded to radius [corner]. */
|
||||
private fun roundedTri(v0: Offset, v1: Offset, v2: Offset, corner: Float): Path {
|
||||
val v = arrayOf(v0, v1, v2)
|
||||
/** A closed polygon through [v] with every corner rounded to radius [corner]. */
|
||||
private fun roundedPoly(v: Array<Offset>, corner: Float): Path {
|
||||
val n = v.size
|
||||
val path = Path()
|
||||
for (i in 0 until 3) {
|
||||
for (i in 0 until n) {
|
||||
val curr = v[i]
|
||||
val prev = v[(i + 2) % 3]
|
||||
val next = v[(i + 1) % 3]
|
||||
val prev = v[(i + n - 1) % n]
|
||||
val next = v[(i + 1) % n]
|
||||
val a = curr + toward(curr, prev, corner) // approach point on the incoming edge
|
||||
val b = curr + toward(curr, next, corner) // leave point on the outgoing edge
|
||||
if (i == 0) path.moveTo(a.x, a.y) else path.lineTo(a.x, a.y)
|
||||
|
||||
Reference in New Issue
Block a user