java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标。实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义。
1.两个圆相交的数学求法
在中学数学中我们知道,一个圆可以作如下描述,以x1,y1为圆心,r为半径的一个圆:
那么假设现在有两个圆C1与C2,其中C1与C2的描述式如下:
其中C1是以(x1,y1)为圆心,r1为半径的圆,C2是以(x2,y2)为圆心,r2为半径的圆。若想求两个圆的交点,那么这个交点一同时在C1与C2上,即同时满足C1与C2的方程,此时只需联立这两个方程即可。
我们用C1-C2可得:
整理得:
令
此时
将上式代入C1,整理可得关于x的一元二次方程:
(这里有个小错误)
此后,只要求出该方程的判别式,进行一元二次方程的求解即可。
2.程序清单
根据1中的算法写出程序如下:
package com.ken.blesniff.util;
import com.ken.blesniff.bean.Circle;
/**
*
* @author lixiasong
*
*/
public class CirIntersect {
/**
* 圆A (x-x1)^2 + (y-y1)^2 = r1^2
*/
private Circle c1=null;
/**
* 圆B (x-x2)^2 + (y-y2)^2 = r2^2
*/
private Circle c2=null;
private double x1;
private double y1;
private double x2;
private double y2;
private double r1;
private double r2;
public CirIntersect(Circle C1,Circle C2){
c1= C1;
c2= C2;
x1=c1.getX();
y1=c1.getY();
x2=c2.getX();
y2=c2.getY();
r1=c1.getR();
r2=c2.getR();
}
/**
* 求相交
* @return {x1 , y1 , x2 , y2}
*/
public double[] intersect(){
// 在一元二次方程中 a*x^2+b*x+c=0
double a,b,c;
//x的两个根 x_1 , x_2
//y的两个根 y_1 , y_2
double x_1 = 0,x_2=0,y_1=0,y_2=0;
//判别式的值
double delta = -1;
//如果 y1!=y2
if(y1!=y2){
//为了方便代入
double A = (x1*x1 - x2*x2 +y1*y1 - y2*y2 + r2*r2 - r1*r1)/(2*(y1-y2));
double B = (x1-x2)/(y1-y2);
a = 1 + B * B;
b = -2 * (x1 + (A-y1)*B);
c = x1*x1 + (A-y1)*(A-y1) - r1*r1;
//下面使用判定式 判断是否有解
delta=b*b-4*a*c;
if(delta >0)
{
x_1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
x_2=(-b-Math.sqrt(b*b-4*a*c))/(2*a);
y_1 = A - B*x_1;
y_2 = A - B*x_2;
}
else if(delta ==0)
{
x_1 = x_2 = -b/(2*a);
y_1 = y_2 = A - B*x_1;
}else
{
System.err.println("两个圆不相交");
return null;
}
}
else if(x1!=x2){
//当y1=y2时,x的两个解相等
x_1 = x_2 = (x1*x1 - x2*x2 + r2*r2 - r1*r1)/(2*(x1-x2));
a = 1 ;
b = -2*y1;
c = y1*y1 - r1*r1 + (x_1-x1)*(x_1-x1);
delta=b*b-4*a*c;
if(delta >0)
{
y_1 = (-b+Math.sqrt(b*b-4*a*c))/(2*a);
y_2 = (-b-Math.sqrt(b*b-4*a*c))/(2*a);
}
else if(delta ==0)
{
y_1=y_2=-b/(2*a);
}else
{
System.err.println("两个圆不相交");
return null;
}
}
else
{
System.out.println("无解");
return null;
}
return new double[]{x_1,y_1,x_2,y_2};
}
}
其中Circle类代码如下
package com.ken.blesniff.bean;
/**
*
* @author lixiasong
*
*/
public class Circle{
private double x;
private double y;
private double r;
public Circle(double X,double Y,double R){
x=X;
y=Y;
r=R;
}
public double getX(){
return x;
}
public double getY(){
return y;
}
public double getR(){
return r;
}
}
工程文件参见java求两圆相交坐标
转载请注明文章出处:http://blog.csdn.net/u013780605/article/details/52673223
java求两个圆相交坐标的更多相关文章
- POJ 2546 Circular Area(两个圆相交的面积)
题目链接 题意 : 给你两个圆的半径和圆心,让你求两个圆相交的面积大小. 思路 : 分三种情况讨论 假设半径小的圆为c1,半径大的圆为c2. c1的半径r1,圆心坐标(x1,y1).c2的半径r2,圆 ...
- hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)
两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input22 30 00 02 30 05 0 Sam ...
- java求两个数中的大数
java求两个数中的大数 java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45.
- HDU 3467 (求五个圆相交面积) Song of the Siren
还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- Java求两个数平均值
如何正确的求2个数的平均值.在练习算法二分查找的时候发现的,以前没有注意到的bug 备注:数据以int类型为例 一.以前的通用写法 /** * 求a+b平均值 * @param a * @param ...
- java 求 两个数的百分比% (转)
int num1 = 7; int num2 = 9; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance(); / ...
- java求两个集合的差集
public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add(&qu ...
- Java 求两个数百分比%
int num1 = 500; int num2 = 312; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance( ...
随机推荐
- mitmproxy(TLS错误)
一.原来的基础上添加代码 """ This inline script allows conditional TLS Interception based on a us ...
- oracle11g更改字符集
一.查看服务器字符集编码三种方式:1)select userenv('language') from dual; -- 推荐2)select * from V$NLS_PARAMETERS;3)sel ...
- 如何在Windows系统下使用you-get下载网上的媒体资源
关于you-get的专业介绍可以点击这个链接:中文说明 1,首先你要在你的电脑上安装python环境 Windows系统下: 首先,你需要去官网下载相应的版本: 也可以下载我网盘里的(注意看好自己的电 ...
- Ubuntu 14.04 安装 Dash to Dock
每次打开或选择一个已经打开的应用都要把鼠标指到左上角,相当费事. Ubuntu 14.04 GNOME自带 Tweaks (系统中名为:优化工具),可以使界面如Windows般(最小化.最大化.底部任 ...
- 腾讯云服务器上搭建Jenkins配置邮箱通知
1,Jenkins 点击 系统管理 2,点击系统管理 3,配置系统管理员邮件地址 5,配置 Extended E-main Notification,(用户名不需要邮箱后缀“@163.com”, SS ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 数组
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 number0. ...
- 理解依赖注入(DI - Dependency Injection)
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- jmeter --- 组件
- php条件判断(9.29 第十五天)
超级全局变量:$GLOBALS //包含全部变量的全局组合数组$_SERVER //包含请求头中的信息,用户的IP.用户的UA.头信息$_REQUEST //包含用户提交的所有数据(POST/GET ...
- select、poll和epoll机制
一.参考网址 1.select函数及fd_set介绍 2.linux select 函数和 fd_set 用法 2.select.poll和epoll的区别 3.利用select实现IO多路复用TCP ...