问题:已知大圆R与两小圆R1,R2内切,且两小圆R1,R2外切。
并已知大圆R的半径r0、圆心坐标x0,y0,小圆R1的半径r1、圆心坐标x1,y1,以及小圆R2半径r2。求R2圆心坐标。即已知r0,x0,y0,r1,x1,y1,r2,
列方程组
(x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)=(r0-r2)*(r0-r2)
(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)=(r1+r2)*(r1+r2)求x2,y2.求代码...

解决方案 »

  1.   

    晕 方程组都出来了,你自己写个函数
    (x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)=(r0-r2)*(r0-r2)
    笔算,怎么算的,你函数就怎么写,很简单的啊
      

  2.   

    用matlab(好像是的,现在全忘了)
    直接在里面画图,结果就出来了
      

  3.   

    我用牛顿松弛法...异常。
    可能是语法上的错误,偶是java新手...
    望高手解惑。
    import static java.lang.Math.*;public class Account {
        private double x2=0;
        private double y2=0;
        
        public static void main(String[] args) {
            double x0 = 512;
            double y0 = 384;
              
            double x1 = 512;
            double y1 = 284;
            
            double r0 = 300;
            double r1 = 100;
            double r2 = 50;
            
            Account Third = new Account(x0,y0,x1,y1,r0,r1,r2);
            
            System.out.println(Third.getX()+","+Third.getY());
        }
        
        public Account(double x0,double y0,double x1,double y1,double r0,double r1,double r2){
            
            double[] x=new double[10000];
            double[] y=new double[10000];
            double[] j=new double[10000];
            double resultX=0;
            double resultY=0;
            
            x[0]=1;
            y[0]=1;        for(int i=0;i<j.length;i++){
                j[i]=4*((x[i]-x0)*(y[i]-y1)-(x[i]-x1)*(y[i]-y0));
            
                if(j[i]!=0) {
                    x[i+1]=x[i]+2*((y[i]-y0)*f2(x[i],y[i],x1,y1,r0,r1)-(y[i]-y1)*f1(x[i],y[i],x0,y0,r0,r2))/j[i];
                    y[i+1]=y[i]+2*((x[i]-x1)*f1(x[i],y[i],x0,y0,r0,r2)-(x[i]-x0)*f2(x[i],y[i],x1,y1,r0,r1))/j[i];
                    
                    resultX=abs(x[i+1]-x[i]);
                    resultY=abs(y[i+1]-y[i]);
                }
                else {
                    System.err.print("错误!");
                }
                
                if(max(resultX,resultY)<0.1){
                    double x2=x[i+1];
                    double y2=y[i+1];
                    break;
                }
            }
        }
        
        public double getX(){
            return x2;
        }
        public double getY(){
            return y2;
        }
                
        double f1(double x,double y,double x0,double y0,double r0,double r2){
            double result1=(x-x0)*(x-x0)+(y-y0)*(y-y0)-(r0-r2)*(r0-r2);
            return result1;
        }
            
        double f2(double x,double y,double x1,double y1,double r0,double r1){
            double result2=(x-x1)*(x-x1)+(y-y1)*(y-y1)-(r0+r1)*(r0+r1);
            return result2;
        }
    }