files/minecraft-stronghold-locator

46 lines
958 B
Ruby
Executable File

#!/usr/bin/env ruby
def prompt(message)
$stdout.write(message)
$stdout.flush
$stdin.readline.chomp
end
if ARGV.size == 6
args = ARGV
else
args = []
args = prompt("Throw 1 X: ")
args = prompt("Throw 1 Z: ")
args = prompt("Throw 1 Angle: ")
args = prompt("Throw 2 X: ")
args = prompt("Throw 2 Z: ")
args = prompt("Throw 2 Angle: ")
end
x_1, z_1, a_1, x_2, z_2, a_2 = *(args.map {|a| a.to_f})
a_1 = Math::PI * a_1 / 180.0
a_2 = Math::PI * a_2 / 180.0
# Angle 0 is +Z, so Z = cos(a)
# Angle 90 is -X, so X = -sin(a)
# x = mz + b
m_1 = -Math.sin(a_1) / Math.cos(a_1)
m_2 = -Math.sin(a_2) / Math.cos(a_2)
b_1 = x_1 - m_1 * z_1
b_2 = x_2 - m_2 * z_2
# x = (m1)z + (b1)
# x = (m2)z + (b2)
# (m1)z + (b1) = (m2)z + (b2)
# (m1 - m2)z = b2 - b1
# z = (b2 - b1) / (m1 - m2)
z = (b_2 - b_1) / (m_1 - m_2)
x = m_1 * z + b_1
puts("Approx location: #{x.round(1)}, #{z.round(1)}")
d = Math.sqrt(x * x + z * z)
puts("Distance from origin: #{d}")