欢迎访问欧博网址!

首页科技正文

(浙江宁波):objectarx 多[段线自交检查

admin2020-08-2781

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);
    }

 

通过 Serverless 加速 Blazor WebAssembly

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;
            }
        }
  }

 

,

Sunbet

Sunbet www.114co.cn立足亚洲,展望国际,在即将到来的2019《年》,努力在技术、安全、服务上尽善尽美,致力提高业务品质,《期望》与业界精英共同开拓未来。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.chinadsn9.com/post/347.html

网友评论

2条评论
  • 2020-08-14 00:09:41

    欧博allbet客户端欢迎进入欧博allbet客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。满意,耐心看

    • 2020-08-24 09:23:03

      @UG环球官方注册 欧博app下载欢迎进入欧博app下载网站:www.aLLbetgame.us,欧博app下载网站是欧博官方网站。欧博app下载网站开放欧博注册、欧博代理、欧博电脑客户端、欧博app下载等业务。夜里独自看,巴适

最新评论

  • 环球UG 10/19 说:

    Allbet开户欢迎进入Allbet开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。会不断进步的

  • AllbetGmaing下载 10/19 说:

    欧博APP欢迎进入欧博APP(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。踩一下,溜了

  • 联博以太坊高度 10/19 说:

    联博API接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。感觉已经火了

  • 皇冠APP下载 10/18 说:

    欧博手机版欢迎进入欧博手机版(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。哈哈,交流起来

  • UG环球网址 10/18 说:

    Allbet客户端下载欢迎进入Allbet客户端下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。可以,在看

  • Allbet登录网址 10/18 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。找了好久,心心念念的

  • 环球UG开户 10/17 说:

    欧博allbet注册欢迎进入欧博allbet注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。想穿越进去

  • Allbet代理 10/16 说:

    平心在线欢迎进入平心在线官网(原诚信在线、阳光在线)。平心在线官网开www.px111.net放平心在线会员登录网址、平心在线代理后台网址、平心在线APP下载、平心在线电脑客户端下载、平心在线企业邮局等业务。很值,优点无数