From 2270304b5ef811a51e1cc6d361c189c59ccaa955 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 19 Jun 2020 11:48:36 +0200 Subject: [PATCH] Improves chip placement --- .../handhistory/replayer/ReplayerAnimator.kt | 9 ++++-- .../handhistory/replayer/TableDrawer.kt | 4 ++- .../pokeranalytics/android/util/MathUtils.kt | 31 +++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerAnimator.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerAnimator.kt index 89b8d214..1893f350 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerAnimator.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerAnimator.kt @@ -296,13 +296,18 @@ class ReplayerAnimator(var handHistory: HandHistory, var export: Boolean) { val top = rectCenterY - this.playerItemsHeight / 2 val right = rectCenterX + this.playerItemsWidth / 2 val bottom = rectCenterY + this.playerItemsHeight / 2 - this.playerStackRects.add(RectF(left, top, right, bottom)) + val pRect = RectF(left, top, right, bottom) + this.playerStackRects.add(pRect) // val chipCircleY = rectCenterY + chipYOffset - chipTextYOffsetCoef * chipRadius val line = MathUtils.Line(point.x, point.y, tableRect.centerX(), tableRect.centerY()) - val chipPoint = line.pointForDistance(this.playerItemsWidth * 0.8f) + val prp = line.intersects(pRect) ?: throw PAIllegalStateException("should not happen") + + val boxToCenterLine = MathUtils.Line(prp.x, prp.y, tableRect.centerX(), tableRect.centerY()) + val boxToChipDistance = if (bottomOriented) 3 * chipRadius else 2 * chipRadius // because the chip text needs space + val chipPoint = boxToCenterLine.pointForDistance(boxToChipDistance) this.chipCircles.add(Circle(chipPoint.x, chipPoint.y, chipRadius)) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/TableDrawer.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/TableDrawer.kt index c31682e4..635a5b8e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/TableDrawer.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/TableDrawer.kt @@ -445,7 +445,9 @@ class TableDrawer(bitmap: Bitmap) : Canvas(bitmap) { val cards = animator.handHistory.cardsForStreet(street) animator.boardCardRects.take(street.totalBoardCards).forEachIndexed { index, rectF -> - drawCard(cards[index], rectF, animator, canvas, context) + if (index < cards.size) { + drawCard(cards[index], rectF, animator, canvas, context) + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/MathUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/MathUtils.kt index b9ba53e9..0ad2022d 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/MathUtils.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/MathUtils.kt @@ -26,6 +26,37 @@ class MathUtils { val slope: Float get() { return (x2 - x1) / (y2 - y1) } + + private fun intersects(line: Line): PointF? { + + val s1_x = this.x2 - this.x1 + val s1_y = this.y2 - this.y1 + val s2_x = line.x2 - line.x1 + val s2_y = line.y2 - line.y1 + + val s = (-s1_y * (this.x1 - line.x1) + s1_x * (this.y1 - line.y1)) / (-s2_x * s1_y + s1_x * s2_y); + val t = ( s2_x * (this.y1 - line.y1) - s2_y * (this.x1 - line.x1)) / (-s2_x * s1_y + s1_x * s2_y); + + return if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { + PointF(this.x1 + (t * s1_x), this.y1 + (t * s1_y)) + } else { + null + } + } + + fun intersects(rect: RectF): PointF? { + val p1 = this.intersects(Line(rect.left, rect.top, rect.right, rect.top)) + if (p1 != null) return p1 + val p2 = this.intersects(Line(rect.right, rect.top, rect.right, rect.bottom)) + if (p2 != null) return p2 + val p3 = this.intersects(Line(rect.left, rect.bottom, rect.right, rect.bottom)) + if (p3 != null) return p3 + val p4 = this.intersects(Line(rect.left, rect.top, rect.left, rect.bottom)) + if (p4 != null) return p4 + return null + } + + } private class EllipseQuarter(val x1: Float, val y1: Float, val xRadius: Float, val yRadius: Float, val direction: Direction): Path {