跨立实验:判断两条线段是否互相跨越,即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函数,用法如上。
144

被折叠的 条评论
为什么被折叠?



