战术计算优化

This commit is contained in:
takeshita
2025-11-27 09:57:10 +08:00
parent 442c97136a
commit 6d0107cd50

View File

@ -16,7 +16,7 @@
<el-form-item label="我方距堵击点"> <el-form-item label="我方距堵击点">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入我方距堵击点" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入我方距堵击点" min="0" max="99999999"
v-model="blockade.weDistance" /> v-model="blockade.weDistance" @input="checkBlockadeWeDistance" />
<span class="unit">km</span> <span class="unit">km</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -24,7 +24,7 @@
<el-form-item label="敌方距堵击点"> <el-form-item label="敌方距堵击点">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入敌方距堵击点" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入敌方距堵击点" min="0" max="99999999"
v-model="blockade.enemyDistance" /> v-model="blockade.enemyDistance" @input="checkBlockadeEnemyDistance" />
<span class="unit">km</span> <span class="unit">km</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -32,7 +32,7 @@
<el-form-item label="敌方平均速度"> <el-form-item label="敌方平均速度">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入敌方平均速度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入敌方平均速度" min="0" max="99999999"
v-model="blockade.enemySpeed" /> v-model="blockade.enemySpeed" @input="checkBlockadeEnemySpeed" />
<span class="unit">km/h</span> <span class="unit">km/h</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -51,9 +51,12 @@
<div> <div>
<span>所需追击时间</span> <span>所需追击时间</span>
<span v-show="blockade.time === null">_</span> <span v-show="blockade.time === null">_</span>
<span v-show="blockade.time !== null"> <span v-show="blockade.time !== null">
<span v-show="blockade.formatTime.integerPart >= 1"><span class="data">{{blockade.formatTime.integerPart }}</span>h</span> <span v-show="blockade.formatTime.integerPart >= 1"><span class="data">{{ blockade.formatTime.integerPart
<span v-show="blockade.formatTime.fractionalPart > 0 ||(blockade.formatTime.integerPart === 0 && blockade.formatTime.fractionalPart === 0)"><span class="data">{{ Math.round(blockade.formatTime.fractionalPart * 60)}}</span>min</span> }}</span>h</span>
<span
v-show="blockade.formatTime.fractionalPart > 0 || (blockade.formatTime.integerPart === 0 && blockade.formatTime.fractionalPart === 0)"><span
class="data">{{ Math.round(blockade.formatTime.fractionalPart * 60) }}</span>min</span>
</span> </span>
</div> </div>
</div> </div>
@ -63,7 +66,7 @@
<el-form-item label="与敌人的距离"> <el-form-item label="与敌人的距离">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入与敌人距离" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入与敌人距离" min="0" max="99999999"
v-model="pursuit.distance" /> v-model="pursuit.distance" @input="checkPursuitDistance" />
<span class="unit">km</span> <span class="unit">km</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -71,7 +74,7 @@
<el-form-item label="敌运动速度"> <el-form-item label="敌运动速度">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入敌运动速度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入敌运动速度" min="0" max="99999999"
v-model="pursuit.enemySpeed" /> v-model="pursuit.enemySpeed" @input="checkPursuitEnemySpeed" />
<span class="unit">km/h</span> <span class="unit">km/h</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -79,7 +82,7 @@
<el-form-item label="追击速度"> <el-form-item label="追击速度">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入追击速度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入追击速度" min="0" max="99999999"
v-model="pursuit.speed" /> v-model="pursuit.speed" @input="checkPursuitSpeed" />
<span class="unit">km/h</span> <span class="unit">km/h</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -93,9 +96,12 @@
<div> <div>
<span>追上敌方的时间</span> <span>追上敌方的时间</span>
<span v-show="pursuit.time == null">_</span> <span v-show="pursuit.time == null">_</span>
<span v-show="pursuit.time !== null"> <span v-show="pursuit.time !== null">
<span v-show="pursuit.formatTime.integerPart >= 1"><span class="data">{{pursuit.formatTime.integerPart }}</span>h</span> <span v-show="pursuit.formatTime.integerPart >= 1"><span class="data">{{ pursuit.formatTime.integerPart
<span v-show="pursuit.formatTime.fractionalPart > 0 ||(pursuit.formatTime.integerPart === 0 && pursuit.formatTime.fractionalPart === 0)"><span class="data">{{ Math.round(pursuit.formatTime.fractionalPart * 60)}}</span>min</span> }}</span>h</span>
<span
v-show="pursuit.formatTime.fractionalPart > 0 || (pursuit.formatTime.integerPart === 0 && pursuit.formatTime.fractionalPart === 0)"><span
class="data">{{ Math.round(pursuit.formatTime.fractionalPart * 60) }}</span>min</span>
</span> </span>
</div> </div>
</div> </div>
@ -105,7 +111,7 @@
<el-form-item label="敌我间距离"> <el-form-item label="敌我间距离">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入敌我间距离" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入敌我间距离" min="0" max="99999999"
v-model="encounter.distance" /> v-model="encounter.distance" @input="checkEncounterDistance" />
<span class="unit">km</span> <span class="unit">km</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -113,7 +119,7 @@
<el-form-item label="我运动时速"> <el-form-item label="我运动时速">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入我运动时速" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入我运动时速" min="0" max="99999999"
v-model="encounter.weSpeed" /> v-model="encounter.weSpeed" @input="checkEncounterWeSpeed" />
<span class="unit">km/h</span> <span class="unit">km/h</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -121,7 +127,7 @@
<el-form-item label="敌运动速度"> <el-form-item label="敌运动速度">
<div class="input-number input-number-unit-3"> <div class="input-number input-number-unit-3">
<input class="input" type="number" title="" placeholder="请输入敌运动速度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入敌运动速度" min="0" max="99999999"
v-model="encounter.enemySpeed" /> v-model="encounter.enemySpeed" @input="checkEncounterEnemySpeed" />
<span class="unit">km/h</span> <span class="unit">km/h</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -135,16 +141,19 @@
<div> <div>
<span>与敌遭遇的时间</span> <span>与敌遭遇的时间</span>
<span v-show="encounter.time === null">_</span> <span v-show="encounter.time === null">_</span>
<span v-show="encounter.time !== null"> <span v-show="encounter.time !== null">
<span v-show="encounter.formatTime.integerPart >= 1"><span class="data">{{encounter.formatTime.integerPart }}</span>h</span> <span v-show="encounter.formatTime.integerPart >= 1"><span
<span v-show="encounter.formatTime.fractionalPart > 0 ||(encounter.formatTime.integerPart === 0 && encounter.formatTime.fractionalPart === 0)"><span class="data">{{ Math.round(encounter.formatTime.fractionalPart * 60)}}</span>min</span> class="data">{{ encounter.formatTime.integerPart }}</span>h</span>
<span
v-show="encounter.formatTime.fractionalPart > 0 || (encounter.formatTime.integerPart === 0 && encounter.formatTime.fractionalPart === 0)"><span
class="data">{{ Math.round(encounter.formatTime.fractionalPart * 60) }}</span>min</span>
</span> </span>
</div> </div>
<div> <div>
<span>与敌遭遇的距离</span> <span>与敌遭遇的距离</span>
<span v-show="!encounter.meetingDistance && encounter.meetingDistance !== 0">_</span> <span v-show="!encounter.meetingDistance && encounter.meetingDistance !== 0">_</span>
<span v-show="encounter.meetingDistance || encounter.meetingDistance === 0"> <span class="data">{{ <span v-show="encounter.meetingDistance || encounter.meetingDistance === 0"> <span class="data">{{
encounter.meetingDistance }}</span>km</span> encounter.meetingDistance }}</span>km</span>
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
@ -153,7 +162,7 @@
<el-form-item label="河宽或潜渡路线长度"> <el-form-item label="河宽或潜渡路线长度">
<div class="input-number input-number-unit-1" style="width: 190px;"> <div class="input-number input-number-unit-1" style="width: 190px;">
<input class="input" type="number" title="" placeholder="请输入河宽或潜渡路线长度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入河宽或潜渡路线长度" min="0" max="99999999"
v-model="dive.distance" /> v-model="dive.distance" @input="checkDiveDistance" />
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -161,23 +170,23 @@
<el-form-item label="潜渡中坦克间距"> <el-form-item label="潜渡中坦克间距">
<div class="input-number input-number-unit-3" style="width: 190px;"> <div class="input-number input-number-unit-3" style="width: 190px;">
<input class="input" type="number" title="" placeholder="请输入潜渡中坦克间距" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入潜渡中坦克间距" min="0" max="99999999"
v-model="dive.spacing" /> v-model="dive.spacing" @input="checkDiveSpacing" />
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="潜渡坦克数量"> <el-form-item label="潜渡坦克数量">
<div class="input-number input-number-unit-3" style="width: 190px;"> <div class="input-number input-number-unit-3" style="width: 190px;">
<input class="input" type="number" title="" placeholder="请输入潜渡坦克数量" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入潜渡坦克数量" min="1" max="99999999"
v-model="dive.tank" /> v-model="dive.tank" @input="checkDiveTank" />
<span class="unit"></span> <span class="unit"></span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="潜渡路线数量"> <el-form-item label="潜渡路线数量">
<div class="input-number input-number-unit-3" style="width: 190px;"> <div class="input-number input-number-unit-3" style="width: 190px;">
<input class="input" type="number" title="" placeholder="请输入潜渡路线数量" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入潜渡路线数量" min="1" max="99999999"
v-model="dive.route" /> v-model="dive.route" @input="checkDiveRoute" />
<span class="unit"></span> <span class="unit"></span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -185,7 +194,7 @@
<el-form-item label="潜渡速度"> <el-form-item label="潜渡速度">
<div class="input-number input-number-unit-3" style="width: 190px;"> <div class="input-number input-number-unit-3" style="width: 190px;">
<input class="input" type="number" title="" placeholder="请输入潜渡速度" min="0" max="99999999" <input class="input" type="number" title="" placeholder="请输入潜渡速度" min="0" max="99999999"
v-model="dive.speed" /> v-model="dive.speed" @input="checkDiveSpeed" />
<span class="unit">m/min</span> <span class="unit">m/min</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -199,9 +208,12 @@
<div> <div>
<span>潜渡时间</span> <span>潜渡时间</span>
<span v-show="dive.time === null">_</span> <span v-show="dive.time === null">_</span>
<span v-show="dive.time !== null"> <span v-show="dive.time !== null">
<span v-show="dive.formatTime.integerPart >= 1"><span class="data">{{dive.formatTime.integerPart }}</span>h</span> <span v-show="dive.formatTime.integerPart >= 1"><span class="data">{{ dive.formatTime.integerPart
<span v-show="dive.formatTime.fractionalPart > 0 ||(dive.formatTime.integerPart === 0 && dive.formatTime.fractionalPart === 0)"><span class="data">{{ Math.round(dive.formatTime.fractionalPart * 60)}}</span>min</span> }}</span>h</span>
<span
v-show="dive.formatTime.fractionalPart > 0 || (dive.formatTime.integerPart === 0 && dive.formatTime.fractionalPart === 0)"><span
class="data">{{ Math.round(dive.formatTime.fractionalPart * 60) }}</span>min</span>
</span> </span>
</div> </div>
</div> </div>
@ -352,10 +364,7 @@ export default {
}, },
pursuitCalculate() { pursuitCalculate() {
let num = Number(this.pursuit.distance) if (!this.pursuit.distance || !this.pursuit.enemySpeed || !this.pursuit.speed) {
let num2 = Number(this.pursuit.enemySpeed)
let num3 = Number(this.pursuit.speed)
if (!num || !num2 || !num3) {
this.pursuit.time = null this.pursuit.time = null
this.pursuit.formatTime = { this.pursuit.formatTime = {
integerPart: null, integerPart: null,
@ -364,9 +373,16 @@ export default {
return; return;
} }
let num = Number(this.pursuit.distance)
let num2 = Number(this.pursuit.enemySpeed)
let num3 = Number(this.pursuit.speed)
// 如果初始距离为0已经追上 // 如果初始距离为0已经追上
if (num === 0) { if (num === 0) {
this.pursuit.time = 0 this.pursuit.time = 0
this.pursuit.formatTime = {
integerPart: 0,
fractionalPart: 0,
}
} }
else { else {
const relativeSpeed = num3 - num2; const relativeSpeed = num3 - num2;
@ -387,10 +403,7 @@ export default {
}, },
encounterCalculate() { encounterCalculate() {
let num = Number(this.encounter.distance) if (!this.encounter.distance || !this.encounter.weSpeed || !this.encounter.enemySpeed) {
let num2 = Number(this.encounter.weSpeed)
let num3 = Number(this.encounter.enemySpeed)
if (!num || !num2 || !num3) {
this.encounter.time = null this.encounter.time = null
this.encounter.meetingDistance = null this.encounter.meetingDistance = null
this.encounter.formatTime = { this.encounter.formatTime = {
@ -399,6 +412,13 @@ export default {
} }
return; return;
} }
let num = Number(this.encounter.distance)
let num2 = Number(this.encounter.weSpeed)
let num3 = Number(this.encounter.enemySpeed)
if(num2 == 0 && num3 == 0) {
this.$message.warning("敌我双方运动时速皆为0不会遭遇");
return
}
const relativeSpeed = num2 + num3; const relativeSpeed = num2 + num3;
this.encounter.time = Math.round((num / relativeSpeed) * 100) / 100; this.encounter.time = Math.round((num / relativeSpeed) * 100) / 100;
this.encounter.meetingDistance = Math.round((num2 * this.encounter.time) * 100) / 100 this.encounter.meetingDistance = Math.round((num2 * this.encounter.time) * 100) / 100
@ -422,7 +442,7 @@ export default {
// let time = ((distance + ((tank / route) * spacing)) / speed) // let time = ((distance + ((tank / route) * spacing)) / speed)
let num = Math.ceil(tank / route) //路径上坦克最多数量 let num = Math.ceil(tank / route) //路径上坦克最多数量
let actualDistance = distance let actualDistance = distance
if(num > 1) { if (num > 1) {
actualDistance = distance + ((num - 1) * spacing) actualDistance = distance + ((num - 1) * spacing)
} }
let time = actualDistance / speed let time = actualDistance / speed
@ -459,7 +479,92 @@ export default {
data = { integerPart, fractionalPart }; data = { integerPart, fractionalPart };
} }
return data return data
} },
checkBlockadeWeDistance(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.blockade.weDistance = 0.01
}
},
checkBlockadeEnemyDistance(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.blockade.enemyDistance = 0.01
}
},
checkBlockadeEnemySpeed(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.blockade.enemySpeed = 0.01
}
},
checkPursuitDistance(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.pursuit.distance = 0.01
}
},
checkPursuitEnemySpeed(e) {
let value = Number(e.target.value)
if (value < 0) {
this.pursuit.enemySpeed = 0
}
},
checkPursuitSpeed(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.pursuit.speed = 0.01
}
},
checkEncounterDistance(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.encounter.distance = 0.01
}
},
checkEncounterWeSpeed(e) {
let value = Number(e.target.value)
if (value < 0) {
this.encounter.weSpeed = 0
}
},
checkEncounterEnemySpeed(e) {
let value = Number(e.target.value)
if (value < 0) {
this.encounter.enemySpeed = 0
}
},
checkDiveDistance(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.dive.distance = 0.01
}
},
checkDiveSpacing(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.dive.spacing = 0.01
}
},
checkDiveTank(e) {
let value = Number(e.target.value)
if (value < 1) {
this.dive.tank = 1
}
},
checkDiveRoute(e) {
let value = Number(e.target.value)
if (value < 1) {
this.dive.route = 1
}
},
checkDiveSpeed(e) {
let value = Number(e.target.value)
if (value < 0.01) {
this.dive.speed = 0.01
}
},
}, },
mounted() { mounted() {
}, },
@ -664,5 +769,4 @@ export default {
} }
} }
} }
} }</style>
</style>