通过 Go 语言的自定义类型,以及简单的数学运算,计算炮弹发射方位角。
问题
// 炮兵阵地 O0 , 侦察兵 O1, 敌军所在位置 T,
// 已知 T 在极点为 O1 的极坐标系中的位置 T(ρ1,θ1),参考实例T(60.6333,33),
// 已知 O1 在极点为 O0 的极坐标系中的位置 O1(ρ0,θ0),参考实例O1(84.0553,142)
// 已知极点为 O0 和 O1 的极坐标系的 x 轴平行, 全部显示角的单位为度。
// 求 T 在极点为 O0 的极坐标中的位置T(ρ2,θ2),任何编程语言均可,给出结果吧。
图示如下
求解
主要用到了:已知三角形的两个边长以及其夹角的角度,求该夹角对边长度; 余弦定理求一个已知三边长度的三角形某个角的角度,下面是一个 Go 语言实现:
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | /* * @Author: suifengtec * @Date: 2017-08-20 14:02:34 * @Last Modified by: Administrator * @Last Modified time: 2017-08-20 14:38:22 **/ // 炮兵阵地 O0 , 侦察兵 O1, 敌军所在位置 T, // 已知 T 在极点为 O1 的极坐标系中的位置 T(ρ1,θ1),参考实例T(60.6333,33), // 已知 O1 在极点为 O0 的极坐标系中的位置 O1(ρ0,θ0),参考实例O1(84.0553,142) // 已知极点为 O0 和 O1 的极坐标系的 x 轴平行, 全部显示角的单位为度。 // 求 T 在极点为 O0 的极坐标中的位置T(ρ2,θ2),任何编程语言均可,给出结果吧。 // // go run main.go package main import ( "fmt" "math" ) type Dot struct { //ρ //radius R float64 //θ //degrees D float64 } // 给定三角形的三条边,求出第一条边对应的角的度数 // 第一个参数是三角形中角的对边,返回的是三角形的角的度数 // 余弦定理 // 求θ4 func getMyDegrees(a, b, c float64) float64 { vTmp := math.Pow(b, 2) + math.Pow(c, 2) - math.Pow(a, 2) vTmp /= 2 * b * c vTmp = math.Acos(vTmp) vTmp = radiansToDegrees(vTmp) return vTmp } // 弧度转换为度数 func radiansToDegrees(a float64) float64 { return a * 180 / math.Pi } // 弧度转换为度数 func degreesToRadians(a float64) float64 { return a * math.Pi / 180 } // 据给定的两个不同极点的极坐标求距离 // 求ρ 2 // 86.15765565266139 func getDirect(dot1 Dot, dot2 Dot) float64 { v := math.Pow(dot1.R, 2) + math.Pow(dot2.R, 2) - 2*dot1.R*dot2.R*math.Cos(degreesToRadians(180+dot1.D-dot2.D)) v = math.Sqrt(v) return v } func main() { var ( dot1 Dot dot2 Dot ) // T 在 O1 坐标系中的位置 // ρ1,θ1 dot1 = Dot{60.6333, 33} // O1 在 O0 坐标系中的位置 // ρ0,θ0 dot2 = Dot{84.0553, 142} // 求出了 ρ 2 d := getDirect(dot1, dot2) //41.71356070930023 // 求出了θ2 aD2 := dot2.D - getMyDegrees(dot1.R, dot2.R, d) fmt.Println("发射距离和角度") fmt.Println(d) fmt.Println(aD2) /* 发射距离和角度 86.15765565266139 100.28643929069978 */ } |
输入点dot1 和 dot2 可通过 Lua 连接 C 应用,自动获取, 加上通道和无限循环,可实时获取到发射距离和角度,当然了,没考虑风速什么的,这只是个模拟。