判断线段和矩形是否相交

简介:
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

相关文章
|
3月前
|
C++
已知线段上某点与起点的距离,求该点的坐标
已知线段上某点与起点的距离,求该点的坐标
38 1
|
3月前
|
算法 C++
平面中判断线段与矩形是否相交
平面中判断线段与矩形是否相交
46 0
|
3月前
|
算法 C++ Windows
空间射线与三角形相交算法的两种实现
空间射线与三角形相交算法的两种实现
40 0
判断线段是否相交
判断线段是否相交
88 0
判断点是否在线段上
判断点是否在线段上
145 0
给定三个顶点的坐标使用程序计算三角形
给定三个顶点的坐标使用程序计算三角形
59 0
|
算法 Java
Java计算四边形中心点和两条线段交点算法
Java计算四边形中心点和两条线段交点算法
166 0
Java计算四边形中心点和两条线段交点算法
给你n个线段,代表线段的左右端点,问最少删几条线段,使得剩下当中存在一个线段与所有剩下的所有线段都有交集
考虑枚举每一条线段,求以此线段与所有线段都有交集,需要删除的线段数。 那么对于此线段[L,R],右端点小于L的,与它无交集,需要全删掉。同理左端点大于R的线段,也需要都删掉。 那么剩下的问题,就是需要删几个了。
110 0