已知两圆坐标及半径,想求两个圆的外切线的四个坐标,不知道用java代码该怎么实现了。下面是我的实现,出来的结果一直不对:
public static List<Point> getPointLocations(Point p1, Point p2){
List<Point> pointList = new LinkedList<>();
double k = (double)(p2.y-p1.y)/(double) (p2.x-p1.x);//求出斜率
double c = p1.y-k*p1.x;//求出p1点的常数系数
double k2 = -(1/k);//垂直于这条线的斜率
double c2 = p1.y+p1.x/k;//垂直线的斜率常数系数
int size = 45;//半径
double c3 = size * (Math.sqrt(k*k+1))+c;
double c4 = c - size * Math.sqrt(k*k+1);
Log.e(TAG, "getPointLocations: k:"+k+" c:"+c+" k2:"+k2+" c2:"+c2+" c3:"+c3+" c4:"+c4);
double x1 = (c2 - c3)/(k+k2);
double y1 = k*x1+c3;
double x2 = (c2 - c4)/(k+k2);
double y2 = k*x2+c4;
double p2c = p2.y-k*p2.x;
double p2c2 = p2.y+p2.x/k;
double p2c3 = size * Math.sqrt(k*k+1)+p2c;
double p2c4 = p2c - size * (Math.sqrt(k*k+1));
double x3 = (p2c2 - p2c3)/(k+k2);
double y3 = k*x3+p2c3;
double x4 = (p2c2 - p2c4)/(k+k2);
double y4 = k*x4+p2c4;
pointList.add(new Point((int)(x1-p1.x),(int)(y1-p1.y)));
pointList.add(new Point((int)(x2-p1.x),(int)(y2-p1.y)));
pointList.add(new Point((int)(x3-p2.x),(int)(y3-p2.y)));
pointList.add(new Point((int)(x4-p2.x),(int)(y4-p2.y)));
Log.e("TAG", "getPointLocations: "+" size "+size+" "+pointList.toString() );
return pointList;
}