1. 概述
在實際進行空間幾何計算的時候,很難確定直線的方向向量,一般都是知道線段的起點\(O\)和終點\(E\)。那么顯然方向向量為\(D=E-O\)。這時,根據射線的向量方程,線段上某一點P為:
\[P=O+tD \]
很顯然,這個t值就確定了線段上\(P\)的位置。在方向向量由起止點確定,且點在線段內的情況下,t的取值范圍為0到1:取值為0時就是起點\(O\),取值為1時就是終點\(E\)。進一步,根據相似三角形原則,如果知道\(P\)點與起點\(O\)的距離為d,則t的取值為:
\[t = \frac{d}{Mod(D)} \]
其中Mod(D)是向量的模,也就是線段的長度。
2. 實現
具體的C++實現代碼如下:
#include <iostream>
using namespace std;
// 2D Point
struct Vector2d
{
public:
Vector2d()
{
}
Vector2d(double dx, double dy)
{
x = dx;
y = dy;
}
// 矢量賦值
void set(double dx, double dy)
{
x = dx;
y = dy;
}
// 矢量相加
Vector2d operator + (const Vector2d& v) const
{
return Vector2d(x + v.x, y + v.y);
}
// 矢量相減
Vector2d operator - (const Vector2d& v) const
{
return Vector2d(x - v.x, y - v.y);
}
//矢量數乘
Vector2d Scalar(double c) const
{
return Vector2d(c*x, c*y);
}
// 矢量點積
double Dot(const Vector2d& v) const
{
return x * v.x + y * v.y;
}
//向量的模
double Mod() const
{
return sqrt(x * x + y * y);
}
double x, y;
};
void CalPointFromLineWithDistance(const Vector2d & O, const Vector2d & E, double d, Vector2d& P)
{
Vector2d D = E - O;
double t = d / D.Mod();
P = O + D.Scalar(t);
}
int main()
{
Vector2d O(1.0, 2.4);
Vector2d E(10.2, 11.5);
double d = 5;
Vector2d P;
CalPointFromLineWithDistance(O, E, d, P);
cout << "計算的點為:" << P.x<<'\t' << P.y << '\n';
cout << "驗算距離是否為"<<d<<":" <<(P-O).Mod()<< '\n';
}
運行結果如下所示:
