最近由于项目需要,根据两个圆函数求出相交的坐标。实现代码如下,另感谢两圆求交点算法实现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求两个圆相交坐标相关推荐

  1. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  2. java小数点默认定义_java求两个数后小数点默认无限长度

    闲来没事,写个求两个数相除,想看看后面的小数,此算法可快速算出小数点后千万位. import java.io.BufferedWriter; import java.io.File; import j ...

  3. java求两个圆相交坐标

    最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...

  4. python求交点坐标_Python求两个圆的交点坐标或三个圆的交点坐标方法

    计算两个圆的交点 代码如下: # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2): x = p1 ...

  5. 平面上有两个圆相交,求两个圆相交部分的面积

    平面上有两个圆相交,求两个圆相交部分的面积 又学习了一遍算法,感触颇深,也对算法有了更进一步的认识,记录一下这次的学习,希望能帮到有需要的人. 输入:六个参数:第一个圆的圆心坐标,半径,第二个圆的圆心 ...

  6. Java编程语言学习:Java语言基础案例(如求两门课分数之差、三门课平均分、关系运算符作比较)之详细攻略

    Java编程语言学习:Java语言基础案例(如求两门课分数之差.三门课平均分.关系运算符作比较)之详细攻略 目录 Java语言基础案例 1.求两门课分数之差.三门课平均分: 2.关系运算符作比较

  7. hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)

    两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input 2 2 3 0 0 0 0 2 3 0 0 ...

  8. Python求两个圆的交点坐标或三个圆的交点坐标

    计算两个圆的交点代码如下 # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2):x = p1[0] ...

  9. js求两圆交点_如何求两个圆的交点坐标,请举例

    展开全部 将两个圆62616964757a686964616fe4b893e5b19e31333431363563的方程相减,就消掉了x²,y²项,剩下一个关于x, y的一次方程,可解得y=kx+b. ...

最新文章

  1. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
  2. [笔记]何为Linux及其文件系统(四)
  3. DenseNet 测试
  4. Ubuntu上可使用的15个桌面环境
  5. Workflow之Activity
  6. 夺命雷公狗---ECSHOP---01-解决报错问题
  7. 15.1 异常(异常的基本概念+自定义异常)
  8. 11个优秀的交互设计作品集
  9. 快速压缩Word文档的小妙招
  10. Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率
  11. 如何解决失眠有效方法,五个助眠小妙招
  12. 程序员因加班错失77万年会大奖,该不该补发?-千氪
  13. 使用微信开发者工具调试微信网页授权登录-react
  14. java 面向接口编程
  15. 《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》—第1章1.2节安装BackTrack到硬盘...
  16. kiss of death
  17. python排序方法sorted和list.sort()使用讲解
  18. latex 希腊字母表示
  19. 写在最前-工程流体力学
  20. 第1章 Java概述

热门文章

  1. 组会PPT202006220717《双研究步骤的螺旋波等离子体放电结果分析》
  2. 云炬Android开发笔记 3-3基础框架可用性验证
  3. 保存delphi中的library path
  4. bootsect.s文件阅读问题集
  5. 为什么`malloc`出来的内存也能当成对象正常使用
  6. Linux_unix系统编程手册以同步方式等待信号
  7. 字符串处理分割字符串
  8. springmvc传递数组参数
  9. 一个历史遗留问题,引发的linux内存管理的‘血案’
  10. main函数解析(一)——Linux-0.11 学习笔记(五)