# Univerzitet u Novom Sadu, Fakultet tehničkih nauka, Novi Sad, Srbija
# Studijski program OAS Informacioni inženjering
# Predmet Metode i tehnike nauke o podacima

# Pomoćni sadržaj


# %% Biblioteke

import numpy as np
import matplotlib.pyplot as plt


# %% Implementacija funkcije pripadnosti

class PripadnostTrapezoidna:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.očitavanje_pripadnosti_vektorski = np.vectorize(
            self.očitavanje_pripadnosti)

    def očitavanje_pripadnosti(self, x):
        if x >= self.a and x <= self.b:
            return (x - self.a) / (self.b - self.a)
        elif x > self.b and x <= self.c:
            return 1.0
        elif x > self.c and x <= self.d:
            return (self.d - x) / (self.d - self.c)
        else:
            return 0.0

def prikazivanje_pripadnosti(x, f):
    print("x = {x: 3.2f}, f(x) = {f: 3.2f}".format(
        x=x, f=f.očitavanje_pripadnosti(x)))


# %% Upotreba funkcije pripadnosti

print("Primer trapezoidne funkcije pripadnosti A")
print("")

funkcija_a = PripadnostTrapezoidna(-2, -1, 1, 2)

for x in [-2, -1.5, -1, 0, 1, 1.5, 2]:
    prikazivanje_pripadnosti(x, funkcija_a)

print("")

x_a = np.arange(-3, 3, 0.1)
y_a = funkcija_a.očitavanje_pripadnosti_vektorski(x_a)
plt.figure()
plt.plot(x_a, y_a)
plt.title("Trapezoidna funkcija pripadnosti A ({a}, {b}, {c}, {d})".
          format(a=funkcija_a.a, b=funkcija_a.b, 
                 c=funkcija_a.c, d=funkcija_a.d))

print("Primer trapezoidne funkcije pripadnosti B")
print("")

funkcija_b = PripadnostTrapezoidna(1, 3, 4, 8)
x_b = np.arange(0, 9, 0.1)
y_b = funkcija_b.očitavanje_pripadnosti_vektorski(x_b)
plt.figure()
plt.plot(x_b, y_b)
plt.title("Trapezoidna funkcija pripadnosti B ({a}, {b}, {c}, {d})".
          format(a=funkcija_b.a, b=funkcija_b.b, 
                 c=funkcija_b.c, d=funkcija_b.d))

