Problem:
線対称

平面上の異なる 3 点 P1(x1,y1), P2(x2,y2), Q(xq,yq) の座標の組を読み込んで、点 P1 点P2 を通る直線を対称軸として点 Q と線対称の位置にある点 R(x,y) を出力するプログラムを作成してください。なお、点 Q は、その対称軸上にないものとします。

入力

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

x1,y1,x2,y2,xq,yq

x1, y1, x2, y2, xq, yq (-100 以上 100 以下の実数) がカンマ区切りで１行に与えられます。

データセットの数は 50 を超えない。

出力

データセットごとに、x, y を空白区切りで 1 行に出力する。出力は実数で 0.0001 以下の誤差を含んでもよい。

Sample Input

1.0,0.0,-1.0,0.0,1.0,1.0
1.0,0.0,0.0,-1.0,3.0,0.0
0.0,1.0,0.0,-1.0,1.0,1.0

Output for the Sample Input

1.000000 -1.000000
1.000000 2.000000
-1.000000 1.000000

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;

class Main
{
	public static void main(String args[])
	{
		Scanner sc = new Scanner(System.in).useDelimiter("[\n, ]+");
		while (sc.hasNext())
		{
			double x1 = sc.nextDouble(),
					y1 = sc.nextDouble(),
					x2 = sc.nextDouble(),
					y2 = sc.nextDouble(),
					xq = sc.nextDouble(),
					yq = sc.nextDouble();
			double a, b;
			if (x1 == x2)
			{
				a = (x1 - xq) * 2 + xq;
				b = yq;
			}
			else if (y1 == y2)
			{
				a = xq;
				b = (y1 - yq) * 2 + yq;
			}
			else
			{
				a = ((x2 - x1) * (y2 - y1) * (2.0 * yq - 2.0 * y1)
					+ (x2 - x1) * (x2 - x1) * xq
					- (y2 - y1) * (y2 - y1) * (xq - 2.0 * x1))
					/ ((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
				b = ((xq - a) * (x2 - x1)) / (y2 - y1) + yq;
			}
			System.out.printf("%f %f\n", a, b);
		}
	}
}