216 lines
4.8 KiB
Python

def pravilna(povezava):
x0, y0, x1, y1 = povezava
# preveri dolzino
prekratka = (abs(x1-x0) + abs(y1-y0)) > 0
# preveri, da je vodoravna ali navpicna in ne diagonalna
diagonalna = (x0 == x1) or (y0 == y1)
return prekratka and diagonalna
def pravilne(povezave):
for i in povezave:
if not pravilna(i):
return False
return True
def urejena(povezava):
x0, y0, x1, y1 = povezava
if x1 < x0 or y1 < y0:
return x1, y1, x0, y0
return povezava
def na_povezavi(x, y, povezava):
x0, y0, x1, y1 = urejena(povezava)
return x0 <= x <= x1 and y0 <= y <= y1
def povezave_tocke(x, y, povezave):
r = set()
for i in povezave:
if na_povezavi(x, y, i):
r.add(urejena(i))
return r
def generiraj_tuples_povezava(povezava):
pov = []
x0, y0, x1, y1 = povezava
if x0 == x1:
z0 = y0
z1 = y1
else:
z0 = x0
z1 = x1
for i in range(z0, z1 + 1):
if x0 == x1:
r = (x0, i)
else:
r = (i, y0)
pov.append(r)
return pov
def secisce(povezava1, povezava2):
if not pravilna(povezava1) and not pravilna(povezava2): return None
pov1 = generiraj_tuples_povezava(urejena(povezava1))
pov2 = generiraj_tuples_povezava(urejena(povezava2))
for i in pov1:
for j in pov2:
if i == j:
return i
return None
def urejeni_povezavi(povezava1, povezava2):
x0_1, y0_1, x1_1, y1_1 = urejena(povezava1)
x0_2, y0_2, x1_2, y1_2 = urejena(povezava2)
if x0_1 < x0_2:
return povezava1, povezava2
elif x0_2 < x0_1:
return povezava2, povezava1
if y0_1 < y0_2:
return povezava1, povezava2
elif y0_2 < y0_1:
return povezava2, povezava1
if x1_1 < x1_2:
return povezava1, povezava2
elif x1_2 < x1_1:
return povezava2, povezava1
if y1_1 < y1_2:
return povezava1, povezava2
elif y1_2 < y1_1:
return povezava2, povezava1
# sigurno ne bosta dve identični povezavi prileteli sem? :D
if x0_1 == x0_2 and y0_1 == y0_2: return None
def krizisca(povezave):
krizisce = {}
for povezava1 in povezave:
povezava1 = urejena(povezava1)
for povezava2 in povezave:
povezava2 = urejena(povezava2)
# nočemo primerjati križišče s samim sabo
if povezava1 == povezava2:
continue
# sortiranje povezav
pov1, pov2 = urejeni_povezavi(povezava1, povezava2)
# preverimo če trenutni povezavi že obstajata v slovarju
if (pov1, pov2) in krizisce:
continue
# preverimo če najdemo sečišče
sec = secisce(pov1, pov2)
# če ga najdemo dodamo vnos v slovar
if sec is not None:
# drugi imeni spr samo zaradi manjša zmede, ker se lahko zamenjata
krizisce[(pov1, pov2)] = sec
return krizisce
def mozna_pot(pot, mreza):
povezave_obstajajo = True
for povezava in pot:
# dobimo urejeno povezavo
pov = urejena(povezava)
obstaja_pot = False
# preverimo če obstaja povezava v mreži
for x,y in mreza.keys():
if pov == x or pov == y:
obstaja_pot = True
break
# če ne obstaja pot takoj zaključi izvajanje
if not obstaja_pot:
return False
# to be continued, preveriti moramo še če se vse povezave stikajo skupaj
def main():
povezave = [
(11, 10, 13, 10),
(2, 12, 8, 12),
(6, 11, 6, 13),
(0, 16, 10, 16),
(3, 18, 3, 13),
(7, 14, 3, 14),
(9, 17, 9, 14),
]
pov = [
(11, 10, 13, 10),
(2, 12, 8, 12),
(6, 11, 6, 13),
(0, 16, 10, 16),
(3, 18, 3, 13),
(7, 14, 3, 14),
(9, 17, 9, 14),
(13, 15, 8, 15),
(12, 14, 12, 17),
(13, 16, 21, 16),
(14, 18, 14, 15),
(13, 15, 13, 16),
(16, 16, 16, 10),
(16, 10, 21, 10),
(14, 18, 10, 18),
(11, 13, 11, 20),
(15, 13, 22, 13),
(17, 15, 17, 17),
(18, 17, 18, 14),
(19, 19, 22, 19),
(20, 15, 20, 17),
(21, 10, 21, 19),
]
mreza = krizisca(pov)
print("Mreža:\n")
for i, j in mreza.items():
print(f"{i}: {j}")
print("\n")
klic = mozna_pot(
[(14, 18, 10, 18),
(14, 18, 14, 15),
(13, 16, 21, 16),
(13, 16, 13, 15),
(8, 15, 13, 15),
(9, 14, 9, 17),
(10, 16, 0, 16),
(9, 14, 9, 17),
(8, 15, 13, 15),
(13, 16, 13, 15)], mreza)
#print(klic)
main()