from __future__ import division
import math
pos = dict()
angle = dict()
def checkThird(n1, n2, n3):
x1 = pos[n1][0]
y1 = pos[n1][1]
x2 = pos[n2][0]
y2 = pos[n2][1]
th1 = math.radians(angle[(n1,n3)])
th2 = math.radians(angle[(n2,n3)])
c1 = math.cos(th1)
c2 = math.cos(th2)
s1 = math.sin(th1)
s2 = math.sin(th2)
l1 = ((y2-y1)*c2-(x2-x1)*s2)/(s1*c2-c1*s2)
l2 = ((y2-y1)*c1-(x2-x1)*s1)/(s1*c2-c1*s2)
return (x1+l1*c1, y1+l1*s1)
def makeThird(n1,n2,n3):
p3 = checkThird(n1,n2,n3)
pos[n3] = p3
return p3
def set_pos(n, x, y):
pos[n] = (x,y)
# convert D.A.R.C.I. to degrees
# 0 on the left of middle = 0 = North = +x = 0 deg
# 5 in middle = 5 = West = +y = 90 deg
# 0 on the right = 10 = South = -x = 180 deg
# 5 on the side = 15 = East = -y = 270 deg
def darci_to_deg(a):
return (18*a)
def set_angle(n1, n2, deg):
angle[(n1,n2)] = deg
angle[(n2,n1)] = 180+deg
def set_d_angle(n1, n2, d):
angle[(n1,n2)] = darci_to_deg(d)
angle[(n2,n1)] = darci_to_deg(d+10)
def pr(n):
if n in pos:
p = pos[n]
else:
p = (9999999999999999999999,9999999999999999999999)
print n,", (",round(p[0],2),",",round(p[1],2),")"
#sanity check
set_pos("test1",0,0)
set_pos("test2",0,3)
set_angle("test1","test3",30)
set_angle("test2","test3",-30)
print makeThird("test1","test2","test3")
print makeThird("test2","test1","test3")
set_pos("x", 5,0)
set_pos("y", 0, 10)
set_d_angle("x","p",5)
set_d_angle("y","p",0)
print "5,10?",makeThird("y","x","p")
print "5,10?",makeThird("x","y","p")
ingress = "ingress"
hallowed = "hallowed"
prophet = "prophet"
sky = "sky"
infinite = "infinite"
binary = "binary"
shattered = "shattered"
deep = "deep"
# distances are in meters, +/- 2 meters
# angles are in degrees, +/- 3 degrees
set_pos(ingress,0.0,0.0)
set_pos(hallowed,0.0,50.0)
set_d_angle(ingress, hallowed, 5)
set_d_angle(ingress, prophet, 1.375)
set_d_angle(ingress, sky, 3)
set_d_angle(ingress, binary, 4.5)
set_d_angle(ingress, deep, 8.25)
set_d_angle(hallowed, prophet, 19.875)
set_d_angle(hallowed, sky, 2.25)
set_d_angle(hallowed, binary, 3.75)
set_d_angle(hallowed, shattered, 7.25)
set_d_angle(hallowed, deep, 9.5)
set_d_angle(prophet, sky, 5)
set_d_angle(prophet, binary, 9.125)
set_d_angle(sky, infinite, 19.75)
set_d_angle(sky, binary, 12)
set_d_angle(infinite, binary, 15.75)
set_d_angle(binary, shattered, 8)
set_d_angle(shattered, deep, 13.5)
makeThird(ingress, hallowed, deep)
makeThird(ingress, hallowed, prophet)
makeThird(ingress, prophet, sky)
makeThird(ingress,prophet, binary)
makeThird(binary, sky, infinite)
makeThird(deep, binary, shattered)
pr(ingress)
pr(hallowed)
pr(binary)
pr(sky)
pr(prophet)
pr(infinite)
pr(shattered)
pr(deep)
# output
"""
ingress , ( 0.0 , 0.0 )
hallowed , ( 0.0 , 50.0 )
binary , ( 11.26 , 71.08 )
sky , ( 99.94 , 137.56 )
prophet , ( 99.94 , 46.07 )
infinite , ( -6.72 , 145.95 )
shattered , ( -75.9 , 134.41 )
deep , ( -110.03 , 67.43 )
"""
ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgppbXBvcnQgbWF0aAoKcG9zID0gZGljdCgpCmFuZ2xlID0gZGljdCgpCgpkZWYgY2hlY2tUaGlyZChuMSwgbjIsIG4zKToKICB4MSA9IHBvc1tuMV1bMF0KICB5MSA9IHBvc1tuMV1bMV0KICB4MiA9IHBvc1tuMl1bMF0KICB5MiA9IHBvc1tuMl1bMV0KICB0aDEgPSBtYXRoLnJhZGlhbnMoYW5nbGVbKG4xLG4zKV0pCiAgdGgyID0gbWF0aC5yYWRpYW5zKGFuZ2xlWyhuMixuMyldKQogIGMxID0gbWF0aC5jb3ModGgxKQogIGMyID0gbWF0aC5jb3ModGgyKQogIHMxID0gbWF0aC5zaW4odGgxKQogIHMyID0gbWF0aC5zaW4odGgyKQogIGwxID0gKCh5Mi15MSkqYzItKHgyLXgxKSpzMikvKHMxKmMyLWMxKnMyKQogIGwyID0gKCh5Mi15MSkqYzEtKHgyLXgxKSpzMSkvKHMxKmMyLWMxKnMyKQogIHJldHVybiAoeDErbDEqYzEsIHkxK2wxKnMxKQoKZGVmIG1ha2VUaGlyZChuMSxuMixuMyk6CiAgcDMgPSBjaGVja1RoaXJkKG4xLG4yLG4zKQogIHBvc1tuM10gPSBwMwogIHJldHVybiBwMwogIAogIApkZWYgc2V0X3BvcyhuLCB4LCB5KToKICBwb3Nbbl0gPSAoeCx5KQoKIyBjb252ZXJ0IEQuQS5SLkMuSS4gdG8gZGVncmVlcwojIDAgb24gdGhlIGxlZnQgb2YgbWlkZGxlID0gMCA9IE5vcnRoID0gK3ggPSAwIGRlZwojIDUgaW4gbWlkZGxlID0gNSA9IFdlc3QgPSAreSA9IDkwIGRlZwojIDAgb24gdGhlIHJpZ2h0ID0gMTAgPSBTb3V0aCA9IC14ID0gMTgwIGRlZwojIDUgb24gdGhlIHNpZGUgPSAxNSA9IEVhc3QgPSAteSA9IDI3MCBkZWcKZGVmIGRhcmNpX3RvX2RlZyhhKToKICByZXR1cm4gKDE4KmEpCgpkZWYgc2V0X2FuZ2xlKG4xLCBuMiwgZGVnKToKICBhbmdsZVsobjEsbjIpXSA9IGRlZwogIGFuZ2xlWyhuMixuMSldID0gMTgwK2RlZwoKZGVmIHNldF9kX2FuZ2xlKG4xLCBuMiwgZCk6CiAgYW5nbGVbKG4xLG4yKV0gPSBkYXJjaV90b19kZWcoZCkKICBhbmdsZVsobjIsbjEpXSA9IGRhcmNpX3RvX2RlZyhkKzEwKQogCmRlZiBwcihuKToKICBpZiBuIGluIHBvczoKICAgICBwID0gcG9zW25dCiAgZWxzZToKICAgICBwID0gKDk5OTk5OTk5OTk5OTk5OTk5OTk5OTksOTk5OTk5OTk5OTk5OTk5OTk5OTk5OSkKICBwcmludCBuLCIsICgiLHJvdW5kKHBbMF0sMiksIiwiLHJvdW5kKHBbMV0sMiksIikiCgojc2FuaXR5IGNoZWNrCnNldF9wb3MoInRlc3QxIiwwLDApCnNldF9wb3MoInRlc3QyIiwwLDMpCnNldF9hbmdsZSgidGVzdDEiLCJ0ZXN0MyIsMzApCnNldF9hbmdsZSgidGVzdDIiLCJ0ZXN0MyIsLTMwKQpwcmludCBtYWtlVGhpcmQoInRlc3QxIiwidGVzdDIiLCJ0ZXN0MyIpCnByaW50IG1ha2VUaGlyZCgidGVzdDIiLCJ0ZXN0MSIsInRlc3QzIikKCnNldF9wb3MoIngiLCA1LDApCnNldF9wb3MoInkiLCAwLCAxMCkKc2V0X2RfYW5nbGUoIngiLCJwIiw1KQpzZXRfZF9hbmdsZSgieSIsInAiLDApCnByaW50ICI1LDEwPyIsbWFrZVRoaXJkKCJ5IiwieCIsInAiKQpwcmludCAiNSwxMD8iLG1ha2VUaGlyZCgieCIsInkiLCJwIikKCgoKIAoKaW5ncmVzcyA9ICJpbmdyZXNzIgpoYWxsb3dlZCA9ICJoYWxsb3dlZCIKcHJvcGhldCA9ICJwcm9waGV0Igpza3kgPSAic2t5IgppbmZpbml0ZSA9ICJpbmZpbml0ZSIKYmluYXJ5ID0gImJpbmFyeSIKc2hhdHRlcmVkID0gInNoYXR0ZXJlZCIKZGVlcCA9ICJkZWVwIgogCiMgZGlzdGFuY2VzIGFyZSBpbiBtZXRlcnMsICsvLSAyIG1ldGVycwojIGFuZ2xlcyBhcmUgaW4gZGVncmVlcywgKy8tIDMgZGVncmVlcwoKc2V0X3BvcyhpbmdyZXNzLDAuMCwwLjApCnNldF9wb3MoaGFsbG93ZWQsMC4wLDUwLjApCgpzZXRfZF9hbmdsZShpbmdyZXNzLCBoYWxsb3dlZCwgNSkKc2V0X2RfYW5nbGUoaW5ncmVzcywgcHJvcGhldCwgMS4zNzUpCnNldF9kX2FuZ2xlKGluZ3Jlc3MsIHNreSwgMykKc2V0X2RfYW5nbGUoaW5ncmVzcywgYmluYXJ5LCA0LjUpCnNldF9kX2FuZ2xlKGluZ3Jlc3MsIGRlZXAsIDguMjUpCnNldF9kX2FuZ2xlKGhhbGxvd2VkLCBwcm9waGV0LCAxOS44NzUpCnNldF9kX2FuZ2xlKGhhbGxvd2VkLCBza3ksIDIuMjUpCnNldF9kX2FuZ2xlKGhhbGxvd2VkLCBiaW5hcnksIDMuNzUpCnNldF9kX2FuZ2xlKGhhbGxvd2VkLCBzaGF0dGVyZWQsIDcuMjUpCnNldF9kX2FuZ2xlKGhhbGxvd2VkLCBkZWVwLCA5LjUpCnNldF9kX2FuZ2xlKHByb3BoZXQsIHNreSwgNSkKc2V0X2RfYW5nbGUocHJvcGhldCwgYmluYXJ5LCA5LjEyNSkKc2V0X2RfYW5nbGUoc2t5LCBpbmZpbml0ZSwgMTkuNzUpCnNldF9kX2FuZ2xlKHNreSwgYmluYXJ5LCAxMikKc2V0X2RfYW5nbGUoaW5maW5pdGUsIGJpbmFyeSwgMTUuNzUpCnNldF9kX2FuZ2xlKGJpbmFyeSwgc2hhdHRlcmVkLCA4KQpzZXRfZF9hbmdsZShzaGF0dGVyZWQsIGRlZXAsIDEzLjUpCgptYWtlVGhpcmQoaW5ncmVzcywgaGFsbG93ZWQsIGRlZXApCm1ha2VUaGlyZChpbmdyZXNzLCBoYWxsb3dlZCwgcHJvcGhldCkKbWFrZVRoaXJkKGluZ3Jlc3MsIHByb3BoZXQsIHNreSkKbWFrZVRoaXJkKGluZ3Jlc3MscHJvcGhldCwgYmluYXJ5KQptYWtlVGhpcmQoYmluYXJ5LCBza3ksIGluZmluaXRlKQptYWtlVGhpcmQoZGVlcCwgYmluYXJ5LCBzaGF0dGVyZWQpCgoKCnByKGluZ3Jlc3MpCnByKGhhbGxvd2VkKQpwcihiaW5hcnkpCnByKHNreSkKcHIocHJvcGhldCkKcHIoaW5maW5pdGUpCnByKHNoYXR0ZXJlZCkKcHIoZGVlcCkKIyBvdXRwdXQKIiIiCmluZ3Jlc3MgLCAoIDAuMCAsIDAuMCApCmhhbGxvd2VkICwgKCAwLjAgLCA1MC4wICkKYmluYXJ5ICwgKCAxMS4yNiAsIDcxLjA4ICkKc2t5ICwgKCA5OS45NCAsIDEzNy41NiApCnByb3BoZXQgLCAoIDk5Ljk0ICwgNDYuMDcgKQppbmZpbml0ZSAsICggLTYuNzIgLCAxNDUuOTUgKQpzaGF0dGVyZWQgLCAoIC03NS45ICwgMTM0LjQxICkKZGVlcCAsICggLTExMC4wMyAsIDY3LjQzICkKIiIi