Program za izračun geometrijskih karakteristik poligonalnih prerezov. Izvedba programa z možnostjo vnosa podatkov v različnih zapisih (TXT, XML, JSON, SQLite).

Povezave:

Izvorna koda

geokar.py

#! /usr/bin/env python

import geometrijske_karakteristike as gk
import sys
import collections
import xml.etree.cElementTree as et
import json
import sqlite3


def izpisi_vrednost(naslov, vrednost):
    return "{:>5} = {:.3f}\n".format(naslov, vrednost)


def vnos_podatkov_txt():
    # Vnos podatkov
    dat = open(sys.argv[1], "r")

    n = int(dat.readline())

    x = []
    y = []
    for i in range(n):
        vrstica = dat.readline()
        besede = vrstica.split()
        x.append(float(besede[0]))
        y.append(float(besede[1]))

    x.append(x[0])
    y.append(y[0])

    dat.close()

    return n, x, y


def vnos_podatkov_xml():
    # Vnos podatkov
    xml_tree = et.parse(sys.argv[1])

    xml_prerez = xml_tree.getroot()
    xml_tocke = xml_prerez.find("tocke")
    xml_tocke_seznam = xml_tocke.findall("tocka")

    n = len(xml_tocke_seznam)
    x = []
    y = []

    for xml_tocka in xml_tocke_seznam:
        tocka_id = int(xml_tocka.get("id"))
        tocka_x = float(xml_tocka.find("x").text)
        tocka_y = float(xml_tocka.find("y").text)
        x.insert(tocka_id - 1, tocka_x)
        y.insert(tocka_id - 1, tocka_y)

    x.append(x[0])
    y.append(y[0])

    return n, x, y


def vnos_podatkov_json():
    # Vnos podatkov
    with open(sys.argv[1], "r") as dat:
        data = json.load(dat)

    n = data["n"]
    x = data["x"]
    y = data["y"]

    x.append(x[0])
    y.append(y[0])

    return n, x, y


def vnos_podatkov_sqlite():
    db = sqlite3.connect(sys.argv[1])
    cursor = db.cursor()
    cursor.execute("SELECT * FROM tocke")
    tocke = cursor.fetchall()

    db.close()

    n = len(tocke)
    x = []
    y = []

    for tocka in tocke:
        x.insert(tocka[0] - 1, float(tocka[1]))
        y.insert(tocka[0] - 1, float(tocka[2]))

    x.append(x[0])
    y.append(y[0])

    return n, x, y


def izracun(n, x, y):
    vrednosti = collections.OrderedDict()
    vrednosti["Ax"] = gk.Ax(n, x, y)
    vrednosti["Sx"] = gk.Sx(n, x, y)
    vrednosti["Sy"] = gk.Sy(n, x, y)
    vrednosti["Iy"] = gk.Iy(n, x, y)
    vrednosti["Ixy"] = gk.Ixy(n, x, y)
    vrednosti["xt"] = gk.xt(n, x, y)
    vrednosti["yt"] = gk.yt(n, x, y)
    vrednosti["Ixt"] = gk.Ixt(n, x, y)
    vrednosti["Iyt"] = gk.Iyt(n, x, y)
    vrednosti["Ixyt"] = gk.Ixyt(n, x, y)
    return vrednosti

def izpis(vrednosti):
    s = ""
    for k in vrednosti:
        s = s + izpisi_vrednost(k, vrednosti[k])

    izpis_na_zaslon(s)
    izpis_v_datoteko(s)


def izpis_na_zaslon(s):
    print(s)


def izpis_v_datoteko(s):
    dat = open(sys.argv[2], "w")
    dat.write(s)
    dat.close()


def main():
    # Vnos podatkov
    print("Vnos podatkov ...")

    vnos = {"txt": vnos_podatkov_txt, "xml": vnos_podatkov_xml, "json": vnos_podatkov_json, "sqlite": vnos_podatkov_sqlite}
    fin = sys.argv[1]
    ext = fin[fin.rfind(".") + 1:]

    if ext not in vnos:
        print("Napaka: Neznan zapis podatkov")
        return

    n, x, y = vnos[ext]()

    # Izračun količin
    print("Izračun ...")
    vrednosti = izracun(n, x, y)

    # Izpis rezultatov
    print("Izpis ...")
    izpis(vrednosti)


if __name__ == "__main__": main()

geometrijske_karakteristike.py

#! /usr/bin/env python

# Funkcije za izračun geometrijskih karakteristik

def Ax(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (x[i+1] + x[i]) * (y[i+1] - y[i])

    return 0.5 * v

def Sx(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (x[i+1] - x[i]) * (y[i+1]**2 + y[i] * y[i+1] + y[i]**2)

    return -1. / 6. * v

def Sy(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (y[i+1] - y[i]) * (x[i+1]**2 + x[i] * x[i+1] + x[i]**2)

    return 1. / 6. * v

def Ix(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (x[i+1] - x[i]) * (y[i+1]**3 +  y[i+1]**2 * y[i] + y[i+1] * y[i]**2 + y[i]**3)

    return -1. / 12. * v

def Iy(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (y[i+1] - y[i]) * (x[i+1]**3 +  x[i+1]**2 * x[i] + x[i+1] * x[i]**2 + x[i]**3)

    return 1. / 12. * v

def Ixy(n, x, y):
    v = 0.0
    for i in range(n):
        v = v + (y[i+1] - y[i]) * (y[i+1] * (3* x[i+1]**2 + 2 * x[i] * x[i+1] + x[i]**2) + y[i] * (3 * x[i]**2 + 2 * x[i] * x[i+1] + x[i+1]**2))

    return -1. / 24. * v

def xt(n, x, y):
    return Sy(n, x, y) / Ax(n, x, y)

def yt(n, x, y):
    return Sx(n, x, y) / Ax(n, x, y)

def Ixt(n, x, y):
    return Ix(n, x, y) - yt(n, x, y)**2 * Ax(n, x, y)

def Iyt(n, x, y):
    return Iy(n, x, y) - xt(n, x, y)**2 * Ax(n, x, y)

def Ixyt(n, x, y):
    return Ixy(n, x, y) + xt(n, x, y) * yt(n, x, y) * Ax(n, x, y)

Podatki in rezultati

primer-1.txt

4
0 0
1 0
1 1
0 1

primer-1.xml

<?xml version="1.0" encoding="UTF-8"?>
<prerez>
  <tocke>
    <tocka id="1">
      <x>0.0</x>
      <y>0.0</y>
    </tocka>
    <tocka id="2">
      <x>1.0</x>
      <y>0.0</y>
    </tocka>
    <tocka id="3">
      <x>1.0</x>
      <y>1.0</y>
    </tocka>
    <tocka id="4">
      <x>0.0</x>
      <y>1.0</y>
    </tocka>
  </tocke>
</prerez>

primer-1.json

{
  "n": 4,
  "x": [
    0,
    1,
    1,
    0
  ],
  "y": [
    0,
    0,
    1,
    1
  ]
}

primer-1-rez.txt

   Ax = 1.000
   Sx = 0.500
   Sy = 0.500
   Ix = 0.333
   Iy = 0.333
  Ixy = -0.250
   xt = 0.500
   yt = 0.500
  Ixt = 0.083
  Iyt = 0.083
 Ixyt = 0.000