Problem:
三角形と円

平面上にある三角形と円の位置関係を判定するプログラムを作成してください。対象となる図形はいずれも境界を含むものとします。
三角形は 3 頂点の位置が与えられ、円は中心の位置と半径が与えられます。位置は直交座標系による２つの整数の組によって与えられます。半径も整数で与えられます。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

x1 y1
x2 y2
x3 y3
xc yc
r

１行目から３行目に、三角形の第 i の頂点座標 xi, yi が与えられます。４行目に円の中心の座標 xc, yc、５行目に円の半径 r が与えられます。与えられる入力はすべて、1 以上 10,000 以下の整数とします。

データセットの数は 100 を超えません。

Output

入力データセットごとに以下の形式で判定結果を１行に出力します。

円が三角形に含まれる場合 a

三角形が円に含まれる場合 b

それ以外の場合で、共通部分がある場合には c

共通部分がない場合には d

Sample Input

1 1
3 1
3 3
3 2
3
3 12
9 3
11 12
8 7
5
15 3
17 7
22 5
7 6
4
6 11
8 2
16 9
10 8
2
0 0

Output for the Sample Input

b
c
d
a

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.io.*;

public class Main {
	
	public int space(Point a, Point b, Point c){
		return (a.x-c.x)*(b.y-c.y) - (a.y-c.y)*(b.x-c.x);
	}
	public double dist(Point a, Point b){
		return Math.sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
	}
	public double dist(Point a, Point b, Point c){
		return Math.abs(space(a, b, c) / dist(a, b));
	}
	public boolean inOrOut(Triangle tr, Point p){
		double key = Math.signum(space(tr.a, tr.b, p)) + Math.signum(space(tr.b, tr.c, p)) + Math.signum(space(tr.c, tr.a, p));
		return (Math.abs(key) == 3);
	}
	public boolean crossOrNot(Point a, Point b, Circle c){
		if( dist(a, b, c.p) > c.r ){
			return true;
		}
		if( Math.min(dist(a, c.p), dist(b, c.p)) <= c.r ){
			return false;
		}
		double l = Math.max(dist(a, c.p), dist(b, c.p));
		double d = dist(a, b, c.p);
		if( Math.sqrt(l*l - d*d) > dist(a, b) ){
			return true;
		}
		return false;
	}		
	public void relation(Triangle tr, Circle c){
		if( dist(tr.a, c.p) <= c.r && dist(tr.b, c.p) <= c.r && dist(tr.c, c.p) <= c.r ){
			writer.println("b");
		} else if( inOrOut(tr, c.p) && (dist(tr.a, tr.b, c.p) >= c.r && dist(tr.b, tr.c, c.p) >= c.r && dist(tr.c, tr.a, c.p) >= c.r) ){
			writer.println("a");
		} else if( crossOrNot(tr.a, tr.b, c) && crossOrNot(tr.b, tr.c, c) && crossOrNot(tr.c, tr.a, c) ){
			writer.println("d");
		} else {
			writer.println("c");
		}
		return;
	}
			
	public void solve() throws IOException{
		int n, m;
		while( (n = nextInt()) != 0 | (m = nextInt()) != 0 ){
			int p = nextInt(), q = nextInt(), r = nextInt(), s = nextInt();
			Triangle tr = new Triangle(n, m, p, q, r, s);
			int x = nextInt(), y = nextInt(), z = nextInt();
			Circle c = new Circle(x, y, z);
			relation(tr, c);
		}
	}			
	public static void main (String args[]) throws IOException{
		new Main().run();
	}
	
	BufferedReader reader;
	StringTokenizer tokenizer;
	PrintWriter writer;
	
	public void run() throws IOException{
		try{
			reader = new BufferedReader(new InputStreamReader(System.in));
			tokenizer = null;
			writer = new PrintWriter(System.out);
			solve();
			reader.close();
			writer.close();
		} catch (Exception e){
			e.printStackTrace();
			System.exit(1);
		}
	}
	public int nextInt() throws IOException{
		return Integer.parseInt(nextToken());
	}		
	public String nextToken() throws IOException{
		while( tokenizer == null || !tokenizer.hasMoreTokens() ){
			tokenizer = new StringTokenizer(reader.readLine());
		}
		return tokenizer.nextToken();
	}
}

class Triangle{
	Point a;
	Point b;
	Point c;
	Triangle(int p, int q, int r, int s, int t, int u){
		a = new Point(p, q);
		b = new Point(r, s);
		c = new Point(t, u);
	}
}
class Point{
	int x;
	int y;
	Point(int x, int y){
		this.x = x;
		this.y = y;
	}
}
class Circle{
	Point p;
	int r;
	Circle(int x, int y, int r){
		p = new Point(x, y);
		this.r = r;
	}
}