完成1倍靶纸压线就算环数

This commit is contained in:
kron
2025-08-11 16:31:58 +08:00
parent 42324e8755
commit 6e61f079e8
3 changed files with 86 additions and 76 deletions

View File

@@ -60,7 +60,6 @@ const onClick = async (e) => {
props.id, props.id,
newArrow.x / scale.value - rect.value.width * 0.05, newArrow.x / scale.value - rect.value.width * 0.05,
newArrow.y / scale.value - rect.value.width * 0.05, newArrow.y / scale.value - rect.value.width * 0.05,
rect.value.width * 0.9,
rect.value.width * 0.9 rect.value.width * 0.9
); );
arrow.value = { arrow.value = {
@@ -116,7 +115,6 @@ const onDrag = async (e) => {
const deltaX = clientX - dragStartPos.value.x; const deltaX = clientX - dragStartPos.value.x;
const deltaY = clientY - dragStartPos.value.y; const deltaY = clientY - dragStartPos.value.y;
const side = rect.value.width; const side = rect.value.width;
// 更新坐标 // 更新坐标
arrow.value.x = Math.max( arrow.value.x = Math.max(
0, 0,
@@ -126,12 +124,10 @@ const onDrag = async (e) => {
0, 0,
Math.min(side * scale.value, arrow.value.y * side + deltaY) Math.min(side * scale.value, arrow.value.y * side + deltaY)
); );
arrow.value.ring = calcRing( arrow.value.ring = calcRing(
props.id, props.id,
arrow.value.x / scale.value - rect.value.width * 0.05, arrow.value.x / scale.value - rect.value.width * 0.05,
arrow.value.y / scale.value - rect.value.width * 0.05, arrow.value.y / scale.value - rect.value.width * 0.05,
rect.value.width * 0.9,
rect.value.width * 0.9 rect.value.width * 0.9
); );

View File

@@ -97,6 +97,21 @@ const loadConfig = () => {
} else if (props.itemIndex === 2) { } else if (props.itemIndex === 2) {
data.value = config.targetOption; data.value = config.targetOption;
} }
if (props.value) {
if (props.itemIndex === 0 || props.itemIndex === 2) {
selectedIndex.value = data.value.findIndex(
(item) => item.name === props.value
);
}
if (props.itemIndex === 1) {
selectedIndex.value = distances.findIndex(
(item) => item.name === props.value
);
if (selectedIndex.value === -1) {
selectedIndex.value = 9;
}
}
}
} }
}; };
onMounted(async () => { onMounted(async () => {

View File

@@ -300,22 +300,28 @@ export const getElementRect = (classname) => {
}); });
}; };
const calcNormalBowTarget = (x, y, targetWidth, targetHeight) => { const calcNormalBowTarget = (x, y, diameter) => {
// 计算靶心坐标(靶纸中心) // 弓箭直径为12px半径为6px
const centerX = targetWidth / 2; const arrowRadius = 6;
const centerY = targetHeight / 2;
// 计算点击点到靶心的距离 // 将弓箭左上角坐标转换为圆心坐标
const deltaX = x - centerX; const arrowCenterX = x + arrowRadius;
const deltaY = y - centerY; const arrowCenterY = y + arrowRadius;
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// 计算靶心坐标(靶纸中心)
const centerX = diameter / 2;
const centerY = diameter / 2;
// 计算弓箭圆心到靶心的距离
const deltaX = arrowCenterX - centerX;
const deltaY = arrowCenterY - centerY;
const distanceToCenter = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// 计算弓箭边缘到靶心的最近距离
const distance = Math.max(0, distanceToCenter - arrowRadius);
// 计算靶纸半径(取宽高中较小值的一半) // 计算靶纸半径(取宽高中较小值的一半)
// const targetRadius = Math.min(targetWidth, targetHeight) / 2; const targetRadius = diameter / 2;
const targetRadius = targetWidth / 2;
// 如果距离超过靶纸半径,则脱靶
if (distance > targetRadius) return 0;
// 计算相对距离0-1之间 // 计算相对距离0-1之间
const relativeDistance = distance / targetRadius; const relativeDistance = distance / targetRadius;
@@ -332,26 +338,32 @@ const calcNormalBowTarget = (x, y, targetWidth, targetHeight) => {
if (relativeDistance <= 0.7) return 4; if (relativeDistance <= 0.7) return 4;
if (relativeDistance <= 0.8) return 3; if (relativeDistance <= 0.8) return 3;
if (relativeDistance <= 0.9) return 2; if (relativeDistance <= 0.9) return 2;
if (relativeDistance <= 1.0) return 1; if (relativeDistance <= 1) return 1;
return 0; // 脱靶 return 0; // 脱靶
}; };
const calcHalfBowTarget = (x, y, side, noX = false) => { const calcHalfBowTarget = (x, y, diameter, noX = false) => {
// 计算靶心坐标(靶纸中心) // 弓箭直径为12px半径为6px
const centerX = side / 2; const arrowRadius = 6;
const centerY = side / 2;
// 计算点击点到靶心的距离 // 将弓箭左上角坐标转换为圆心坐标
const deltaX = x - centerX; const arrowCenterX = x + arrowRadius;
const deltaY = y - centerY; const arrowCenterY = y + arrowRadius;
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// 计算靶心坐标(靶纸中心)
const centerX = diameter / 2;
const centerY = diameter / 2;
// 计算弓箭圆心到靶心的距离
const deltaX = arrowCenterX - centerX;
const deltaY = arrowCenterY - centerY;
const distanceToCenter = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// 计算弓箭边缘到靶心的最近距离
const distance = Math.max(0, distanceToCenter - arrowRadius);
// 计算靶纸半径(取宽高中较小值的一半) // 计算靶纸半径(取宽高中较小值的一半)
const targetRadius = side / 2; const targetRadius = diameter / 2;
// 如果距离超过靶纸半径,则脱靶
if (distance > targetRadius) return 0;
// 计算相对距离0-1之间 // 计算相对距离0-1之间
const relativeDistance = distance / targetRadius; const relativeDistance = distance / targetRadius;
@@ -365,62 +377,49 @@ const calcHalfBowTarget = (x, y, side, noX = false) => {
return 0; // 脱靶 return 0; // 脱靶
}; };
export const calcTripleBowTarget = ( export const calcTripleBowTarget = (x, y, diameter, noX = false) => {
x, const side = diameter * 0.325;
y, if (x / diameter >= 0.306) {
targetWidth, if (y / diameter >= 0.64) {
targetHeight,
noX = false
) => {
const side = targetWidth * 0.325;
if (x / targetWidth >= 0.337 && x / targetWidth <= 0.663) {
if (y / targetHeight <= 0.325) {
return calcHalfBowTarget(x - targetWidth * 0.337, y, side, noX);
} else if (y / targetHeight >= 0.335 && y / targetHeight <= 0.662) {
return calcHalfBowTarget( return calcHalfBowTarget(
x - targetWidth * 0.337, x - diameter * 0.342,
y - targetHeight * 0.335, y - diameter * 0.68,
side, side,
noX noX
); );
} else if (y / targetHeight >= 0.674) { }
if (y / diameter >= 0.304) {
return calcHalfBowTarget( return calcHalfBowTarget(
x - targetWidth * 0.337, x - diameter * 0.342,
y - targetHeight * 0.674, y - diameter * 0.34,
side, side,
noX noX
); );
} }
if (y / diameter >= -0.03) {
return calcHalfBowTarget(x - diameter * 0.342, y, side, noX);
}
} }
return 0; return 0;
}; };
export const calcPinBowTarget = ( export const calcPinBowTarget = (x, y, diameter, noX = false) => {
x, const side = diameter * 0.484;
y, if (x / diameter >= 0.488 && y / diameter >= 0.456) {
targetWidth,
targetHeight,
noX = false
) => {
const side = targetWidth * 0.48;
if (
x / targetWidth >= 0.26 &&
x / targetWidth <= 0.74 &&
y / targetWidth >= 0.032 &&
y / targetHeight <= 0.51
) {
return calcHalfBowTarget( return calcHalfBowTarget(
x - targetWidth * 0.26, x - diameter * 0.52,
y - targetHeight * 0.032, y - diameter * 0.484,
side, side,
noX noX
); );
} else if (x / targetHeight <= 0.48 && y / targetHeight >= 0.482) { }
return calcHalfBowTarget(x, y - targetHeight * 0.482, side, noX); if (x / diameter >= -0.03 && y / diameter >= 0.456) {
} else if (x / targetHeight >= 0.52 && y / targetHeight >= 0.482) { return calcHalfBowTarget(x, y - diameter * 0.484, side, noX);
}
if (x / diameter >= 0.23 && y / diameter >= 0.005) {
return calcHalfBowTarget( return calcHalfBowTarget(
x - targetWidth * 0.52, x - diameter * 0.26,
y - targetHeight * 0.482, y - diameter * 0.036,
side, side,
noX noX
); );
@@ -428,19 +427,19 @@ export const calcPinBowTarget = (
return 0; return 0;
}; };
export const calcRing = (bowtargetId, x, y, targetWidth, targetHeight) => { export const calcRing = (bowtargetId, x, y, diameter) => {
if (bowtargetId < 4) { if (bowtargetId < 4) {
return calcNormalBowTarget(x, y, targetWidth, targetHeight); return calcNormalBowTarget(x - 2, y - 2, diameter);
} else if (bowtargetId < 7) { } else if (bowtargetId < 7) {
return calcHalfBowTarget(x, y, targetWidth); return calcHalfBowTarget(x - 2, y - 2, diameter);
} else if (bowtargetId === 7) { } else if (bowtargetId === 7) {
return calcTripleBowTarget(x, y, targetWidth, targetHeight); return calcTripleBowTarget(x, y, diameter);
} else if (bowtargetId === 8) { } else if (bowtargetId === 8) {
return calcPinBowTarget(x, y, targetWidth, targetHeight); return calcPinBowTarget(x, y, diameter);
} else if (bowtargetId === 9) { } else if (bowtargetId === 9) {
return calcTripleBowTarget(x, y, targetWidth, targetHeight, true); return calcTripleBowTarget(x, y, diameter, true);
} else if (bowtargetId === 10) { } else if (bowtargetId === 10) {
return calcPinBowTarget(x, y, targetWidth, targetHeight, true); return calcPinBowTarget(x, y, diameter, true);
} }
return 0; return 0;
}; };