geo.x geo.y 是矩形左上角的点, 矩形内一点和矩形外一点与矩形相交,求该相交点的坐标
function GetLPoint(geo,x1,y1,x2,y2) {
var xy = [];
var gx = geo.x;
var gy = geo.y;
var height = geo.height;
var width = geo.width;
var a = (y1 - y2)/(x1 - x2);
var b = (y1 + y2 - a*(x1 + x2))/2;
var tempBigX, tempSmallX, tempBigY, tempSmallY;
if (x1 > x2) {
tempBigX = x1;
tempSmallX = x2;
} else {
tempBigX = x2;
tempSmallX = x1;
}
if (y1 > y2){
tempBigY = y1;
tempSmallY = y2;
} else {
tempBigY = y2;
tempSmallY = y1;
}
if (tempBigY - tempSmallY == 0 || tempBigX - tempSmallX == 0){
//左右垂直相交
if (tempBigY - tempSmallY == 0){
//判断是否与左边相交
var tempY1 = a*(gx) + b;
if (tempY1 < tempBigY && tempY1 > tempSmallY && gx < tempBigX && gx >tempSmallX){
return xy = [gx, tempY1];
}
//判断是否与右边相交
var tempY2 = a*(gx + width) + b;
if (tempY2 < tempBigY && tempY2 > tempSmallY && gx + width < tempBigX && gx + width >tempSmallX){
return xy = [gx + width, tempY2];
}
} else if (tempBigX - tempSmallX == 0){
//判断是否与上边相交
var tempX1 = (gy - b)/a;
if (tempX1 < tempBigX && tempX1 > tempSmallX && gy < tempBigY && gy > tempSmallY){
return xy = [tempX1, gy];
}
//判断是否与下边相交
var tempX2 = (gy + height - b)/a;
if (tempX2 < tempBigX && tempX2 > tempSmallX && gy + height < tempBigY && gy + height > tempSmallY){
return xy = [tempX2, gy + height];
}
}
} else {
//tanA 矩形内的点与矩形外的点所构成的直角矩形的tan值
//tanB 矩形内的点与矩形中的一点所构成的直角矩形的tan值
var tanA = (geo.y - tempSmallY)/(geo.x + width- tempSmallX);
var tanB = (tempBigY - tempSmallY)/(tempBigX - tempSmallX);
//判断是否与左边相交
var tempY1 = a*(gx) + b;
if (tempY1 < tempBigY && tempY1 > tempSmallY && gx < tempBigX && gx >tempSmallX && tanA >= tanB){
return xy = [gx, tempY1];
}
//判断是否与右边相交
var tempY2 = a*(gx + width) + b;
if (tempY2 < tempBigY && tempY2 > tempSmallY && gx + width < tempBigX && gx + width >tempSmallX && tanA >= tanB){
return xy = [gx + width, tempY2];
}
//判断是否与上边相交
var tempX1 = (gy - b)/a;
if (tempX1 < tempBigX && tempX1 > tempSmallX && gy < tempBigY && gy > tempSmallY && tanB > tanA){
return xy = [tempX1, gy];
}
//判断是否与下边相交
var tempX2 = (gy + height - b)/a;
if (tempX2 < tempBigX && tempX2 > tempSmallX && gy + height < tempBigY && gy + height > tempSmallY && tanB > tanA){
return xy = [tempX2, gy + height];
}
}
return null;
}