两个对象相交(重叠)求交点

最近做的一个项目,经常画线,拖动对象。如:门(对象,有长和宽,引用一个门的图片,可旋转,指门从关闭到打开90度时的一段空间区域)必须在墙(对象,有粗细的直线)上,门可以在墙上移动等,经常要进行判断,和交点的计算。一些思路:
1.鼠标在门上按下时,记下门的坐标,鼠标在画布上的点击坐标,以及点击坐标与门的坐标的x,y差值。
2.鼠标移动时,门跟随鼠标移动,门的坐标为鼠标坐标与x,y差值之和。
3.鼠标按下时,首先进行如下判断:
1)门下面是否有墙,否则门回原位。(hitTestObject)
2)门的下面是否有几堵墙?若有多堵墙,选取一堵,选取规则自己定,最好优先选取门 移动前的那堵。
3)如果移动门没有换墙:
1))计算门与墙的交点。门应该是一边在墙上,而不是从中间就镶嵌在墙中。计算方法可以参考[url=http://pczhuce-126-com.iteye.com/blog/1701787]计算两条线的交点,以及判断一个点是否在直线上[/url],将两个对象看做两个线段)
2))改变门的坐标,使其在交点坐标上,这样就保证了门的一边是在墙上。
4)如果移动门到另外一堵墙上:
1))计算墙的角度。
2))改变门的角度与墙的角度一致。(因为角度的变化,门的对象的长宽都会发生变化)
3))同3)的1))
4))这步就和3)的2))有区别,因为角度的变化,原来对象发生变化,若按照3)的方法,在图像上,门可能不在墙上,出现偏差。根据门的角度重新计算门的图片与门的对象之间的关系。关系如下:(node代表门的对象,position代表门的图片在墙上显示的起始点即墙与门的交点,返回值Point,则是门对象的实际位置,如果是双开门,doorWidth = 2*doorHight):
private function setDoorPosition(node:Door, position:Point):Point{
var point:Point = new Point;
var angle:Number = node.angle;
var radius:Number;
if(angle<0){
radius = angle*Math.PI/180;
angle = angle + 360;
point.x = position.x;
point.y = position.y + doorWidth*Math.sin(radius);
node.location = point;
}else if(angle<90){
radius = angle*Math.PI/180;
point.x = position.x - doorHeight*Math.sin(radius);
point.y = position.y;
node.location = point;
}else if(angle<180){
radius = angle*Math.PI/180;
point.x = position.x-doorHeight*Math.sin(radius);
point.y = position.y+doorHeight*Math.cos(radius)-doorWidth*Math.sin(radius);
node.location = point;
}else if(angle<270){
radius = 0-(angle-180)*Math.PI/180;
point.x = position.x;
point.y = position.y + doorHeight*Math.cos(radius);
node.location = point;
}else if(angle<360){
radius = 0-(angle-180)*Math.PI/180;
point.x = position.x;
point.y = position.y + doorWidth*Math.sin(radius);
node.location = point; }
return point;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值