Allegro使用Skill语言实现根据两点p1,p2确定的线段判断是否与bbox构成的矩形相交的函数

/*****************判断两点p1,p2确定的线段是否与bbox构成的矩形相交的算法*******************/
defun(isLineIntersectRectangle (p1 p2 bbox)
	x1=car(p1)
	y1=nth(1 p1)
	x2=car(p2)
	y2=nth(1 p2)
	lineHeight=y1-y2
	lineWidth=x2-x1
	xb=car(car(bbox))
	yb=nth(1 car(bbox))
	xe=car(nth(1 bbox))
	ye=nth(1 nth(1 bbox))
	c=x1*y2-x2*y1
	let((res)
		if(lineHeight*xb+lineWidth*yb+c>=0 && lineHeight*xe+lineWidth*ye+c<=0
		||(lineHeight*xb+lineWidth*yb+c<=0 && lineHeight*xe+lineWidth*ye+c>=0)
		||(lineHeight*xb+lineWidth*ye+c>=0 && lineHeight*xe+lineWidth*yb+c<=0)
		||(lineHeight*xb+lineWidth*ye+c<=0 && lineHeight*xe+lineWidth*yb+c>=0) then
		if(xb>xe then
			temp=xb
			xb=xe
			xe=temp
		)
		if(yb<ye then
			temp1=yb
			yb=ye
			ye=temp1
		)
		
		if(x1<xb && x2<xb || (x1>xe && x2>xe) || (y1>yb && y2>yb) || (y1<ye && y2<ye) then
			res=nil
			else
			res=t
		)
		else
			res=nil
		)
		res=res
	)
)
x=isLineIntersectRectangle(-5:0 105:100 list(0:0 100:100));x=t,相交
x=isLineIntersectRectangle(-5:0 -5:100 list(0:0 100:100));x=nil,不相交
x=isLineIntersectRectangle(0:0 100:100 list(0:0 100:100));x=t,相交

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力不期待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值