问题背景:已知一条线段,有一个线段外的点,如何判断其位于多段线前进方向的左侧或右侧。
解决方法:使用向量叉乘方法,分别计算AB向量和AC向量(C点为线外需判断的点),然后将AB向量乘以AC向量,若叉乘结果大于0,则在前进方向的左侧,否则,在前进方向的右侧。
1、代码如下:
static void Direction(AcDbPolyline* pl, int dir[])
{
int index = pl->numVerts(); int k = 0;
//acutPrintf(_T("index:%d\n"), index);
for (int i = 0; i < index - 2; i++)
{
AcGePoint2d p0;
pl->getPointAt(i, p0);
AcGePoint2d p1;
pl->getPointAt(i + 1, p1);
AcGePoint2d p2;
pl->getPointAt(i + 2, p2);
double v1_x = p1.x - p0.x;
double v1_y = p1.y - p0.y;
double v2_x = p2.x - p0.x;
double v2_y = p2.y - p0.y;
double cross = v1_x * v2_y - v1_y * v2_x;
const double eps = 1e-8;
if (cross > eps)
{
dir[k] = 1; //左侧
}
else if (cross < -eps)
{
dir[k] = 2; //右侧
}
//acutPrintf(_T("方向%d:%d\n"), k, dir[k]);
k++;
}
}
叉乘:x1*y2-x2*y1.
1794

被折叠的 条评论
为什么被折叠?



