View difference between Paste ID: k1zgzVLD and XYdrb2cw
SHOW: | | - or go back to the newest paste.
1-
event = require("event")
1+
event = require("event")
2-
os = require("os")
2+
os = require("os")
3-
io = require("io")
3+
io = require("io")
4-
4+
5-
dist = {} -- ra, rb, rc
5+
dist = {} -- ra, rb, rc
6-
6+
7-
satellite_positions = {
7+
satellite_positions = {
8-
  ["663ae55c"]= {532, -742}, -- xa, ya
8+
  ["663ae55c"]= {532, -742}, -- xa, ya
9-
  ["3ea5849e"]= {533, -731}, -- xb, yb
9+
  ["3ea5849e"]= {533, -731}, -- xb, yb
10-
  ["f4960e56"]= {540, -732}  -- xc, yc
10+
  ["f4960e56"]= {540, -732}  -- xc, yc
11-
}
11+
}
12-
12+
13-
function get_position(address)
13+
function get_position(address)
14-
  for k, v in pairs(satellite_positions) do
14+
  for k, v in pairs(satellite_positions) do
15-
    start_pos, end_pos = string.find(address, k, 0, 1)
15+
    start_pos, end_pos = string.find(address, k, 0, 1)
16-
    if start_pos ~= nil and end_pos ~= nil then
16+
    if start_pos ~= nil and end_pos ~= nil then
17-
      return v
17+
      return v
18-
    end
18+
    end
19-
  end
19+
  end
20
end
21-
21+
22-
22+
23-
function print_dict(d)
23+
function print_dict(d)
24-
  for k, v in pairs(d) do
24+
  for k, v in pairs(d) do
25-
    io.write(k)
25+
    io.write(k)
26-
    io.write(" ")
26+
    io.write(" ")
27-
    io.write(v)
27+
    io.write(v)
28-
    io.write(" ")
28+
    io.write(" ")
29-
  end
29+
  end
30-
  io.write("\n")
30+
  io.write("\n")
31
end
32-
32+
33-
function update_distance(code, address, side, old, new)
33+
function update_distance(code, address, side, old, new)
34-
  distance = 0
34+
  distance = 0
35-
  if old == 0 and new == 15 then
35+
  if old == 0 and new == 15 then
36-
    distance = (side+1) * 3
36+
    distance = (side+1) * 3
37-
  elseif old == 15 and new == 0 then
37+
  elseif old == 15 and new == 0 then
38-
    distance = side * 3
38+
    distance = side * 3
39-
  end
39+
  end
40-
  
40+
  
41-
  dist[address] = distance
41+
  dist[address] = distance
42-
  pos_approx = calculate_position()
42+
  pos_approx = calculate_position()
43-
  io.write("\r")
43+
  io.write("\r")
44-
  io.write(pos_approx.x)
44+
  io.write(pos_approx.x)
45-
  io.write(" ")
45+
  io.write(" ")
46-
  io.write(pos_approx.y)
46+
  io.write(pos_approx.y)
47-
47+
48
end
49-
49+
50-
function calculate_position()
50+
function calculate_position()
51-
  tower_info = {}
51+
  tower_info = {}
52-
  
52+
  
53-
  tower_order = {
53+
  tower_order = {
54-
    "663ae55c-7911-4c2f-8459-7b266bb2424c",
54+
    "663ae55c-7911-4c2f-8459-7b266bb2424c",
55-
    "3ea5849e-8ff7-44c2-878b-dd99dcc0de0e",
55+
    "3ea5849e-8ff7-44c2-878b-dd99dcc0de0e",
56-
    "f4960e56-4b89-4957-a460-c8f7c23d11b5"
56+
    "f4960e56-4b89-4957-a460-c8f7c23d11b5"
57-
  }
57+
  }
58-
58+
59-
59+
60-
  for i, v in ipairs(tower_order) do
60+
  for i, v in ipairs(tower_order) do
61-
    if dist[v] == nil then
61+
    if dist[v] == nil then
62-
      return
62+
      return
63-
    end
63+
    end
64-
    tower_info[i] = {tower_id = v, tower_pos = get_position(v), distance = dist[v]}
64+
    tower_info[i] = {tower_id = v, tower_pos = get_position(v), distance = dist[v]}
65-
  end
65+
  end
66-
66+
67-
  ax1 = tower_info[1].tower_pos[1] - tower_info[1].distance  -- ax1
67+
  ax1 = tower_info[1].tower_pos[1] - tower_info[1].distance  -- ax1
68-
  ax2 = tower_info[1].tower_pos[1] + tower_info[1].distance  -- ax2
