Robert Eisele
Engineer, Systems Architect and DBA

Hackerrank: Find the Point

Original Problem

Consider two points, \(p=(p_x, p_y)\) and \(q=(q_x, q_y)\). We consider the inversion or point reflection, \(r=(r_x, r_y)\), of point \(p\) across point \(q\) to be a \(180^{\circ}\) rotation of point \(p\) around \(q\).

Given \(n\) sets of points \(p\) and \(q\), find \(r\) for each pair of points and print two space-separated integers denoting the respective values of \(r_x\) and \(r_y\) on a new line.

Input Format

The first line contains an integer, \(n\), denoting the number of sets of points.
Each of the \(n\) subsequent lines contains four space-separated integers describing the respective values of \(p_x\), \(p_y\), \(q_x\), and \(q_y\) defining points \(p=(p_x,p_y)\) and \(q=(q_x,q_y)\).

Constraints

  • \(1\leq n\leq 15\)
  • \(-100\leq p_x,p_y,q_x,q_y\leq 100\)

Output Format

For each pair of points \(p\) and \(q\), print the corresponding respective values of \(r_x\) and \(r_y\) as two space-separated integers on a new line.

Sample Input

2
0 0 1 1
1 1 2 2

Sample Output

2 2
3 3

Explanation

The graphs below depict points \(p\), \(q\), and \(r\) for the \(n=2\) points given as Sample Input:


  1. Thus, we print \(r_x\) and \(r_y\) as 2 2 on a new line.

  2. Thus, we print \(r_x\) and \(r_y\) as 3 3 on a new line.

Solution

The rotation matrix around \(180^\circ\) is:

$$R(180^{\circ })={\begin{bmatrix}\cos 180^{\circ } &-\sin 180^{\circ } \\\sin 180^{\circ } &\cos 180^{\circ } \\\end{bmatrix}}={\begin{bmatrix}-1&0\\[3pt]0&-1\\\end{bmatrix}}$$

Now it's quite easy to translate by point \(q\), rotate with matrix \(R\) and translate back to \(q\):

$$r = q + R(180^{\circ }) \cdot (p - q) = 2q - p$$

The final implementation then looks like this in Ruby:

gets.to_i.times{
    x = gets.split.map(&:to_i)
    print 2 * x[2] - x[0], ' ', 2 * x[3] - x[1], "\n"
}

Go to overview

All images are copyright to Hackerrank