我有许多平行线段,例如L1(P1,P2)和L2(P3,P4)。 点有每个x和y坐标。 这些平行线段具有0-180度之间的变化角度。
如何在c ++中有效地找到这些线段之间的垂直空间?
答案 0 :(得分:4)
两条平行线之间的距离将是第一条(无限)线与第二条线上的任何点(例如P3)之间的距离。由于您正在使用坐标,因此使用公式的向量表示比尝试将线表示为方程式更方便。使用该表示,在2d中,此距离由|(P3 - P1) dot ( norm ( P2 - P1 ))|
给出,其中norm
是与P2 - P1
垂直的归一化:
另请注意,在2d中,(x, y)
很容易给出与矢量(-y, x)
的垂线。因此:
class GeometryUtilities
{
public:
GeometryUtilities();
~GeometryUtilities();
static double LinePointDistance2D(double lineP1X, double lineP1Y, double lineP2X, double lineP2Y, double pointX, double pointY);
static void Perpendicular2D(double x, double y, double &outX, double &outY);
static double Length2D(double x, double y);
};
double GeometryUtilities::LinePointDistance2D(double lineP1X, double lineP1Y, double lineP2X, double lineP2Y, double pointX, double pointY)
{
double vecx = lineP2X - lineP1X;
double vecy = lineP2Y - lineP1Y;
double lineLen = Length2D(vecx, vecy);
if (lineLen == 0.0) // Replace with appropriate epsilon
{
return Length2D(pointX - lineP1X, pointY - lineP1Y);
}
double normx, normy;
Perpendicular2D(vecx/lineLen, vecy / lineLen, normx, normy);
double dot = ((pointX - lineP1X) * normx + (pointY - lineP1Y) * normy); // Compute dot product (P3 - P1) dot( norm ( P2 - P1 ))
return abs(dot);
}
void GeometryUtilities::Perpendicular2D(double x, double y, double &outX, double &outY)
{
outX = -y;
outY = x;
}
double GeometryUtilities::Length2D(double x, double y)
{
return sqrt(x*x + y*y);
}
在制作中你可能想要引入一些Point
类来大大美化这个API,但是因为它没有显示我纯粹使用双精度编写代码。
答案 1 :(得分:1)
快速谷歌搜索会产生这篇维基百科文章。 http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line
要计算您需要的距离,将一行公式表示为ax + by + c = 0
。然后,您可以使用维基百科文章中给出的公式计算另一条线的点来计算距离。
要从该行的两个点获取ax + by + c = 0
形式的线方程,请使用此网页https://bobobobo.wordpress.com/2008/01/07/solving-linear-equations-ax-by-c-0/中描述的方法
然后,您获取该行的值a,b和c。
一旦你有了公式,就可以直接将它转换为c ++。
我不鼓励使用mx + b = y
形式的线方程,因为你可能会发现自己的情况是m是无穷大的。然后计算距离将非常困难。使用等式ax + by + c = 0
时,您不会遇到此问题。