objectarx 多段线自交检查
SpringProfile轻松切换多环境配置文件
只支撑直线段的多段线搜检,由于重要用了初中的学问,一元一次方程求交点,细致的说就是,把多段线上相邻的两个点组成一条直线段,然后每条直线段与盈余的直线段求交点,一条直线段就代表一个一元一次方程,晓得两点就晓得这个方程是什么样的。
求出交点以后得推断这个点是不是是多段线上自身的点,推断要领是推断求出来的交点与组成交点的两条直线段的4个点做比较,假如点的偏差在1e-4以内,就以为这个交点是在多段线的端点上,不作为请求的交点。
除了这类大概以外,所求交点有多是在直线段的延伸线上,经由过程视察能够晓得,假如交点在恣意一条直线段两个端点之间,则能够晓得这个交点到这条直线段两个端点的间隔都要小于这个直线段两个端点的间隔,假如交点到两个端点的间隔大于了两个端点的间隔,则申明这个交点是在线段的延伸线上,也不作为请求的交点。
还需要注意的处所是,要斟酌直线段垂直于x轴的状况,由于请求直线方程时的斜率时,分母不能为0,需要把直线垂直于x轴的状况零丁斟酌。
除了这类思绪外,还能够直接运用intersectwith函数来做,订交范例是都不延伸,(不知是直接炸开这个多段线好,照样支解这个多段线好)。总之起首得获得两个端点之间的线段。如许作,不仅支撑直线段的多段线,还支撑带凸度的,带圆弧的多段线了。
下面放出运用到的函数:
static bool IsEqual(const AcGePoint2d & firstPoint, const AcGePoint2d & secondPoint, double tol) { return (fabs(firstPoint.x - secondPoint.x) < tol&& fabs(firstPoint.y - secondPoint.y) < tol); }
struct StLine { AcGePoint2d ptPre; AcGePoint2d ptNext; };
static bool JiaoDian(StLine &l1, StLine &l2, AcGePoint3d& ptCenter) { double x0, y0, x1, y1, x2, y2, x3, y3; x0 = l1.ptPre.x; y0 = l1.ptPre.y; x1 = l1.ptNext.x; y1 = l1.ptNext.y; x2= l2.ptPre.x; y2 = l2.ptPre.y; x3 = l2.ptNext.x; y3 = l2.ptNext.y; if (x0 - x1 == 0) { if (x2 - x3 == 0) { if (IsEqual(l1.ptPre, l2.ptPre, 1e-4) || IsEqual(l1.ptPre, l2.ptNext, 1e-4) || IsEqual(l1.ptNext, l2.ptPre, 1e-4) || IsEqual(l1.ptNext, l2.ptNext, 1e-4)) { acutPrintf(L"存在堆叠的部份n"); return false; } else { acutPrintf(L"存在平行的部份n"); return false; } } else { double k2 = (y3 - y2) / (x3 - x2); double b2 = (y2 - k2*x2); AcGePoint2d jd; jd.x = x0; jd.y = k2*x0 + b2; double distance = l1.ptPre.distanceTo(l1.ptNext); double dis1 = jd.distanceTo(l1.ptPre); double dis2 = jd.distanceTo(l1.ptNext); if (dis1 < distance&&dis2 < distance) { if (IsEqual(l1.ptPre, jd, 1e-4) || IsEqual(jd, l2.ptNext, 1e-4) || IsEqual(l1.ptNext, jd, 1e-4) || IsEqual(jd, l2.ptPre, 1e-4)) { return false; } ptCenter.x = jd.x; ptCenter.y = jd.y; ptCenter.z = 0; return true; } else { return false; } } } else if (x3 - x2 == 0) { if (x0 - x1 != 0) { double k2 = (y1 - y0) / (x1 - x0); double b2 = (y1 - k2*x1); AcGePoint2d jd; jd.x = x3; jd.y = k2*x3 + b2; double distance = l1.ptPre.distanceTo(l1.ptNext); double dis1 = jd.distanceTo(l1.ptPre); double dis2 = jd.distanceTo(l1.ptNext); if (dis1 < distance&&dis2 < distance) { if (IsEqual(l1.ptPre, jd, 1e-4) || IsEqual(jd, l2.ptNext, 1e-4) || IsEqual(l1.ptNext, jd, 1e-4) || IsEqual(jd, l2.ptPre, 1e-4)) { return false; } ptCenter.x = jd.x; ptCenter.y = jd.y; ptCenter.z = 0; return true; } //交点在延伸线上 else { return false; } } else { if (IsEqual(l1.ptPre, l2.ptPre, 1e-4) || IsEqual(l1.ptPre, l2.ptNext, 1e-4) || IsEqual(l1.ptNext, l2.ptPre, 1e-4) || IsEqual(l1.ptNext, l2.ptNext, 1e-4)) { acutPrintf(L"存在堆叠的部份n"); return false; } else { acutPrintf(L"存在平行的部份n"); return false; } } } else { double k1 = (y1 - y0) / (x1 - x0); double b1 = (y1 - k1*x1); double k2 = (y3 - y2) / (x3 - x2); double b2 = (y2 - k2*x2); AcGePoint2d jd; if (k1 == k2) { return false; } double x0 = (b2 - b1) / (k1 - k2); jd.x = x0; jd.y = k1*x0 + b1; double distance = l1.ptPre.distanceTo(l1.ptNext); double dis1 = jd.distanceTo(l1.ptPre); double dis2 = jd.distanceTo(l1.ptNext); if (dis1 < distance&&dis2 < distance) { if (IsEqual(l1.ptPre, jd, 1e-4) || IsEqual(jd, l2.ptNext, 1e-4) || IsEqual(l1.ptNext, jd, 1e-4) || IsEqual(jd, l2.ptPre, 1e-4)) { return false; } ptCenter.x = jd.x; ptCenter.y = jd.y; ptCenter.z = 0; return true; } else { return false; } } }
校招必看硬核干货:C++怎么学才能进大厂