68+
  ax2 = tower_info[1].tower_pos[1] + tower_info[1].distance  -- ax2
69-
  ay1 = tower_info[1].tower_pos[2] - tower_info[1].distance  -- ay1
69+
  ay1 = tower_info[1].tower_pos[2] - tower_info[1].distance  -- ay1
70-
  ay2 = tower_info[1].tower_pos[2] + tower_info[1].distance  -- ay2
70+
  ay2 = tower_info[1].tower_pos[2] + tower_info[1].distance  -- ay2
71-
  bx1 = tower_info[2].tower_pos[1] - tower_info[2].distance  -- bx1
71+
  bx1 = tower_info[2].tower_pos[1] - tower_info[2].distance  -- bx1
72-
  bx2 = tower_info[2].tower_pos[1] + tower_info[2].distance  -- bx2
72+
  bx2 = tower_info[2].tower_pos[1] + tower_info[2].distance  -- bx2
73-
  by1 = tower_info[2].tower_pos[2] - tower_info[2].distance  -- by1
73+
  by1 = tower_info[2].tower_pos[2] - tower_info[2].distance  -- by1
74-
  by2 = tower_info[2].tower_pos[2] + tower_info[2].distance  -- by2
74+
  by2 = tower_info[2].tower_pos[2] + tower_info[2].distance  -- by2
75-
  cx1 = tower_info[3].tower_pos[1] - tower_info[3].distance  -- cx1
75+
  cx1 = tower_info[3].tower_pos[1] - tower_info[3].distance  -- cx1
76-
  cx2 = tower_info[3].tower_pos[1] + tower_info[3].distance  -- cx2
76+
  cx2 = tower_info[3].tower_pos[1] + tower_info[3].distance  -- cx2
77-
  cy1 = tower_info[3].tower_pos[2] - tower_info[3].distance  -- cy1
77+
  cy1 = tower_info[3].tower_pos[2] - tower_info[3].distance  -- cy1
78-
  cy2 = tower_info[3].tower_pos[2] + tower_info[3].distance  -- cy2
78+
  cy2 = tower_info[3].tower_pos[2] + tower_info[3].distance  -- cy2
79-
79+
80-
  metrics = {
80+
  metrics = {
81-
    {diff = (ax1 - bx1), val = (ax1 + bx1)/2},
81+
    {diff = (ax1 - bx1), val = (ax1 + bx1)/2},
82-
    {diff = (ax1 - bx2), val = (ax1 + bx2)/2},
82+
    {diff = (ax1 - bx2), val = (ax1 + bx2)/2},
83-
    {diff = (ax2 - bx1), val = (ax2 + bx1)/2},
83+
    {diff = (ax2 - bx1), val = (ax2 + bx1)/2},
84-
    {diff = (ax2 - bx2), val = (ax2 + bx2)/2},
84+
    {diff = (ax2 - bx2), val = (ax2 + bx2)/2},
85-
    {diff = (ay1 - by1), val = (ay1 + by1)/2},
85+
    {diff = (ay1 - by1), val = (ay1 + by1)/2},
86-
    {diff = (ay1 - by2), val = (ay1 + by2)/2},
86+
    {diff = (ay1 - by2), val = (ay1 + by2)/2},
87-
    {diff = (ay2 - by1), val = (ay2 + by1)/2},
87+
    {diff = (ay2 - by1), val = (ay2 + by1)/2},
88-
    {diff = (ay2 - by2), val = (ay2 + by2)/2}
88+
    {diff = (ay2 - by2), val = (ay2 + by2)/2}
89-
  }
89+
  }
90-
  t1t2_dx = math.abs(tower_info[1].tower_pos[1] - tower_info[2].tower_pos[1])
90+
  t1t2_dx = math.abs(tower_info[1].tower_pos[1] - tower_info[2].tower_pos[1])
91-
  t1t2_dy = math.abs(tower_info[1].tower_pos[2] - tower_info[2].tower_pos[2])
91+
  t1t2_dy = math.abs(tower_info[1].tower_pos[2] - tower_info[2].tower_pos[2])
92-
  prefer_x = t1t2_dx > t1t2_dy
92+
  prefer_x = t1t2_dx > t1t2_dy
93-
  -- print(prefer_x and "prefer" or "don't prefer")
93+
  -- print(prefer_x and "prefer" or "don't prefer")
94-
  -- print(tower_info[1].tower_id)
94+
  -- print(tower_info[1].tower_id)
95-
  best_reading = 0
95+
  best_reading = 0
