stud/Karto/assignment4/measure.py
Motiejus Jakštys 4cde8c6e25 formatting
2019-11-30 10:23:18 +02:00

275 lines
8.3 KiB
Python
Executable File

#!/usr/bin/env python3
from collections import namedtuple
from decimal import Decimal as Dec
from math import sin, cos, pi
from shapely.geometry import LineString, asPolygon, Point as sPoint
import numpy as np
"""
Run as follows:
./measure.py | column -t -s $'\t'
"""
class Deg(namedtuple('Deg', ['deg', 'mm', 'ss'])):
def __str__(self):
return "%03d-%02d-%04.1f" % (self.deg, self.mm, self.ss)
def hms(deg):
assert isinstance(deg, Dec)
pdeg, pmm = divmod(deg, 1)
pmm = pmm * Dec(60)
pmm, pss = divmod(pmm, 1)
pss = pss * Dec(60)
return Deg(pdeg, pmm, pss)
def normalize(ang):
while ang > 180:
ang -= 360
while ang <= -180:
ang += 360
return ang
def guess(inp):
if isinstance(inp, str) and '-' in inp:
deg, mm, ss = inp.split('-')
ddeg, dmm, dss = Dec(deg), Dec(mm), Dec(ss)
return ddeg + dmm/60 + dss/3600
else:
return Dec(instr)
class Point(namedtuple('Point', ['acadx', 'acady'])):
@property
def lksx(self):
return self.acady
@property
def lksy(self):
return self.acadx
class Vertex:
def __init__(self, point, length, angle, dirang=Dec(), coords = Point(Dec(), Dec())):
self.point = point
self.len = length
self.ang = angle
self.dirang = dirang
self.coords = coords
self.dx, self.dy = Dec(), Dec()
@property
def xy(self):
"""xy returns a tuple of lksx and lksy coordinates"""
return np.array([float(self.coords.lksx), float(self.coords.lksy)])
def heptagon(d1):
angles = np.linspace(0, 2*pi, num=8)
R = float(D1)/2/sin(pi/7)
heptagon_xy = (np.array([np.cos(angles), np.sin(angles)])*R).T
return asPolygon(heptagon_xy)
juosta = namedtuple('juosta', ['plotis', 'kryptis', 'dashes', 'spalva'])
kelias = namedtuple('kelias', ['virsunes', 'plotis', 'kat', 'dashes', 'spalva', 'juostos'])
# Kategorijos
KAT0, KAT1, KAT2, KAT3, KAT4 = range(5,0,-1)
A = Dec('6.094')
B = Dec('-2.923')
C = Dec('-13.462')
N = Dec('9.512')
L1 = Dec('16.321')
# === Kelias A-05 ===
L2 = Dec('9.109')
L3 = Dec('4.819')
# === Kelias A-08 ===
L4 = Dec('2.675')
L5 = Dec('2.059')
L6 = Dec('1.262')
L7 = Dec('4.170')
L8 = Dec('6.005')
L9 = Dec('6.453')
# === Griovys G-11 ===
L10 = Dec('4.882')
L11 = Dec('3.305')
L12 = Dec('2.210')
L13 = Dec('4.381')
A03_plotis = Dec('17.401') + A
A05_plotis = Dec('13.705') + B
A08_plotis = Dec('29.006') + C
G11_plotis = Dec('14.776') + N
# Directional coords + angle
X11 = Dec('6091968.055')
Y11 = Dec('485944.146')
A11_2 = guess('70-16-17')
vertices = [
# point len angle dirangle coords
Vertex(11, Dec('164.126'), guess('103-03-03'), A11_2, Point(X11, Y11)),
Vertex(2, Dec('149.851'), guess('218-27-42')),
Vertex(19, Dec('82.384' ), guess('211-44-30')),
Vertex(3, Dec('259.022'), guess('67-26-49' )),
Vertex(24, Dec('319.331'), guess('67-33-06' )),
Vertex(12, Dec('74.764' ), guess('279-03-59')),
Vertex(13, Dec('81.640' ), guess('278-54-55')),
Vertex(14, Dec('31.888' ), guess('119-27-45')),
Vertex(15, Dec('84.073' ), guess('160-50-28')),
Vertex(16, Dec('70.072' ), guess('207-42-31')),
Vertex(17, Dec('73.378' ), guess('206-18-01')),
Vertex(10, Dec('66.625' ), guess('90-55-10' )),
Vertex(18, Dec('97.003' ), guess('100-18-10')),
Vertex(9, Dec('121.003'), guess('148-30-56')),
Vertex(8, Dec('131.915'), guess('285-20-57')),
Vertex(23, Dec('102.086'), guess('29-44-22' )),
Vertex(22, Dec('158.324'), guess('276-33-49')),
Vertex(7, Dec('72.157' ), guess('82-07-47' )),
Vertex(6, Dec('107.938'), guess('104-15-46')),
Vertex(21, Dec('104.082'), guess('234-17-37')),
Vertex(5, Dec('154.332'), guess('283-30-57')),
Vertex(20, Dec('68.972' ), guess('152-15-58')),
Vertex(1, Dec('151.531'), guess('101-20-01')),
Vertex(4, Dec('179.336'), guess('150-15-41')),
]
angle_sum = Dec(0)
for v in vertices:
angle_sum += v.ang
theoretical_angle_sum = Dec(int((len(vertices)-2)*180))
for i, v in enumerate(vertices[1:]):
prev = vertices[i]
v.dirang = prev.dirang + 180 - v.ang
v.dx = Dec(float(prev.len) * cos(float(prev.dirang) * pi/180))
v.dy = Dec(float(prev.len) * sin(float(prev.dirang) * pi/180))
v.coords = Point(prev.coords.acadx + v.dx, prev.coords.acady + v.dy)
# 9-kampio krastine D1
D1 = Dec('174.667') + C
# Daugiakampio pasukimo kampas (K1)
K1 = Dec('13.147') + B
# Atstumas iki tikrosios uzliejimo zonos (A1) (0.001 tikslumu)
A1 = Dec('67.536') + B
circle_radius = float(D1)/2/sin(pi/7)-float(A1)
heptagon_area = heptagon(float(D1)).area
circle_area = sPoint(0,0).buffer(circle_radius).area
# Points is vertice map by id
Points = {}
for v in vertices:
Points[v.point] = v
CONTINUOUS = (1,0)
DASHDOTX2 = (10,3,2,3)
DASHED = (100,20)
keliai = {
'A-08': kelias(
virsunes=[1,2,3],
plotis=A08_plotis,
kat=KAT1,
dashes=DASHDOTX2,
spalva='xkcd:red',
juostos=(
juosta(L6+L5+L4, 'right', DASHED, 'xkcd:lightgreen'),
juosta(L6+L5, 'right', DASHED, 'xkcd:lightgreen'),
juosta(L6, 'right', CONTINUOUS, 'xkcd:black'),
juosta(L7, 'left', CONTINUOUS, 'xkcd:black'),
juosta(L7+L8, 'left', DASHED, 'xkcd:lightgreen'),
juosta(L7+L8+L9, 'left', DASHED, 'xkcd:lightgreen'),
),
),
'A-05': kelias(
virsunes=[4,5,6,7,8,9,10],
plotis=A05_plotis,
kat=KAT2,
dashes=DASHDOTX2,
spalva='xkcd:red',
juostos=(
juosta(L3, 'right', CONTINUOUS, 'xkcd:brown'),
juosta(L2, 'left', CONTINUOUS, 'xkcd:brown'),
),
),
'A-03': kelias(
virsunes=[11,12,13,14,15,16,17,18],
plotis=A03_plotis,
kat=KAT3,
dashes=CONTINUOUS,
spalva='xkcd:magenta',
juostos=(
juosta(L1, 'right', DASHED, 'xkcd:magenta'),
juosta(0, 'left', DASHED, 'xkcd:white'),
),
),
'G-11': kelias(
virsunes=[19,20,21,22,23,24],
plotis=G11_plotis,
kat=KAT4,
dashes=CONTINUOUS,
spalva='xkcd:red',
juostos=(
juosta(L10+L11, 'right', CONTINUOUS, 'xkcd:blue'),
juosta(L11, 'right', CONTINUOUS, 'xkcd:lightblue'),
juosta(L12, 'left', CONTINUOUS, 'xkcd:lightblue'),
juosta(L12+L13, 'left', CONTINUOUS, 'xkcd:blue'),
),
),
}
keliu_ilgiai = {}
for id, kelias in keliai.items():
keliu_ilgiai[id] = LineString([Points[i].xy for i in kelias.virsunes]).length
if __name__ == '__main__':
print("tšk. nr.\tišmatuotas kampas\tdirekcinis kampas\tilgis\tdx\tdy\tx\ty")
for i, v in enumerate(vertices):
print("\t".join([
"%d" % v.point,
"%s" % str(hms(v.ang)),
"%s" % str(hms(v.dirang)),
"%.3f" % v.len,
"%.3f" % v.dx,
"%.3f" % v.dy,
"%.3f" % v.coords.acadx,
"%.3f" % v.coords.acady,
]))
"""acad coords for drawing
nxt = vertices[0 if i == len(vertices) - 1 else i+1]
pts = "%d-%d" % (v.point, nxt.point)
draw = "@%.3f<%.4f" % (v.len, normalize(90 - v.dirang))
print("%5s: %19s acadcoords:(%.3f,%.3f)" % \
(pts, draw, v.coords.acadx, v.coords.acady))
"""
("""
Kelio A-03 plotis = 17.401 + A = %.3f""" % A03_plotis + """
Kelio A-05 plotis = 13.705 + B = %.3f""" % A05_plotis + """
Kelio A-08 plotis = 29.006 + C = %.3f""" % A08_plotis + """
Griovio G-11 plotis = 14.776 + N = %.3f""" % G11_plotis + """
Prognozuojamo uzliejimo zona, tai taisyklingas 9-kampis
9-kampio krastine D1 = %.3f""" % D1 + """
Daugiakampio pasukimo kampas (K1) (0.0001 laipsnio tikslumu)
K1 = %.4f""" % K1 + """
Tikroji uzliejimo zona, tai taisyklingas apskritimas, kurio centras TURI SUTAPTI su daugiakampio centru.
Atstumas iki tikrosios uzliejimo zonos (A1) (0.001 tikslumu)
A1 = %.3f""" % A1 + """
A-05:
x(l) = %.3f""" % (A05_plotis*L3/(L2+L3)) + """
x(r) = %.3f""" % (A05_plotis*L2/(L2+L3)) + """
A-08:
x(l) = %.3f""" % (A08_plotis*(L7+L8+L9)/(L7+L8+L9+L6+L5+L4)) + """
x(r) = %.3f""" % (A08_plotis*(L6+L5+L4)/(L7+L8+L9+L6+L5+L4)) + """
G-11:
x(l) = %.3f""" % (G11_plotis*(L12+L13)/(L10+L11+L12+L13)) + """
x(r) = %.3f""" % (G11_plotis*(L10+L11)/(L10+L11+L12+L13)) + """
""")