2021-11-18.使用Python處理一些直線問題并用matplotlib畫圖

最近處理一些問題,涉及到對(duì)直線進(jìn)行處理怜校。對(duì)于十幾年不接觸數(shù)學(xué)的人而言,有些意思注竿。

我想要實(shí)現(xiàn)的有以下:

  1. 已知兩個(gè)點(diǎn)(x1, y1), (x2, y2)茄茁,求直線方程;
  2. 已知四個(gè)點(diǎn)(x1, y1), (x2, y2), (p1, q1), (p2, q2)巩割,求(x1, y1), (x2, y2)組成的直線與(p1, q1), (p2, q2)組成直線裙顽,這兩條直線的交點(diǎn);
  3. 過該交點(diǎn)喂分,平分交點(diǎn)的角锦庸,形成的直線机蔗,求該直線的方程蒲祈;
  4. 最好能畫出來上述的圖。

需要準(zhǔn)備的數(shù)學(xué)知識(shí)萝嘁,可以參考維基或數(shù)學(xué)課本梆掸,也可以自己算出來。簡(jiǎn)單截圖如下:

  1. 直線定義牙言,兩點(diǎn)式酸钦、斜截式和一般式


  1. 兩個(gè)直線的交點(diǎn)


  2. 平面2點(diǎn)距離


  3. 角平分線定理


備注:實(shí)際上也可以求的交點(diǎn)的夾角后,通過一條直線旋轉(zhuǎn)后生成方程咱枉。但是推導(dǎo)起來有點(diǎn)困難卑硫,所以沒有采用。過后我如果解決了蚕断,會(huì)再寫上欢伏。

步驟如下:

  1. 求交點(diǎn);
  2. 在交點(diǎn)的左右取x值亿乳,計(jì)算出對(duì)應(yīng)的y值硝拧,形成2個(gè)點(diǎn)后,直線的方程就有了葛假。

下面是代碼(簡(jiǎn)化處理障陶,沒有考慮平行的情況)

# 導(dǎo)入必要的包
import numpy as np
from matplotlib import pyplot as plt
import math

# 過直線A的兩點(diǎn)
x1, y1 = 2, 3
x2, y2 = 7, 10

# 過直線B的兩點(diǎn)
p1, q1 = 4, 8
p2, q2 = 6, 3

# 繪制直線A上的點(diǎn)
plt.plot(x1, y1, "ob")
plt.plot(x2, y2, "ob")

# 繪制直線A上的點(diǎn)
plt.plot(p1, q1, "or")
plt.plot(p2, q2, "or")

# 定義求斜率的方法
def get_k(x1,y1,x2,y2):
    k = (y1-y2)/(x1-x2)
    return k

# 定義求截距的方法
def get_b(x1,y1,x2,y2):
    b = (x1*y2-x2*y1)/(x1-x2)
    return b

# 繪制直線A
k1 = get_k(x1,y1,x2,y2)
b1 = get_b(x1,y1,x2,y2)
x_1 = np.arange(1, 10, 0.2)
y_1 = k1 *x_1 +b1 
plt.plot(x_1 , y_1 , linewidth=0.5)

# 繪制直線B
k2  = get_k(p1,q1,p2,q2)
b2 = get_b(p1,q1,p2,q2)
x_2 = np.arange(1, 10, 0.2)
y_2 = k2 *x_2 +b2 
plt.plot(x_2, y_2, linewidth=0.5)

# 定義矩陣運(yùn)算,方便調(diào)用
def mat(a, b, c, d):
    return a*d-b*c

# 定義獲取一般式ABC的方法
def get_ABC(x1, y1, x2, y2):
    A = y2 - y1
    B = x1 - x2
    C = x2*y1 - x1*y2
    return A, B, C

# 分別求兩條直線的ABC
A1, B1, C1 = get_ABC(x1, y1, x2, y2)
A2, B2, C2 = get_ABC(p1, q1, p2, q2)

# 求出交點(diǎn)并繪制
cross_x = - (mat(C1, B1, C2, B2))/(mat(A1, B1, A2, B2))
cross_y = - (mat(A1, C1, A2, C2))/(mat(A1, B1, A2, B2))
plt.plot(cross_x, cross_y, "og")

# 求三角形底邊長(zhǎng)度聊训,隨便定義個(gè)中文名函數(shù)抱究。x是在x軸取的值,只需要在交點(diǎn)左右取兩點(diǎn)即可
def get_底邊長(zhǎng)度(x, k1, b1, k2, b2):
    y1 = k1*x+b1
    y2 = k2*x+b2
    return math.fabs(y1-y2)

# 定義求距離的方法
def get_distance(x0, y0, x1, y1):
    dd = (x0-x1)**2 + (y0-y1)**2
    d = math.sqrt(dd)
    return d

# 在交點(diǎn)的左带斑、右各取一個(gè)x軸位置鼓寺,分別求出該x時(shí)酿雪,兩條直線的y的值
x_left = cross_x - 3
y_left_1 = k1*x_left+b1
y_left_2 = k2*x_left+b2
x_right = cross_x + 3
y_right_1 = k1*x_right+b1
y_right_2 = k2*x_right+b2

