diff --git a/src/components/BowTargetEdit.vue b/src/components/BowTargetEdit.vue
index b5c8202..675a739 100644
--- a/src/components/BowTargetEdit.vue
+++ b/src/components/BowTargetEdit.vue
@@ -29,7 +29,7 @@ const onClick = async (e) => {
newArrow.x,
newArrow.y,
rect.value.width * 0.9,
- rect.value.width * 0.9
+ rect.value.height - rect.value.top
);
arrow.value = newArrow;
};
@@ -66,17 +66,13 @@ const onDrag = async (e) => {
const deltaX = clientX - dragStartPos.value.x;
const deltaY = clientY - dragStartPos.value.y;
- const length = rect.value.width * 0.9;
+ const width = rect.value.width * 0.9;
+ const height = rect.value.height - rect.value.top;
// 更新坐标
- arrow.value.x = Math.max(0, Math.min(length, arrow.value.x + deltaX));
- arrow.value.y = Math.max(0, Math.min(length, arrow.value.y + deltaY));
- arrow.value.ring = calcRing(
- arrow.value.x,
- arrow.value.y,
- rect.value.width * 0.9,
- rect.value.width * 0.9
- );
+ arrow.value.x = Math.max(0, Math.min(width, arrow.value.x + deltaX));
+ arrow.value.y = Math.max(0, Math.min(height, arrow.value.y + deltaY));
+ arrow.value.ring = calcRing(arrow.value.x, arrow.value.y, width, height);
// 更新拖拽起始位置
dragStartPos.value = { x: clientX, y: clientY };
@@ -101,7 +97,6 @@ onMounted(async () => {
@touchend="endDrag"
>
-
{
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// 计算靶纸半径(取宽高中较小值的一半)
- const targetRadius = Math.min(targetWidth, targetHeight) / 2;
+ // const targetRadius = Math.min(targetWidth, targetHeight) / 2;
+ const targetRadius = targetWidth / 2;
// 如果距离超过靶纸半径,则脱靶
if (distance > targetRadius) return 0;
// 计算相对距离(0-1之间)
const relativeDistance = distance / targetRadius;
-
// 全环靶有10个环,每个环占半径的10%
// 从外到内:1环到10环
// 距离越近靶心,环数越高
@@ -331,3 +331,73 @@ export const calcRing = (x, y, targetWidth, targetHeight) => {
return 0; // 脱靶
};
+
+const calcSmallBowTarget = (x, y, side) => {
+ // 计算靶心坐标(靶纸中心)
+ const centerX = side / 2;
+ const centerY = side / 2;
+
+ // 计算点击点到靶心的距离
+ const deltaX = x - centerX;
+ const deltaY = y - centerY;
+ const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+
+ // 计算靶纸半径(取宽高中较小值的一半)
+ const targetRadius = side / 2;
+
+ // 如果距离超过靶纸半径,则脱靶
+ if (distance > targetRadius) return 0;
+
+ // 计算相对距离(0-1之间)
+ const relativeDistance = distance / targetRadius;
+ if (relativeDistance <= 0.1) return "X"; // 靶心区域
+ if (relativeDistance <= 0.2) return 10;
+ if (relativeDistance <= 0.4) return 9;
+ if (relativeDistance <= 0.6) return 8;
+ if (relativeDistance <= 0.8) return 7;
+ if (relativeDistance <= 1.0) return 6;
+
+ return 0; // 脱靶
+};
+
+export const calcRing2 = (x, y, targetWidth, targetHeight) => {
+ const side = targetWidth * 0.48;
+ if (
+ x / targetWidth >= 0.26 &&
+ x / targetWidth <= 0.74 &&
+ y / targetHeight <= 0.48
+ ) {
+ return calcSmallBowTarget(x - targetWidth * 0.26, y, side);
+ } else if (x / targetHeight <= 0.48 && y / targetHeight >= 0.456) {
+ return calcSmallBowTarget(x, y - targetHeight * 0.456, side);
+ } else if (x / targetHeight >= 0.52 && y / targetHeight >= 0.456) {
+ return calcSmallBowTarget(
+ x - targetWidth * 0.52,
+ y - targetHeight * 0.456,
+ side
+ );
+ }
+ return 0;
+};
+
+export const calcRing3 = (x, y, targetWidth, targetHeight) => {
+ const side = targetWidth * 0.325;
+ if (x / targetWidth >= 0.337 && x / targetWidth <= 0.663) {
+ if (y / targetHeight <= 0.325) {
+ return calcSmallBowTarget(x - targetWidth * 0.337, y, side);
+ } else if (y / targetHeight >= 0.335 && y / targetHeight <= 0.662) {
+ return calcSmallBowTarget(
+ x - targetWidth * 0.337,
+ y - targetHeight * 0.335,
+ side
+ );
+ } else if (y / targetHeight >= 0.674) {
+ return calcSmallBowTarget(
+ x - targetWidth * 0.337,
+ y - targetHeight * 0.674,
+ side
+ );
+ }
+ }
+ return 0;
+};