feiyu02
2025-03-21 e5bdf2e02090357cbd580d54e6cd2406dd541760
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.flightfeather.uav.model.underwaygrid
 
import com.flightfeather.uav.model.BaseWeight
import com.flightfeather.uav.socket.eunm.FactorType
import java.math.BigDecimal
import kotlin.math.PI
import kotlin.math.abs
import kotlin.math.atan2
 
/**
 * 风向权重
 * @date 2025/3/21
 * @author feiyu02
 */
class GridWindDirWeight : BaseWeight<GridCellAndData, GridCellSop>() {
    override val tag: String = "风向权重"
 
    override val sectionValues: List<Double> = listOf(22.5, 67.5, 112.5, 157.5, 180.0)
 
    override val weights: List<Double> = listOf(1.0, 0.8, 0.5, 0.2, 0.1)
 
    override fun onWeightFactor(mData: GridCellAndData, sop: GridCellSop): Double? {
        val p1 = Pair(mData.gridCell.longitude, mData.gridCell.latitude)
        val p2 = Pair(sop.gridCell.longitude, sop.gridCell.latitude)
        val wd = mData.getFactorData(FactorType.WIND_DIRECTION) ?: 0.0
        return getAngle(p1, p2, wd)
    }
 
    private fun getAngle(p1: Pair<BigDecimal, BigDecimal>, p2: Pair<BigDecimal, BigDecimal>, wd: Double): Double {
        val dx = p2.first - p1.first
        val dy = p2.second - p1.second
        var x1 = atan2(dy.toDouble(), dx.toDouble()) * 180 / PI + 180
        if (x1 < 0) x1 += 360
        var x2 = 270 - wd
        if (x2 < 0) x2 += 360
        x1 = abs(x2 - x1)
        if (x1 > 180) x1 = 360 - x1
        return x1
    }
}