objectarx2023开发记录---跨立实验

跨立实验:判断两条线段是否互相跨越,即AB的端点分别处于CD的两侧,CD的端点也处于AB的两侧,其交点仅位于线上,不位于ABCD四个端点之上。常用于判断线段相交或自相交。

将AB与AC,AB与AD,CA与CD,CB与CD的叉乘的结果,按AB与CD分类再相乘,比较其结果是否均小于0,同时满足小于0时,存在跨立相交。否则,不存在跨立相交。

函数将返回其交点,若不存在跨立相交,交点坐标将为0值。

1、代码

	static ptIn KuaLi(AcGePoint2d pa, AcGePoint2d pb, AcGePoint2d pc, AcGePoint2d pd)
	{
		ptIn pi;

		AcGeVector2d vab = pb - pa;
		AcGeVector2d vcd = pd - pc;

		AcGeVector2d v1 = pc - pa;
		AcGeVector2d v2 = pd - pa;
		AcGeVector2d v3 = pa - pc;
		AcGeVector2d v4 = pb - pc;

		double cross1 = Cross(v1, vab);
		double cross2 = Cross(v2, vab);
		double cross3 = Cross(v3, vcd);
		double cross4 = Cross(v4, vcd);

		//说明两线段存在线中相交,交点不在端点上,在线段两端点间
		if (((cross1 * cross2) < 0) && ((cross3 * cross4) < 0))
		{
			pi.val = 1;//跨立相交
		}
		else
		{
			pi.val = 0;//不存在跨立相交
		}

		//计算相交点,存在跨立相交时
		if (pi.val == 1)
		{
			AcGeLine2d l1(pa, pb);
			AcGeLine2d l2(pc, pd);

			AcGePoint2d ii;

			l1.intersectWith(l2, ii);

			pi.pt = ii;
		}

		//不存在跨立相交,但共线重叠时,会存在交点,为初始化随意赋值即可,用不到该值
		if (pi.val == 0)
		{
			AcGePoint2d ii(0, 0);
			pi.pt = ii;
		}

		return pi;
	}

这里介绍求取线段交点的函数:intersectWith函数,用法如上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值