判断线段和矩形是否相交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package
{
     import  flash.display.Sprite;
     import  flash.events.MouseEvent;
     import  flash.text.TextField;
  
     [SWF(width= 375 ,height= 300 ,backgroundColor= "0xeeeeee" )]
     public  class  RectLine  extends  Sprite
     {
         private  var  txt:TextField;
         public  function  RectLine()
         {
  
             this .txt =  new  TextField();
             addChild(txt);
  
             stage.addEventListener(MouseEvent.CLICK,ckHandler);
             ckHandler( null );
         }
  
         private  function  ckHandler(e:MouseEvent): void
         {
             graphics.clear();
             graphics.beginFill( 0x00ffff );
             graphics.drawRect( 100 , 100 , 200 , 50 );
             graphics.endFill();
  
             var  a: int  = Math.random()* 375 ;
             var  b: int  = Math.random()* 300 ;
             var  c: int  = Math.random()* 375 ;
             var  d: int  = Math.random()* 300 ;
  
             graphics.lineStyle( 2 , 0xff0000 );
             graphics.moveTo(a,b);
             graphics.lineTo(c,d);
             trace (isLineIntersectRectangle(a,b,c,d, 100 , 100 , 300 , 150 ));
             var  isF: Boolean  = isLineIntersectRectangle(a,b,c,d, 100 , 100 , 300 , 150 );
             txt.text =  "是否相交:" +isF;
         }      
  
         /** <p>判断线段是否在矩形内 </p>
          * 先看线段所在直线是否与矩形相交, 
          * 如果不相交则返回false, 
          * 如果相交, 
          * 则看线段的两个点是否在矩形的同一边(即两点的x(y)坐标都比矩形的小x(y)坐标小,或者大), 
          * 若在同一边则返回false, 
          * 否则就是相交的情况。
          * @param linePointX1 线段起始点x坐标 
          * @param linePointY1 线段起始点y坐标 
          * @param linePointX2 线段结束点x坐标 
          * @param linePointY2 线段结束点y坐标 
          * @param rectangleLeftTopX 矩形左上点x坐标 
          * @param rectangleLeftTopY 矩形左上点y坐标 
          * @param rectangleRightBottomX 矩形右下点x坐标 
          * @param rectangleRightBottomY 矩形右下点y坐标 
          * @return 是否相交
          */
         private  function  isLineIntersectRectangle(linePointX1: Number ,
                                                   linePointY1: Number ,
                                                   linePointX2: Number ,
                                                   linePointY2: Number ,
                                                   rectangleLeftTopX: Number ,
                                                   rectangleLeftTopY: Number ,
                                                   rectangleRightBottomX: Number ,
                                                   rectangleRightBottomY: Number ): Boolean
         {
             var   lineHeight: Number  = linePointY1 - linePointY2;
             var  lineWidth: Number  = linePointX2 - linePointX1;   // 计算叉乘 
             var  c: Number  = linePointX1 * linePointY2 - linePointX2 * linePointY1;
             if  ((lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c >=  0  && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c <=  0 )   
                 || (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c <=  0  && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c >=  0 )   
                 || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c >=  0  && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c <=  0 )   
                 || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c <=  0  && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c >=  0 ))
             {
  
                 if  (rectangleLeftTopX > rectangleRightBottomX) {
                     var  temp: Number  = rectangleLeftTopX;
                     rectangleLeftTopX = rectangleRightBottomX;
                     rectangleRightBottomX = temp;  
                 }  
                 if  (rectangleLeftTopY < rectangleRightBottomY) {
                     var  temp1: Number  = rectangleLeftTopY;   
                     rectangleLeftTopY = rectangleRightBottomY;   
                     rectangleRightBottomY = temp1;   }  
                 if  ((linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX)     
                     || (linePointX1 > rectangleRightBottomX && linePointX2 > rectangleRightBottomX)     
                     || (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY)     
                     || (linePointY1 < rectangleRightBottomY && linePointY2 < rectangleRightBottomY)) {   
                     return  false ;  
                 else  {   
                     return  true ;  
                
             else 
                 return  false
             }
         }
     }
}

http://blog.sqstudio.com/as3/algorithm/842.html#codesyntax_1

本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/4024661.html如需转载请自行联系原作者


jiahuafu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值