领扣LintCode问题答案-21. 移动的圆

领扣LintCode问题答案-21. 移动的圆

目录

  • 21. 移动的圆
  • 鸣谢

21. 移动的圆

题目将给出两个圆A和B的圆心坐标(x,y)和半径r,现给你一个点P,使圆A圆心沿直线运动至点P。
请问圆A在运动过程中是否会与圆B相交?(运动过程包括起点和终点)
若会相交返回1,否则返回-1。

两个圆的半径均不超过10000。
横纵坐标值的绝对值均不超过10000。
输入数组的意义为两个圆的半径均不超过10000。
横纵坐标值的绝对值均不超过10000。
输入数组的意义为[Xa,Ya,Ra,Xb,Yb,Rb,Xp,Yp]。

样例 1:

输入:[0,0,2.5,3,2,0.5,0,2]
输出:1
样例解释:圆A的圆心(0,0),半径为2.5,圆B的圆心(3,2),半径为0.5,点P(0,2),如图:
领扣LintCode问题答案-21. 移动的圆_第1张图片

样例 2:

输入:[0,0,2,5,0,1,0,2]
输出:-1
样例解释:圆A的圆心(0,0),半径为2,圆B的圆心(5,0),半径为1,点P(0,2)

public class Solution {
     
	/**
	 * @param position: the position of circle A,B and point P.
	 * @return: if two circle intersect return 1, otherwise -1.
	 */
	public int IfIntersect(double[] position) {
     
		// 
		double xA = position[0];
		double yA = position[1];
		double rA = position[2];
		double xB = position[3];
		double yB = position[4];
		double rB = position[5];
		double xP = position[6];
		double yP = position[7];

		double disBA  = Math.sqrt(Math.pow((xB - xA), 2) + Math.pow((yB - yA), 2));
		double disBP  = Math.sqrt(Math.pow((xB - xP), 2) + Math.pow((yB - yP), 2));
		double minDis = Math.abs(rA - rB);
		double maxDis = rA + rB;

		if ((disBA >= minDis
				&& disBA <= maxDis)
				||
				(disBP >= minDis
						&& disBP <= maxDis)) {
     
			return 1;
		}

		double a = yP - yA;
		double b = xA - xP;
		double c = xP * yA - xA * yP;

		double distance = (a * xB + b * yB + c) / Math.sqrt(a * a + b * b);

		double intersectionX = (b * b * xB - a * b * yB - a * c) / (a * a + b * b);
		double intersectionY = (a * a * yB - a * b * xB - b * c) / (a * a + b * b);

		if (distance >= minDis
				&& distance <= maxDis) {
     
			if (inLine(new double[]{
     xA, yA}, new double[]{
     xP, yP}, new double[]{
     intersectionX, intersectionY}, rA)) {
     
				return 1;
			}
		}
		return -1;
	}

	//判断点是否在线上
	private boolean inLine(double[] pA, double[] pP, double[] pB, double rA) {
     
		double maxX, minX, maxY, minY;
		maxX = pA[0] > pP[0] ? pA[0] : pP[0];    //矩形的右边长
		minX = pA[0] > pP[0] ? pP[0] : pA[0];     //矩形的左边长
		maxY = pA[1] > pP[1] ? pA[1] : pP[1];    //矩形的上边长
		minY = pA[1] > pP[1] ? pP[1] : pA[1];     //矩形的下边长

		if (((pB[0] - pA[0]) * (pP[1] - pA[1]) == (pP[0] - pA[0]) * (pB[1] - pA[1]))
				&& (pB[0] >= minX && pB[0] <= maxX)
				&& (pB[1] >= minY && pB[1] <= maxY)) {
     
			return true;
		} else {
     
			return false;
		}
	}
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)