只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点就知道这个方程是什么样的。
求出交点之后得判断这个点是否是多段线上本身的点,判断方法是判断求出来的交点与构成交点的两条直线段的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. wannafly 27 D 巧妙求取约数

    链接:https://www.nowcoder.com/acm/contest/215/D来源:牛客网 题目描述 “我不知道你在说什么,因为我只是个pupil.”--绿魔法师 一个空的可重集合S. n ...

  2. 美团codem 数列互质 - 莫队

    题目描述 给出一个长度为 nnn 的数列 a1,a2,a3,...,an{ a_1 , a_2 , a_3 , ... , a_n }a​1​​,a​2​​,a​3​​,...,a​n​​,以及 mm ...

  3. 字符串 hash - 不停地删掉字母

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text p . Her j ...

  4. bfs + 路径输出

    You are given two pots, having the volume of A and B liters respectively. The following operations c ...

  5. dfs - 走过的标记取消

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  6. 类选择器练习:Google 案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  7. Android Linker简介

    简单介绍Android linker的基础知识,基于Android 10分支. linker的作用 考虑简单的HelloWorld程序. $ tree . . |-- jni | |-- Androi ...

  8. python 进程管道

    数据不安全,不常用 import time from multiprocessing import Pipe, Process def producer(prod, cons, name, food) ...

  9. git 远程托管

    1.创建别名 git remote add orgin(别名) url 2.推入云端 git push 别名 master(分支) git push 别名 dev 3.克隆(默认只有master分支) ...

  10. 第二阶段冲刺个人任务——five

    今日任务: 合并程序(统计团队博客). 昨日成果: 优化统计团队博客结果界面的显示.