大家好,欢迎来到IT知识分享网。
三角定位 笔记
纯高中知识尝试解三角定位问题
推推,介绍介绍公式
(为什么csdn的katex对齐用的是aligned而不是align,突然有点不习惯
手算一遍
做过N垂直于P1P2的垂线交P1P2与A,垂直于P1P3的交P1P3与C
注意到 Δ P 1 P 2 N \Delta P_1P_2N ΔP1P2N可以用公式1并求出两线段比值
∣ P 1 P 2 ∣ = 13 ∣ P 1 A ∣ = r 1 2 + ∣ P 1 P 2 ∣ 2 − r 2 2 2 ∣ P 1 P 2 ∣ = 4 ∣ P 1 A ∣ ∣ A P 2 ∣ = ∣ P 1 A ∣ ∣ P 1 P 2 ∣ − ∣ P 1 A ∣ = 4 9 |P_1P_2|=13\\ |P_1A|=\frac{r_1^2+|P_1P_2|^2-r_2^2}{2|P_1P_2|}=4\\ \frac{|P_1A|}{|AP_2|}=\frac{|P_1A|}{|P_1P_2|-|P_1A|}=\frac{4}{9}\\ ∣P1P2∣=13∣P1A∣=2∣P1P2∣r12+∣P1P2∣2−r22=4∣AP2∣∣P1A∣=∣P1P2∣−∣P1A∣∣P1A∣=94
有了比值就可以用公式2了
A = ( 4 9 × 13 1 + 4 9 , 0 ) = ( 4 , 0 ) A=(\frac{\frac{4}{9}\times 13}{1+\frac{4}{9}},0)=(4,0) A=(1+9494×13,0)=(4,0)
这里想求过A和N的直线的方程,用点斜式试试,先求斜率
k P 1 P 2 = 0 , k P 1 P 2 k ⊥ A = − 1 , k ⊥ A 无解 k_{P_1P_2}=0,k_{P_1P_2}k_{\bot A}=-1,k_{\bot A}无解 kP1P2=0,kP1P2k⊥A=−1,k⊥A无解
k⊥A不存在!那就直接代点的横坐标,所以lA就是
l A : x = 4 l_A:x=4 lA:x=4
对C做相同的流程(实际上这里选另一个点完全可以)
∣ P 1 C ∣ = r 1 2 + ∣ P 1 P 3 ∣ 2 − r 3 2 2 ∣ P 1 P 3 ∣ = 2 5 ∣ P 1 C ∣ ∣ C P 3 ∣ = 2 5 5 5 − 2 5 = 2 3 ∴ C = ( 2 3 × 5 1 + 2 3 , 2 3 × 10 1 + 2 3 ) = ( 2 , 4 ) k P 1 P 3 = 2 , k P 1 P 3 k ⊥ C = − 1 , k ⊥ C = − 1 2 l C : ( y − 4 ) = − 1 2 ( x − 2 ) y = − 1 2 x + 5 |P_1C|=\frac{r_1^2+|P_1P_3|^2-r_3^2}{2|P_1P_3|}=2\sqrt{5}\\ \frac{|P_1C|}{|CP_3|}=\frac{2\sqrt{5}}{5\sqrt{5}-2\sqrt{5}}=\frac{2}{3}\\ \therefore C=(\frac{\frac{2}{3}\times5}{1+\frac{2}{3}},\frac{\frac{2}{3}\times10}{1+\frac{2}{3}})=(2,4)\\ k_{P_1P_3}=2,k_{P_1P_3}k_{\bot C}=-1,k_{\bot C}=-\frac{1}{2}\\ \begin{aligned} l_C:(y-4) &= -\frac{1}{2}(x-2)\\ y &= -\frac{1}{2}x+5 \end{aligned} ∣P1C∣=2∣P1P3∣r12+∣P1P3∣2−r32=25∣CP3∣∣P1C∣=55−2525=32∴C=(1+3232×5,1+3232×10)=(2,4)kP1P3=2,kP1P3k⊥C=−1,k⊥C=−21lC:(y−4)y=−21(x−2)=−21x+5
联立lA和lC
{ x = 4 y = − 1 2 x + 5 ⇒ { x = 4 y = 3 \begin{cases} x=4\\ y=-\frac{1}{2}x+5 \end{cases}\Rightarrow\begin{cases} x=4\\ y=3 \end{cases} {
x=4y=−21x+5⇒{
x=4y=3
也就是说目标点就在(4,3)
一点奇技淫巧
如果真按照手动计算来说的话,可能还要创建一个直线的类,不过我们用到直线的功能不多,就两个:点斜式和解交点,那我们就可以做一做思路的变换
对于二元一次方程组,可以把它化成一个向量方程,eg.
{ a x + b y = c d x + e y = f ⇔ [ a b d e ] [ x y ] = [ c f ] \begin{cases} ax+by=c\\ dx+ey=f \end{cases}\Leftrightarrow\begin{bmatrix} a&b\\d&e \end{bmatrix}\begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} c\\f \end{bmatrix} {
ax+by=cdx+ey=f⇔[adbe][xy]=[cf]
那么方程组的解就是
[ x y ] = [ a b d e ] − 1 [ c f ] \begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} a&b\\d&e \end{bmatrix}^{-1}\begin{bmatrix} c\\f \end{bmatrix} [xy]=[adbe]−1[cf]
这一步刚好可以通过numpy实现
当然这里可以用克莱姆法则就是现在还没有对比一下谁更快一点
先把前面几个公式写好
class point():#写个点的类方便区分横纵坐标值,当然你直接用元组或者numpy数组 def __init__(self, x, y) -> None: self.x = x self.y = y def dist(a: point, b: point): # distance,两点间距离 return sqrt((b.x-a.x)2+(b.y-a.y)2) def dpsp(p1: point, p2: point, ratio): # definite proportion and separated points,定比分点 return point((p1.x+ratio*p2.x)/(1+ratio), (p1.y+ratio*p2.y)/(1+ratio)) def ratio(r1, r2, dst): return (r12+dst2-r22)/(2*dst)
那么对于建立方程组这个问题,我们对点斜式做点手脚
通过那个向量方程的例子你也可以看出,为了一次性解决问题,x和y不带任何符号,所以为了方便我们做的时候一次性做好这个工作
这是点斜式和变形过程
y − y 0 = k ( x − x 0 ) y − y 0 = k x − k x 0 y − k x = y 0 − k x 0 k x − y = k x 0 − y 0 \begin{aligned} y-y_0 &= k(x-x_0)\\ y-y_0 &= kx-kx_0\\ y-kx &= y_0-kx_0\\ kx-y &= kx_0-y_0 \end{aligned} y−y0y−y0y−kxkx−y=k(x−x0)=kx−kx0=y0−kx0=kx0−y0
如果k和点知道了那么等号右边就是常数了,现在看左边
如果称y系数为a,x系数是k,y系数是-1,并且一半都是-1,除非斜率不存在.
如果斜率不存在,那么对于直线方程就是 x = x 0 x=x_0 x=x0,相当于k=1,a=0.并且,如果求的是垂线斜率的话我们可以直接变形啊
k = y 2 − y 1 x 2 − x 1 l 1 ⊥ l 2 ⇒ k 1 k 2 = − 1 ⇒ k 1 = − 1 k 2 = x 1 − x 2 y 2 − y 1 k=\frac{y_2-y_1}{x_2-x_1}\\ l_1\bot l_2\Rightarrow k_1k_2=-1\Rightarrow k_1=-\frac{1}{k_2}=\frac{x_1-x_2}{y_2-y_1} k=x2−x1y2−y1l1⊥l2⇒k1k2=−1⇒k1=−k21=y2−y1x1−x2
按这个思路,先默认a=-1,k正常求,斜率不存在时设k=1,a=0即可
整个方程式长这样
[ k 1 a 1 k 2 a 2 ] [ x y ] = [ k 1 x 1 + a 1 y 1 k 2 x 2 + a 2 y 2 ] \begin{bmatrix} k_1&a_1\\k_2&a_2 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}= \begin{bmatrix} k_1x_1+a_1y_1\\ k_2x_2+a_2y_2 \end{bmatrix} [k1k2a1a2][xy]=[k1x1+a1y1k2x2+a2y2]
这是核心逻辑
def trianglepos(p1: point, p2: point, p3: point, r1, r2, r3): a1 = a2 = -1 p1p2 = dist(p1, p2) p1a = ratio(r1, r2, p1p2) rate1 = p1a/(p1p2-p1a) A = dpsp(p1, p2, rate1) try: k1 = (p1.x-p2.x)/(p2.y-p1.y)#恭喜我debug成功 except ZeroDivisionError: k1 = 1 a1 = 0 p1p3 = dist(p1, p3) p1c = ratio(r1, r3, p1p3) rate2 = p1c/(p1p3-p1c) C = dpsp(p1, p3, rate2) try: k2 = (p1.x-p3.x)/(p3.y-p1.y) except ZeroDivisionError: k2 = 1 a2 = 0 return np.matrix([[k1, a1], [k2, a2]])-1 *\ np.matrix([[k1*A.x+a1*A.y], [k2*C.x+a2*C.y]])
恭喜我成功解决了这个隔了快两年才填的坑,不过这只是初步,下一步就是尝试验证这种方法是否能用于经纬度
本文代码已上传到gitee,传送门
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127418.html