一、
乙個例子:
如上圖,有兩條直線,設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中的元素的條件控制。引數實體定義以 作為開頭,引用也以 開...