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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	public static void main(String[] args)throws IOException{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader reader = new BufferedReader(isr);
		String string;
		double x1, y1, x2, y2, xq, yq, m, n, in1, in2, v1, v2, x, y;
		
		while((string = reader.readLine()) != null){
			x1 = Double.parseDouble(string.split(",")[0]);
			y1 = Double.parseDouble(string.split(",")[1]);
			x2 = Double.parseDouble(string.split(",")[2]);
			y2 = Double.parseDouble(string.split(",")[3]);
			xq = Double.parseDouble(string.split(",")[4]);
			yq = Double.parseDouble(string.split(",")[5]);
			
			if(x2 - x1 == 0){
				System.out.printf("%.6f %.6f\n", 2 * x1 - xq, yq);
			}else if(y2 - y1 == 0){
				System.out.printf("%.6f %.6f\n", xq, (2 * y1 - yq));
			}else{
				m = (y2 - y1) / (x2 - x1);
				n = -1 / m;
				in1 = y1 - m * x1;
				in2 = yq - n * xq;
				v1 = (in1 - in2) / (n - m);
				v2 = (n * in1 - m * in2) / (n - m);
				x = 2 * v1 - xq;
				y = 2 * v2 - yq;
				System.out.printf("%.6f %.6f\n", x, y);
			}
		}
	}
}