diff --git a/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt b/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt index 568a4b8..c38168d 100644 --- a/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt +++ b/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt @@ -77,6 +77,18 @@ class AngleDifference(private val angleObj: Angle) { return listOf(100.0, 95.0, 180.0, 85.0, 90.0, 75.0, 160.0, 170.0) } + // 根据不同的 listType 判断标准 + private fun getStandardForListType(listType: String): List { + return when (listType) { + "1" -> angleObj.standList().map { it.toDouble() } // 转换为 List + "2" -> angleObj.deadliftList().map { it.toDouble() } // 转换为 List + "3" -> angleObj.pushUpList().map { it.toDouble() } // 转换为 List + "4" -> angleObj.squatList().map { it.toDouble() } // 转换为 List + "5" -> angleObj.plankList().map { it.toDouble() } // 转换为 List + else -> throw IllegalArgumentException("未知的列表类型: $listType") // 无效的输入 + } + } + // 计算角度差,并根据角度值判断是否大于10,返回相应的语句 fun calculateAngleDifference(listType: String): String { // 根据传入的参数选择不同的角度列表 @@ -84,15 +96,20 @@ class AngleDifference(private val angleObj: Angle) { "1" -> angleObj.standList() // 选择站立姿势列表 "2" -> angleObj.deadliftList() // 选择硬拉列表 "3" -> angleObj.pushUpList() // 选择俯卧撑列表 + "4" -> angleObj.squatList() // 选择深蹲列表 + "5" -> angleObj.plankList() // 选择平板支撑列表 else -> throw IllegalArgumentException("未知的列表类型: $listType") // 处理无效的输入 } // 获取另一个类中的角度列表 val angles = getAngles() + // 获取当前listType对应的标准列表 + val standardList = getStandardForListType(listType) + // 确保两个列表的大小一致 - if (selectedList.size != angles.size) { - throw IllegalArgumentException("两个列表的大小不一致!") + if (selectedList.size != angles.size || selectedList.size != standardList.size) { + throw IllegalArgumentException("三个列表的大小不一致!") } // 计算差值并检查条件 @@ -101,30 +118,42 @@ class AngleDifference(private val angleObj: Angle) { differenceList.add((selectedList[i] - angles[i]).toDouble()) } - // 检查差值列表中的每个值 + // 根据listType的不同,提供不同标准的判断 val absoluteValues = differenceList.map { abs(it) } - if (absoluteValues.all { it < 10 }) { - // 如果所有值的绝对值都小于10 - return "动作标准" - } else { - // 根据不同的位置返回不同的语句 - for (i in absoluteValues.indices) { - if (absoluteValues[i] > 10) { - return when (i) { - 0 -> "第一个位置的角度差值超出标准,请调整!" - 1 -> "第二个位置的角度差值超出标准,请调整!" - 2 -> "第三个位置的角度差值超出标准,请调整!" - 3 -> "第四个位置的角度差值超出标准,请调整!" - 4 -> "第五个位置的角度差值超出标准,请调整!" - 5 -> "第六个位置的角度差值超出标准,请调整!" - 6 -> "第七个位置的角度差值超出标准,请调整!" - 7 -> "第八个位置的角度差值超出标准,请调整!" - else -> "未知位置的角度差值超出标准,请检查!" + + // 检查角度差是否符合标准 + val warningMessages = mutableListOf() + + // 替换角度位置的名称 + val bodyParts = listOf( + "左肩", "右肩", "左肘", "右肘", "左髋", "右髋", "左膝", "右膝" + ) + + for (i in absoluteValues.indices) { + val standard = standardList[i] + val absoluteDifference = absoluteValues[i] + if (absoluteDifference > 10) { + // 根据角度差的正负判断提示语 + val direction = if (differenceList[i] > 0) "增大" else "减小" + // 根据listType提供不同的标准和建议 + warningMessages.add( + when (listType) { + "1" -> "${bodyParts[i]}的角度差值超出标准(${standard}°),请$direction 相应位置的角度!" + "2" -> "${bodyParts[i]}的角度差值超出标准(${standard}°),请$direction 相应位置的角度!" + "3" -> "${bodyParts[i]}的角度差值超出标准(${standard}°),请$direction 相应位置的角度!" + "4" -> "${bodyParts[i]}的角度差值超出标准(${standard}°),请$direction 相应位置的角度!" + "5" -> "${bodyParts[i]}的角度差值超出标准(${standard}°),请$direction 相应位置的角度!" + else -> "未知类型的角度差值超出标准,请检查!" } - } + ) } } - return "未知情况" + // 如果没有超出标准的位置 + return if (warningMessages.isEmpty()) { + "动作标准" + } else { + warningMessages.joinToString("\n") + } } -} \ No newline at end of file +}