zoukankan      html  css  js  c++  java
  • 获取矩形中心点与矩形外某点连线和矩形交点的算法

      图形化广泛应用于各种系统中,包括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
  • 相关阅读:
    Neo4j-3.0.3 (Debian 8)
    python学习之argparse模块
    变异系数
    孪生素数
    统计学中的自由度
    兰伯特余弦定理(Lambert)
    椒盐噪声
    沥青路面磨损后泛白的原因
    朗伯体
    绕坐标轴旋转的矩阵
  • 原文地址:https://www.cnblogs.com/jingtao/p/1898189.html
Copyright © 2011-2022 走看看