java 已知两点坐标,另外一点到这两点的距离,求另一个点 现在已知两个点坐标a(1,1)b(4,-2)有一个点c的坐标未知,但是c点距a的距离5,距b的距离是7求出c可能出现的坐标用java完成。高手大侠帮一下忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以先用数学知识简化一下,该点有2个,而且肯定出现在与ab连线垂直的线上,根据7:5的比例可以算出这个直线方程,再在这个直线上找出距a的距离5或距b的距离是7的点就行了 刚才认真看了一下,你给的点坐标是x,y也就是二维所以不可能是球相交而是圆相交。如果两个圆相交则最多有两个焦点也就是两个解。注:两点连线不一定是中垂线。下面是代码仅供参考,满意不要忘记给分啊。package book.algorithms;import java.util.Scanner;class Point{ public double x; public double y; public Point(int x,int y) { this.x=x; this.y=y; } public static double length(Point a,Point b) { return Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y, 2)); }}public class Main { public static void main(String args[]) { Point a=new Point(1,1); Point b=new Point(4,-2); Point c1=new Point(0,0); Point c2=new Point(0,0); double ca=5.0; double cb=7.0; double t1=0,t2=0; /** * 参数θ角度圆a的 参数方程 * x=5cosθ+1 * y=5sinθ+1 * 带入圆b方程(x-4)^2+(y+2)^2=49方程 * 得到sin(θ-π/4)=2^0.5/10 * 只要解出来θ就能得到点的坐标 */ double ab=Point.length(a, b); if(!(ca+cb>ab && ca+ab>cb && ab+ab>ca)) { System.out.println("这样的点不存在");//构不成三角形 return; } for(double t=Math.PI/24;;t+=0.000001) { //近似解方程sin(θ-π/4)=2^0.5/10 if(Math.abs(Math.sin(t)-Math.sqrt(2)/10)<1e-6) { t1=Math.PI/4+t; t2=5*Math.PI/4-t; break; } } c1.x=5*Math.cos(t1)+1; c1.y=5*Math.sin(t1)+1;//y=5sinθ+1 c2.x=5*Math.cos(t2)+1; c2.y=5*Math.sin(t2)+1; double c1_a=Point.length(c1,a); double c1_b=Point.length(c1,b); double c2_a=Point.length(c2, a); double c2_b=Point.length(c2, b); System.out.println("c1的坐标: ("+c1.x+","+c1.y+")"); System.out.print("两点距离: c1_a="+c1_a); System.out.println(" c1_b="+c1_b); System.out.println("c2的坐标: ("+c2.x+","+c2.y+")"); System.out.print("两点距离: c2_a="+c2_a); System.out.println(" c2_b="+c2_b); //由结果可以看出这两个点的坐标为c1(4,5),c2(-3,-2) } } c1的坐标: (4.000001442818117,4.999998917886005)//c1(4,5)两点距离: c1_a=5.0 c1_b=6.9999989178861535c2的坐标: (-2.9999989178860056,-2.0000014428181165)//c2(-3,-2)两点距离: c2_a=5.0 c2_b=6.9999989178861535 写了一个,参考下:/* * 设 a点坐标为(ax,ay) ,b点坐标为(bx,by), 点c 到点a的距离是 da,到点b的距离是db. * 根据勾股定理,存在下面等式: * (x-ax)*(x-ax)+(y-ay)*(y-ay)=da*da; // 方程 1。 * (x-bx)*(x-bx)+(y-by)*(y-by)=db*db; // 方程 2。 * 根据上面的等式,可以求出如下的x,y的关系式: * y=k*x+kb; * 其中: * k=(ax-bx)/(by-ay); * kb=(da*da-db*db+bx*bx+by*by-ax*ax-ay*ay)/(2*(by-ay)); * * 再带回上面的方程1: * 得到如下的等式: * a*x*x+b*x+c=0; * 其中a=1+k*k; b=2*k(kb-ay)-2ax; c=ax*ax+(kb-ay)(kb-ay)-da*da; * * 根据一元二次方程求解公式: * x1=(-b+Math.sqrt(b*b-4*a*c))/(2*a); * x2=(-b-Math.sqrt(b*b-4*a*c))/(a*a); * y1=k*x1+kb; * y2=k*x2+kb; */package csdn.calculate;import java.io.*;import java.util.*;public class GetDotC1{ public static void main(String[] args) { Dot[] dots=new Dot[2]; //保存两个符合条件的点坐标。 Scanner scan=new Scanner(System.in); //键盘输入个点的坐标,和到两个点的距离。 System.out.println("请输入a点的坐标:"); double ax=scan.nextDouble(); double ay=scan.nextDouble(); scan.nextLine(); System.out.println("请输入b点的坐标:"); double bx=scan.nextDouble(); double by=scan.nextDouble(); scan.nextLine(); //输入c到a点的距离 System.out.println("请输入c到a点的距离:"); double da=scan.nextDouble(); System.out.println("请输入c到b点的距离:"); double db=scan.nextDouble(); scan.nextLine(); //判断disA+disB>a到b的距离。 double ab=Math.sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); if(da+db<=ab) { System.out.println("输入数据不合理!"); System.exit(1); } Dot dotA=new Dot(ax,ay); //保存a点坐标。 Dot dotB=new Dot(bx,by); //b点坐标。 CalculateDotC cdc=new CalculateDotC(dotA,dotB,da,db); dots=cdc.getDotC(); //求那两个点的坐标。 System.out.println(dots[0]); System.out.println(dots[1]); }}//创建一个描述点的类。class Dot{ private double x,y; public Dot(double x,double y) { this.x=x; this.y=y; } public void setX(double x) { this.x=x; } public void setY(double y) { this.y=y; } public double getX() { return x; } public double getY() { return y; } public String toString() { return "this dot's coordinate is x= "+x+" y= "+y; }}//用于计算的类。class CalculateDotC{ private Dot dotA,dotB,dotC1,dotC2; private double da,db; private double ax,ay,bx,by; private double k,kb; private double a,b,c; private double x1,y1,x2,y2; public CalculateDotC(Dot dotA,Dot dotB,double da,double db) { this.dotA=dotA; this.dotB=dotB; this.da=da; this.db=db; ax=dotA.getX(); ay=dotA.getY(); bx=dotB.getX(); by=dotB.getY(); } public Dot[] getDotC() { k=(ax-bx)/(by-ay); kb=(da*da-db*db+bx*bx+by*by-ax*ax-ay*ay)/(2*(by-ay)); a=1+k*k; b=2*k*(kb-ay)-2*ax; c=ax*ax+(kb-ay)*(kb-ay)-da*da; if((b*b-4*a*c)<0) { System.out.println("这样的点不存在!"); System.exit(1); } x1=(-b+Math.sqrt(b*b-4*a*c))/(2*a); x2=(-b-Math.sqrt(b*b-4*a*c))/(a*a); y1=k*x1+kb; y2=k*x2+kb; dotC1=new Dot(x1,y1); dotC2=new Dot(x2,y2); Dot[] dots=new Dot[2]; dots[0]=dotC1; dots[1]=dotC2; return dots; }} java 生成 mp3音频文件 关于传null 如何显示彩色文本? jbuilder多次運行后,爲什麽會出現tomcat 4.0 http 8080,tomcat 4.0 http 8083...? 怎样在java中用正则表达式在下面的html文件中得到下面的数据 请教有关.jar文件的问题 非常奇怪的问题 求助 Linux下到底如何设置JDK的环境变量 怎样实现往文件里存储多行文件 GridControl 一个线程的选择题 单继承多现实的例外?
注:两点连线不一定是中垂线。
下面是代码仅供参考,满意不要忘记给分啊。package book.algorithms;
import java.util.Scanner;
class Point
{
public double x;
public double y;
public Point(int x,int y)
{
this.x=x;
this.y=y;
}
public static double length(Point a,Point b)
{
return Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y, 2));
}
}
public class Main
{
public static void main(String args[])
{
Point a=new Point(1,1);
Point b=new Point(4,-2);
Point c1=new Point(0,0);
Point c2=new Point(0,0);
double ca=5.0;
double cb=7.0;
double t1=0,t2=0;
/**
* 参数θ角度圆a的 参数方程
* x=5cosθ+1
* y=5sinθ+1
* 带入圆b方程(x-4)^2+(y+2)^2=49方程
* 得到sin(θ-π/4)=2^0.5/10
* 只要解出来θ就能得到点的坐标
*/
double ab=Point.length(a, b);
if(!(ca+cb>ab && ca+ab>cb && ab+ab>ca))
{
System.out.println("这样的点不存在");//构不成三角形
return;
}
for(double t=Math.PI/24;;t+=0.000001)
{
//近似解方程sin(θ-π/4)=2^0.5/10
if(Math.abs(Math.sin(t)-Math.sqrt(2)/10)<1e-6)
{
t1=Math.PI/4+t;
t2=5*Math.PI/4-t;
break;
}
}
c1.x=5*Math.cos(t1)+1;
c1.y=5*Math.sin(t1)+1;//y=5sinθ+1
c2.x=5*Math.cos(t2)+1;
c2.y=5*Math.sin(t2)+1;
double c1_a=Point.length(c1,a);
double c1_b=Point.length(c1,b);
double c2_a=Point.length(c2, a);
double c2_b=Point.length(c2, b);
System.out.println("c1的坐标: ("+c1.x+","+c1.y+")");
System.out.print("两点距离: c1_a="+c1_a);
System.out.println(" c1_b="+c1_b);
System.out.println("c2的坐标: ("+c2.x+","+c2.y+")");
System.out.print("两点距离: c2_a="+c2_a);
System.out.println(" c2_b="+c2_b);
//由结果可以看出这两个点的坐标为c1(4,5),c2(-3,-2)
}
}
c1的坐标: (4.000001442818117,4.999998917886005)//c1(4,5)
两点距离: c1_a=5.0 c1_b=6.9999989178861535
c2的坐标: (-2.9999989178860056,-2.0000014428181165)//c2(-3,-2)
两点距离: c2_a=5.0 c2_b=6.9999989178861535
* 设 a点坐标为(ax,ay) ,b点坐标为(bx,by), 点c 到点a的距离是 da,到点b的距离是db.
* 根据勾股定理,存在下面等式:
* (x-ax)*(x-ax)+(y-ay)*(y-ay)=da*da; // 方程 1。
* (x-bx)*(x-bx)+(y-by)*(y-by)=db*db; // 方程 2。
* 根据上面的等式,可以求出如下的x,y的关系式:
* y=k*x+kb;
* 其中:
* k=(ax-bx)/(by-ay);
* kb=(da*da-db*db+bx*bx+by*by-ax*ax-ay*ay)/(2*(by-ay));
*
* 再带回上面的方程1:
* 得到如下的等式:
* a*x*x+b*x+c=0;
* 其中a=1+k*k; b=2*k(kb-ay)-2ax; c=ax*ax+(kb-ay)(kb-ay)-da*da;
*
* 根据一元二次方程求解公式:
* x1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
* x2=(-b-Math.sqrt(b*b-4*a*c))/(a*a);
* y1=k*x1+kb;
* y2=k*x2+kb;
*/package csdn.calculate;import java.io.*;
import java.util.*;public class GetDotC1
{
public static void main(String[] args)
{
Dot[] dots=new Dot[2]; //保存两个符合条件的点坐标。 Scanner scan=new Scanner(System.in);
//键盘输入个点的坐标,和到两个点的距离。
System.out.println("请输入a点的坐标:");
double ax=scan.nextDouble();
double ay=scan.nextDouble();
scan.nextLine(); System.out.println("请输入b点的坐标:");
double bx=scan.nextDouble();
double by=scan.nextDouble();
scan.nextLine();
//输入c到a点的距离
System.out.println("请输入c到a点的距离:");
double da=scan.nextDouble();
System.out.println("请输入c到b点的距离:");
double db=scan.nextDouble(); scan.nextLine();
//判断disA+disB>a到b的距离。
double ab=Math.sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
if(da+db<=ab)
{
System.out.println("输入数据不合理!");
System.exit(1);
}
Dot dotA=new Dot(ax,ay); //保存a点坐标。
Dot dotB=new Dot(bx,by); //b点坐标。 CalculateDotC cdc=new CalculateDotC(dotA,dotB,da,db); dots=cdc.getDotC(); //求那两个点的坐标。
System.out.println(dots[0]);
System.out.println(dots[1]); }
}
//创建一个描述点的类。
class Dot
{
private double x,y;
public Dot(double x,double y)
{
this.x=x;
this.y=y;
}
public void setX(double x)
{
this.x=x;
}
public void setY(double y)
{
this.y=y;
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public String toString()
{
return "this dot's coordinate is x= "+x+" y= "+y;
}
}
//用于计算的类。
class CalculateDotC
{
private Dot dotA,dotB,dotC1,dotC2;
private double da,db;
private double ax,ay,bx,by;
private double k,kb;
private double a,b,c;
private double x1,y1,x2,y2; public CalculateDotC(Dot dotA,Dot dotB,double da,double db)
{
this.dotA=dotA;
this.dotB=dotB;
this.da=da;
this.db=db;
ax=dotA.getX();
ay=dotA.getY();
bx=dotB.getX();
by=dotB.getY();
}
public Dot[] getDotC()
{
k=(ax-bx)/(by-ay);
kb=(da*da-db*db+bx*bx+by*by-ax*ax-ay*ay)/(2*(by-ay)); a=1+k*k;
b=2*k*(kb-ay)-2*ax;
c=ax*ax+(kb-ay)*(kb-ay)-da*da;
if((b*b-4*a*c)<0)
{
System.out.println("这样的点不存在!");
System.exit(1);
}
x1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
x2=(-b-Math.sqrt(b*b-4*a*c))/(a*a);
y1=k*x1+kb;
y2=k*x2+kb; dotC1=new Dot(x1,y1);
dotC2=new Dot(x2,y2); Dot[] dots=new Dot[2];
dots[0]=dotC1;
dots[1]=dotC2; return dots;
}
}