一般方程與引數方程求直線交點

2022-07-03 06:33:15 字數 2072 閱讀 9355

一、

乙個例子:

如上圖,有兩條直線,設l1,l2。l1上有兩點(0, 0)、(10,10),l2上有兩點(0,10)、(10,0),它們的交點是(5,5)。求解交點有兩種效率較高的常用方法,一般方程法與引數方程法,以下將分別描述其原理及實現。

二、

一般方程法:

直線的一般方程為f(x) = ax + by + c = 0。既然我們已經知道直線的兩個點,假設為(x0,y0), (x1, y1),那麼可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。

因此我們可以將兩條直線分別表示為

f0(x) = a0*x + b0*y + c0 = 0, f1(x) = a1*x + b1*y + c1 = 0

那麼兩條直線的交點應該滿足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/d

y = (a1*c0 – a0*c1)/d

d = a0*b1 – a1*b0

, (d為0時,表示兩直線重合)

源**:

1#include 

<

iostream

>

2using

namespace

std;34

typedef 

struct

5 point;

8int

main()928

else

2932

return0;

33}34三、

引數方程法:

設直線上的兩個點為a0(x0, y0), b0(x1, y1),那麼線段

可用向量= –

=(x1 – x0, y1 – y0)

表示,的方向即為直線上的方向,那麼直線上的任意點便可表示為

s0(t0) =

+  t0 *

同理,另一條直線(a1(x2, y2), b1(x3, y3)為其上兩個點)可類似表示為

s1(t1) =

+  t1 *

因此,滿足兩條直線的交點必滿足以下條件:

+ t0 *

= + t1 *

可求出 t0 = (x0(y3 – y2) + x2(y0 – y3) + x3(y2 – y0))/d

t1 = -(x0(y2 – y1) + x1(y0 – y2) + x2(y1 – y0))/d

d = x0(y3 – y2) + x1(y2 – y3) + x3(y1 – y0) + x2(y0 – y1)

,(d為0時,表示兩直線重合)

則交點為:

x = x0 + t0 * (x1 – x0); y = y0 + t0 * (y1 – y0); 或

x = x2 + t1 * (x3 – x2); y = y2 + t1 * (y3 – y2);

如果將t0,t1限定在[0,1]內,則變為求線段的求點

源**:

1#include 

<

iostream

>

2using

namespace

std;34

typedef 

struct

5 point;

8int

main()926

else

2730

return0;

31}32四、

測試結果:

求直線的引數方程

如果二維空間內有兩個點 2,1 和 0,2 那麼經過這兩點的直線方程是什麼?初中的知識可以告訴我們,斜率是 k displaystyle frac 現在使用向量和引數方程來理解這個問題。假設在二維空間內有兩個向量 a 2,1 和 b 0,2 如下圖所示 乙個不太準確的說法是,將 b a 的兩端延長,...

n階差分方程重根計算公式的一般證明

n階差分方程重根計算公式的一般證明 設 x a n 0,則它的解的形式為a n,n a n,n 2 a n.n n 1 a n 下面採用數學歸納法證明 即在 x a n 1 0時,它的解形式為 a n 1 n 1 a n 1 n 1 2 a n 1 n 1 n a n 1 目前設一般形式為 n 1 ...

DTD引數實體與一般實體的區別

1.引數實體必須定義在單獨的 dtd文件中或 xml文件的 dtd區 但是引用只能在 dtd文件中,即外部子集,而不能在 xml文件的 dtd區 前者為該 xml文件的外部子集,後者為該 xml文件的內部子集 2.引數實體的作用是作為 dtd中的元素的條件控制。引數實體定義以 作為開頭,引用也以 開...