java 圆的交点_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 圆的交点_java求两个圆相交坐标相关推荐
- java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码
JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...
- java小数点默认定义_java求两个数后小数点默认无限长度
闲来没事,写个求两个数相除,想看看后面的小数,此算法可快速算出小数点后千万位. import java.io.BufferedWriter; import java.io.File; import j ...
- java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...
- python求交点坐标_Python求两个圆的交点坐标或三个圆的交点坐标方法
计算两个圆的交点 代码如下: # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2): x = p1 ...
- 平面上有两个圆相交,求两个圆相交部分的面积
平面上有两个圆相交,求两个圆相交部分的面积 又学习了一遍算法,感触颇深,也对算法有了更进一步的认识,记录一下这次的学习,希望能帮到有需要的人. 输入:六个参数:第一个圆的圆心坐标,半径,第二个圆的圆心 ...
- Java编程语言学习:Java语言基础案例(如求两门课分数之差、三门课平均分、关系运算符作比较)之详细攻略
Java编程语言学习:Java语言基础案例(如求两门课分数之差.三门课平均分.关系运算符作比较)之详细攻略 目录 Java语言基础案例 1.求两门课分数之差.三门课平均分: 2.关系运算符作比较
- hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)
两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input 2 2 3 0 0 0 0 2 3 0 0 ...
- Python求两个圆的交点坐标或三个圆的交点坐标
计算两个圆的交点代码如下 # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2):x = p1[0] ...
- js求两圆交点_如何求两个圆的交点坐标,请举例
展开全部 将两个圆62616964757a686964616fe4b893e5b19e31333431363563的方程相减,就消掉了x²,y²项,剩下一个关于x, y的一次方程,可解得y=kx+b. ...
最新文章
- 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
- [笔记]何为Linux及其文件系统(四)
- DenseNet 测试
- Ubuntu上可使用的15个桌面环境
- Workflow之Activity
- 夺命雷公狗---ECSHOP---01-解决报错问题
- 15.1 异常(异常的基本概念+自定义异常)
- 11个优秀的交互设计作品集
- 快速压缩Word文档的小妙招
- Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率
- 如何解决失眠有效方法,五个助眠小妙招
- 程序员因加班错失77万年会大奖,该不该补发?-千氪
- 使用微信开发者工具调试微信网页授权登录-react
- java 面向接口编程
- 《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》—第1章1.2节安装BackTrack到硬盘...
- kiss of death
- python排序方法sorted和list.sort()使用讲解
- latex 希腊字母表示
- 写在最前-工程流体力学
- 第1章 Java概述