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.*;
import java.io.*;

class Main {

    public static void main(String[] args) {

	final Scanner stdin = new Scanner(System.in);

	while ( stdin.hasNextLine() ) {
	    final String[] input = stdin.nextLine().split( "," );
	    final double[] p1 = { Double.parseDouble( input[0] ), Double.parseDouble( input[1] ) };
	    final double[] p2 = { Double.parseDouble( input[2] ), Double.parseDouble( input[3] ) };
	    final double[] pq = { Double.parseDouble( input[4] ), Double.parseDouble( input[5] ) };

	    final double[] a = sub( p1, pq );
	    final double[] b = sub( p2, pq );

	    final double alpha = - ip( b, sub( a, b ) ) / norm( sub( a, b ) );
	    double[] ans = add( pq, times( add( times( a, alpha ), times( b, 1 - alpha ) ), 2 ) );
	    System.out.printf( "%f %f\n", ans[0], ans[1] );
	}	
    }

    static double[] times( double[] v, double val ) {
	final double[] vc = Arrays.copyOf( v, v.length );
	for ( int i = 0; i < v.length; i++ ) {
	    vc[i] *= val;
	}
	return vc;
    }

    static double ip( double[] v1, double[] v2 ) {
	double sum = 0.0;
	for( int i = 0; i < v1.length; i++ ) {
	    sum += v1[i] * v2[i];
	}
	return sum;
    }

    static double norm( double[] v ) {
	return ip( v, v );
    }

    static double[] add( double[] v1, double[] v2 ) {
	final double[] v1c = Arrays.copyOf( v1, v1.length );
	for ( int i = 0; i < v1c.length; i++ ) {
	    v1c[i] += v2[i];
	}
	return v1c;
    }

    static double[] sub( double[] v1, double[] v2 ) {
	final double[] v1c = Arrays.copyOf( v1, v1.length );
	for ( int i = 0; i < v1c.length; i++ ) {
	    v1c[i] -= v2[i];
	}
	return v1c;
    }
    
}