现在已知两个点坐标a(1,1)b(4,-2)
有一个点c的坐标未知,但是c点距a的距离5,距b的距离是7
求出c可能出现的坐标
用java完成。
高手大侠帮一下忙

解决方案 »

  1.   

    可以先用数学知识简化一下,该点有2个,而且肯定出现在与ab连线垂直的线上,根据7:5的比例可以算出这个直线方程,再在这个直线上找出距a的距离5或距b的距离是7的点就行了
      

  2.   

    刚才认真看了一下,你给的点坐标是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.9999989178861535
    c2的坐标: (-2.9999989178860056,-2.0000014428181165)//c2(-3,-2)
    两点距离:  c2_a=5.0  c2_b=6.9999989178861535
      

  3.   

    写了一个,参考下:/*
     * 设 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;
    }
    }