三角定位 笔记

三角定位 笔记三角定位笔记纯高中知识尝试解三角定位问题推一推公式先用勾股定理推点东西我们需要 AD 的长度 所以 BD2 c2 AD2 a2 b AD 2c2 AD2 a2 b2 2a AD AD2AD c2 a2 b22b begi

大家好,欢迎来到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=13P1A=2∣P1P2r12+P1P22r22=4AP2P1A=P1P2P1AP1A=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,kP1P2kA=1,kA无解

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∣P1P3r12+P1P32r32=25
CP3P1C=55
25
25
=
32C=(1+3232×5,1+3232×10)=(2,4)kP1P3=2,kP1P3kC=1,kC=21lC:(y4)y=21(x2)=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} yy0yy0ykxkxy=k(xx0)=kxkx0=y0kx0=kx0y0

如果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=x2x1y2y1l1l2k1k2=1k1=k21=y2y1x1x2

按这个思路,先默认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

(0)
上一篇 2025-09-07 19:20
下一篇 2025-09-07 19:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信