96-
  for k, v in ipairs(metrics) do
96+
  for k, v in ipairs(metrics) do
97-
    if k <= 4 and prefer_x then
97+
    if k <= 4 and prefer_x then
98-
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics[best_reading].diff) then
98+
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics[best_reading].diff) then
99-
        best_reading = k
99+
        best_reading = k
100-
      end
100+
      end
101-
    elseif k > 4 and (not prefer_x) then
101+
    elseif k > 4 and (not prefer_x) then
102-
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics[best_reading].diff) then
102+
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics[best_reading].diff) then
103-
        best_reading = k
103+
        best_reading = k
104-
      end
104+
      end
105-
    end
105+
    end
106-
  end
106+
  end
107-
  measurement_precision_1 = math.abs(metrics[best_reading].diff)
107+
  measurement_precision_1 = math.abs(metrics[best_reading].diff)
108-
  estimated_position_1 = metrics[best_reading].val
108+
  estimated_position_1 = metrics[best_reading].val
109-
109+
110-
  metrics2 = {
110+
  metrics2 = {
111-
    {diff = (ax1 - cx1), val = (ax1 + cx1)/2},
111+
    {diff = (ax1 - cx1), val = (ax1 + cx1)/2},
112-
    {diff = (ax1 - cx2), val = (ax1 + cx2)/2},
112+
    {diff = (ax1 - cx2), val = (ax1 + cx2)/2},
113-
    {diff = (ax2 - cx1), val = (ax2 + cx1)/2},
113+
    {diff = (ax2 - cx1), val = (ax2 + cx1)/2},
114-
    {diff = (ax2 - cx2), val = (ax2 + cx2)/2},
114+
    {diff = (ax2 - cx2), val = (ax2 + cx2)/2},
115-
    {diff = (ay1 - cy1), val = (ay1 + cy1)/2},
115+
    {diff = (ay1 - cy1), val = (ay1 + cy1)/2},
116-
    {diff = (ay1 - cy2), val = (ay1 + cy2)/2},
116+
    {diff = (ay1 - cy2), val = (ay1 + cy2)/2},
117-
    {diff = (ay2 - cy1), val = (ay2 + cy1)/2},
117+
    {diff = (ay2 - cy1), val = (ay2 + cy1)/2},
118-
    {diff = (ay2 - cy2), val = (ay2 + cy2)/2}
118+
    {diff = (ay2 - cy2), val = (ay2 + cy2)/2}
119-
  }
119+
  }
120-
  best_reading = 0
120+
  best_reading = 0
121-
121+
122-
  for k, v in ipairs(metrics2) do
122+
  for k, v in ipairs(metrics2) do
123-
    if k > 4 and prefer_x then
123+
    if k > 4 and prefer_x then
124-
      -- previous best reading was looking for x, now look for y
124+
      -- previous best reading was looking for x, now look for y
125-
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics2[best_reading].diff) then
125+
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics2[best_reading].diff) then
126-
        best_reading = k
126+
        best_reading = k
127-
      end
127+
      end
128-
    elseif k <= 4 and (not prefer_x) then
128+
    elseif k <= 4 and (not prefer_x) then
129-
      -- previous best reading was looking for y, now look for x
129+
      -- previous best reading was looking for y, now look for x
130-
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics2[best_reading].diff) then
130+
      if best_reading == 0 or math.abs(v.diff) < math.abs(metrics2[best_reading].diff) then
131-
        best_reading = k
131+
        best_reading = k
132-
      end
132+
      end
133-
    end
133+
    end
134-
  end
134+
  end
135-
  measurement_precision_2 = math.abs(metrics2[best_reading].diff)
135+
  measurement_precision_2 = math.abs(metrics2[best_reading].diff)
136-
  estimated_position_2 = metrics2[best_reading].val
136+
  estimated_position_2 = metrics2[best_reading].val
137-
  if prefer_x then
137+
  if prefer_x then
138-
    -- x first
138+
    -- x first
139-
    return {x=estimated_position_1, y=estimated_position_2}
139+
    return {x=estimated_position_1, y=estimated_position_2}
140-
  else
140+
  else
141-
    -- y first
141+
    -- y first
142-
    return {x=estimated_position_2, y=estimated_position_1}
142+
    return {x=estimated_position_2, y=estimated_position_1}
143-
  end
143+
  end
144
end
145-
145+
146-
event.listen("redstone_changed", update_distance)
146+
event.listen("redstone_changed", update_distance)
147-
while 1 do
147+
while 1 do
148-
  os.sleep(1)
148+
  os.sleep(1)
149
end