只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点就知道这个方程是什么样的。
求出交点之后得判断这个点是否是多段线上本身的点,判断方法是判断求出来的交点与构成交点的两条直线段的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 == ) {
if (x2 - x3 == )
{
if (IsEqual(l1.ptPre, l2.ptPre, 1e-) ||
IsEqual(l1.ptPre, l2.ptNext, 1e-) ||
IsEqual(l1.ptNext, l2.ptPre, 1e-) ||
IsEqual(l1.ptNext, l2.ptNext, 1e-)) { 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-) ||
IsEqual(jd, l2.ptNext, 1e-) ||
IsEqual(l1.ptNext, jd, 1e-) ||
IsEqual(jd, l2.ptPre, 1e-)) { return false;
} ptCenter.x = jd.x;
ptCenter.y = jd.y;
ptCenter.z = ; return true; }
else {
return false;
}
}
}
else if (x3 - x2 == ) {
if (x0 - x1 != )
{
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-) ||
IsEqual(jd, l2.ptNext, 1e-) ||
IsEqual(l1.ptNext, jd, 1e-) ||
IsEqual(jd, l2.ptPre, 1e-)) { return false;
} ptCenter.x = jd.x;
ptCenter.y = jd.y;
ptCenter.z = ; return true; }
//交点在延长线上
else {
return false;
} }
else {
if (IsEqual(l1.ptPre, l2.ptPre, 1e-) ||
IsEqual(l1.ptPre, l2.ptNext, 1e-) ||
IsEqual(l1.ptNext, l2.ptPre, 1e-) ||
IsEqual(l1.ptNext, l2.ptNext, 1e-)) { 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-) ||
IsEqual(jd, l2.ptNext, 1e-) ||
IsEqual(l1.ptNext, jd, 1e-) ||
IsEqual(jd, l2.ptPre, 1e-)) { return false;
}
ptCenter.x = jd.x;
ptCenter.y = jd.y;
ptCenter.z = ; return true;
}
else {
return false;
}
}
}

objectarx 多段线自交检查的更多相关文章

  1. Objectarx 相交矩形求并集 面域转多段线

    测试结果: 主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次jig操作,就能得到白色的两个相交的polyline,之后需要变成红色的封闭多段线.做法就是:求出两个白色矩形的面域,然后通过boo ...

  2. objectarx 按比例分割封闭多段线

    测试结果:这个是按0.1,0.1,0.1,0.3,0.4的比例划分的. 插件描述:这个插件主要是选择一个多段线poly,设置poly的close属性为true,在poly任意一侧画一条长线line(l ...

  3. Java 直线、多段线画板 PaintJFrame (整理)

    package demo; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; impor ...

  4. Cesium实现文字、点、多段线、多边形的实时绘制

    背景知识 点.线.面以及文字的实时绘制是GIS很重要的一个功能,是用户对感兴趣区域标注的业务需要.同时Cesium提供了点.线(多段线).面及文字(label)绘制的接口,绘制方式总共有两种,一种是通 ...

  5. 4、c++ Arx二次开发创建多段线

    一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...

  6. CAD交互绘制多段线(网页版)

    多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下 ...

  7. CAD交互绘制多段线(com接口)

    多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下 ...

  8. CAD参数绘制多段线(com接口)

    多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定 ...

  9. CAD参数绘制多段线(网页版)

    多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定 ...

随机推荐

  1. zm吃包子

    [题目背景]: zm 喜欢上了吃包子. [题面描述]: zm 每天都要去买包子,但是为了减肥,zm 设置了一系列规则来控制他每天买包子的数量. 他随机了 n 个特殊字符串,然后用 n 个字符串来衡量接 ...

  2. 美食家app开发日记

    民以食为天. 作为一个20年几乎没做过饭的吃货,从这个假期开始,想利用些时间,自己动手尝试,做些好吃的出来,一方面给父母减轻点负担,获得点成就感,一方面体验生活,学学厨艺,感受生活的乐趣和美好,其三, ...

  3. 「 从0到1学习微服务SpringCloud 」01 一起来学呀!

    有想学微服务的小伙伴没?一起来从0开始学习微服务SpringCloud,我会把学习成果总结下来,供大家参考学习,有兴趣可以一起来学!如有错误,望指正! Spring .SpringBoot.Sprin ...

  4. Jenkins配置安装

    一.安装 [root@localhost ~]# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/j ...

  5. 基于 Lind.DDD 的 权限管理系统

    先起个头,在跟吧 表结构  12个表   ps: sxiaomais.blog.163.com/blog/static/31741203200811102630406/ 需要数据库 文件的 附件 权限 ...

  6. Ubuntu下makefile的简单使用

    在Windows下,只需要简单的点击以下make,rebuild即可.而在Linux下,这样的IDE环境并没有提供,难道必须每一步都执行一遍吗?比较ok的做法自然是能够利用批处理脚本来进行操作了,这样 ...

  7. [CERC2016]凸轮廓线

    题意 https://www.luogu.org/problem/P3680 思考 拆点即可. 注意精度. 代码 // luogu-judger-enable-o2 #include<bits/ ...

  8. 手写 Promise

    在上一章节中我们了解了 Promise 的一些易错点,在这一章节中,我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写 Promise 也是一道大厂常考题,在 ...

  9. 超实用的Eclipse快捷键大全(解密为什么他们的代码写的又快又好~)

    1.Ctrl+s:快速保存代码 一定要记得随时随地用Ctrl+s来保存我们的代码哦!!!不然等到电脑关机或者是使用的Eclipse突然闪退就欲哭无泪了.此时脑海里就突然出现了哔哔哔的画面~ 2.Alt ...

  10. 二、UDP

    1 端口号 在计算机网络和电磁信号理论中,对共享同一通信信道的多个信号进行区分是个常见的问题.多路复用(multiplexing)就是允许多个会话共享同一介质或机制的一种解决方案. 使用不同的频率来区 ...