获取矩形中心点与矩形外某点连线和矩形交点的算法
图形化广泛应用于各种系统中,包括ESB的适配,业务流程的建模,工作流程的定制,数据交换系统的配置等等,这其中不可避免的需要用到各种图形符号来直观、清晰的表达抽象的内容。一般来说,我们会通过标准的图形来表述特定的含义,达到交流的目的,而图形间信息导向一般都是通过线来完成的,一个好的画线算法,不仅能够让业务或者配置图更加美观,也更能清晰的向受众表述业务或者配置内容。
本文实现了一个获取矩形中心点与矩形外某点连线与矩形交点的算法。实现语言为ActionScript。
1 /**
2 * 获得一个矩形中心点到矩形外某点之间的连线与矩形的交点
3 * 算法思路:
4 * 以矩形外的某点为坐标原点,将图形分为四个象限,每个象限分两种情况,坐标轴上单独处理
5 * 1.坐标轴的情况:
6 * 1.负x轴的情况
7 * 2.正x轴的情况
8 * 3.正y轴的情况
9 * 4.负y轴的情况
10 * 2.象限情况:
11 * 2.1.第一象限:连线与矩形左边相交的情况;与矩形下边相交的情况
12 * 2.2.第二象限:连线与矩形右边相交的情况;与矩形下边相交的情况
13 * 2.3.第三象限:连线与矩形右边相交的情况;与矩形上边相交的情况
14 * 2.4.第四象限:连线与矩形左边相交的情况;与矩形上边相交的情况
15 *
16 * */
17 private function getIntersectPoint(fromNode:Rectangle,endPoint:Point):Point
18 {
19 //开始矩形的x坐标
20 var x1:Number=fromNode.x;
21 //开始矩形的y坐标
22 var y1:Number=fromNode.y;
23 //结束点的x坐标
24 var x2:Number=endPoint.x;
25 //结束点的y坐标
26 var y2:Number=endPoint.y;
27
28 //开始矩形的中心点x坐标
29 var fromCenterX:Number=x1+fromNode.width/2;
30 //开始矩形的中心点的y坐标
31 var fromCenterY:Number=y1+fromNode.height/2;
32 //矩形和点之间的x坐标相对距离
33 var dx:Number=Math.abs(x1-x2);
34 //矩形和点之间的y坐标相对距离
35 var dy:Number=Math.abs(y1-y2);
36 //相对距离的正切值
37 var tanDYX:Number=dy/dx;
38 //开始矩形的正切值
39 var fromDYX:Number=fromNode.height/fromNode.width;
40
41 var returnPoint:Point=null;
42 //负x轴
43 if(y1==y2&&x1<x2)
44 {
45 returnPoint= new Point(x1+fromNode.width,fromCenterY);
46 }
47 //正x轴
48 else if(y1==y2&&x1>x2)
49 {
50 returnPoint= new Point(x1,fromCenterY);
51 }
52 //正y轴
53 else if(x1==x2&&y1<y2)
54 {
55 returnPoint= new Point(fromCenterX,y1+fromNode.height);
56 }
57 //负y轴
58 else if(x1==x2&&y1>y2)
59 {
60 returnPoint= new Point(fromCenterX,y1);
61 }
62 //第一象限
63 if(x1>x2&&y1<y2)
64 {
65 if(fromDYX>=tanDYX)
66 {
67 returnPoint= new Point(x1,fromCenterY+tanDYX*fromNode.width/2);
68 }
69 else
70 {
71 returnPoint= new Point(fromCenterX-dx/dy*fromNode.height/2,y1+fromNode.height);
72 }
73 }
74 //第二象限
75 else if(x1<x2&&y1<y2)
76 {
77 //
78 if(fromDYX>=tanDYX)
79 {
80 returnPoint= new Point(x1+fromNode.width,fromCenterY+tanDYX*fromNode.width/2);
81 }
82 else
83 {
84 returnPoint= new Point(fromCenterX+dx/dy*fromNode.height/2,y1+fromNode.height);
85 }
86
87 }
88 //第三象限
89 else if(x1<x2&&y1>y2)
90 {
91 if(fromDYX>=tanDYX)
92 {
93 returnPoint= new Point(x1+fromNode.width,fromCenterY-tanDYX*fromNode.width/2);
94 }
95 else
96 {
97 returnPoint= new Point(fromCenterX+fromNode.height/2*dx/dy,y1);
98 }
99 }
100 //第四象限
101 else if(x1>x2&&y1>y2)
102 {
103 if(fromDYX>=tanDYX)
104 {
105 returnPoint= new Point(x1,fromCenterY-fromNode.width/2*tanDYX);
106 }
107 else
108 {
109 returnPoint= new Point(fromCenterX-fromNode.height/2*dx/dy,y1);
110 }
111 }
112 return returnPoint;
113 }
114
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名孙镜涛(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言。