# 于是一共有4個(gè)點(diǎn):(x_left, y_left_1), (x_left, y_left_2), (x_right, y_right_1), (x_right, y_right_2)

# 利用角平分線定理求得在夾角平分線上的點(diǎn)的y值
上邊長(zhǎng)_left = get_distance(x_left, max(y_left_1, y_left_2), cross_x, cross_y)
下邊長(zhǎng)_left = get_distance(x_left, min(y_left_1, y_left_2), cross_x, cross_y)
上邊長(zhǎng)_right = get_distance(x_right, max(y_right_1, y_right_2), cross_x, cross_y)
下邊長(zhǎng)_right = get_distance(x_right, min(y_right_1, y_right_2), cross_x, cross_y)
底邊長(zhǎng)度_left = get_底邊長(zhǎng)度(x_left, k1, b1, k2, b2)
底邊長(zhǎng)度_right = get_底邊長(zhǎng)度(x_right, k1, b1, k2, b2)
上底邊_left = (上邊長(zhǎng)_left * 底邊長(zhǎng)度_left)/(上邊長(zhǎng)_left+下邊長(zhǎng)_left)
y_left = max(y_left_1, y_left_2) - 上底邊_left # 左邊的點(diǎn)為(x_left, y_left)
上底邊_right = (上邊長(zhǎng)_right * 底邊長(zhǎng)度_right)/(上邊長(zhǎng)_right+下邊長(zhǎng)_right)
y_right = max(y_right_1, y_right_2) - 上底邊_right # 右邊的點(diǎn)為(x_right, y_right)

# 現(xiàn)在夾角平分線上的2個(gè)點(diǎn)就有了。該直線很容易求得侄刽。順便把這2個(gè)點(diǎn)也畫出來
plt.plot(x_left, y_left, "og")
plt.plot(x_right, y_right, "og")
k = get_k(x_left, y_left, x_right, y_right)
b = get_b(x_left, y_left, x_right, y_right)

# 最后把直線畫出來
x = np.arange(1, 10, 0.2)
y = k*x+b
plt.plot(x, y, linewidth=0.8)

結(jié)果如下圖:


畫出來的圖看起來好像兩個(gè)角不一樣大指黎。本著求真務(wù)實(shí)的精神,在用點(diǎn)到距離的公式驗(yàn)算一下州丹。
正確的情況下醋安,點(diǎn)到兩條直線的距離應(yīng)該相等。

# 定義計(jì)算點(diǎn)到直線的距離的方法
def get_點(diǎn)到直線距離(A, B, C, x, y):
    up = math.fabs(A*x+B*y+C)
    down = math.sqrt(A**2+B**2)
    d = up/down
    return d

d1 = line.get_點(diǎn)到直線距離(A1, B1, C1, x_left, y_left)
d2 = line.get_點(diǎn)到直線距離(A2, B2, C2, x_right, y_right)

# d1 = 2.6512291367965264
# d2 = 2.6512291367965277

d1與d2幾乎相等了墓毒,看起來角不一樣大吓揪,可能是由于運(yùn)算的誤差造成的。

以上所计,如果有錯(cuò)誤柠辞,還請(qǐng)留言批評(píng)指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末主胧,一起剝皮案震驚了整個(gè)濱河市叭首,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踪栋,老刑警劉巖焙格,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夷都,居然都是意外死亡眷唉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門囤官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冬阳,“玉大人,你說我怎么就攤上這事党饮「闻悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵劫谅,是天一觀的道長(zhǎng)见坑。 經(jīng)常有香客問我,道長(zhǎng)捏检,這世上最難降的妖魔是什么荞驴? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贯城,結(jié)果婚禮上熊楼,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好鲫骗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布犬耻。 她就那樣靜靜地躺著,像睡著了一般执泰。 火紅的嫁衣襯著肌膚如雪枕磁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天术吝,我揣著相機(jī)與錄音计济,去河邊找鬼。 笑死排苍,一個(gè)胖子當(dāng)著我的面吹牛沦寂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淘衙,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼传藏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了彤守?” 一聲冷哼從身側(cè)響起毯侦,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遗增,沒想到半個(gè)月后叫惊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體款青,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡做修,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡草。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饰及。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖康震,靈堂內(nèi)的尸體忽然破棺而出燎含,到底是詐尸還是另有隱情,我是刑警寧澤腿短,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布屏箍,位于F島的核電站,受9級(jí)特大地震影響橘忱,放射性物質(zhì)發(fā)生泄漏赴魁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一钝诚、第九天 我趴在偏房一處隱蔽的房頂上張望颖御。 院中可真熱鬧,春花似錦凝颇、人聲如沸潘拱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芦岂。三九已至瘪弓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禽最,已是汗流浹背杠茬。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛随,地道東北人瓢喉。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舀透,于是被迫代替她去往敵國(guó)和親栓票。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容