init: early test, classes WIP
This commit is contained in:
commit
5461422c6b
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
__pycache__/
|
75
basictypes.py
Normal file
75
basictypes.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# Container classes for points and lines
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
class Point:
|
||||||
|
|
||||||
|
IDX_X = 0
|
||||||
|
IDX_Y = 1
|
||||||
|
|
||||||
|
def __init__(self, x, y):
|
||||||
|
self._x = x
|
||||||
|
self._y = y
|
||||||
|
|
||||||
|
def get_cartesian(self) -> tuple:
|
||||||
|
return self.get_x(), self.get_y()
|
||||||
|
|
||||||
|
def get_polar(self) -> tuple:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_x(self) -> float:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_y(self) -> float:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_r(self) -> float:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_theta(self) -> float:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def apply_polar_shift(self, r, theta) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def apply_cartesian_shift(self, x, y) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class PointWithID(Point):
|
||||||
|
|
||||||
|
IDX_WALLID = 3
|
||||||
|
def __init__(self, x, y, wall_id):
|
||||||
|
super().__init__(x, y)
|
||||||
|
self._wall_id = wall_id
|
||||||
|
|
||||||
|
def get_wallid(self):
|
||||||
|
return self._wall_id
|
||||||
|
|
||||||
|
class Line:
|
||||||
|
|
||||||
|
def __init__(self, p1: PointWithID, p2: PointWithID):
|
||||||
|
self.wall_id = p1.get_wallid()
|
||||||
|
self.__find_slope(p1, p2)
|
||||||
|
v = ValueError()
|
||||||
|
if not self.__matching_wall_ids(p1, p2):
|
||||||
|
raise WallIDMismatch('Wall ID for points do not match')
|
||||||
|
|
||||||
|
def __find_slope(self, p1:PointWithID, p2:PointWithID) -> float:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __matching_wall_ids(self, p1, p2) -> bool:
|
||||||
|
if p1.get_wallid() == p2.get_wallid(): return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
class WallIDMismatch (RuntimeError): ...
|
||||||
|
|
||||||
|
# Helper methods
|
||||||
|
def polar_to_cart(self, r, theta_deg) -> tuple:
|
||||||
|
#print('polar to cart ',r, theta_deg)
|
||||||
|
x = r * math.cos(deg_to_rad(theta_deg))
|
||||||
|
y = r * math.sin(deg_to_rad(theta_deg))
|
||||||
|
return x,y
|
||||||
|
|
||||||
|
def deg_to_rad(theta_deg) -> float:
|
||||||
|
return theta_deg*(math.pi/180)
|
75
mklines.py
Normal file
75
mklines.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# Constructs line equastions from a set of polar cords that represent a room
|
||||||
|
|
||||||
|
# Invoke python mklines.py <filename>
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import sys
|
||||||
|
import math
|
||||||
|
from os.path import exists as file_exists
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
filename = get_filename()
|
||||||
|
if filename == -1: return -1
|
||||||
|
if not file_exists(filename):
|
||||||
|
perr('File does not exist')
|
||||||
|
return -1
|
||||||
|
samples_polar = read_csv(filename, remove_header=True)
|
||||||
|
if not valid_data(samples_polar): # Assumes header is removed
|
||||||
|
perr('Invalid or corrupt samples')
|
||||||
|
return -1
|
||||||
|
x = polarlist_to_cart(samples_polar)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def read_csv(filename: str, remove_header=False) -> list:
|
||||||
|
tmp_data = list()
|
||||||
|
with open(filename, 'r') as csv_file:
|
||||||
|
reader = csv.reader(csv_file)
|
||||||
|
for i, row in enumerate(reader):
|
||||||
|
new_row = list()
|
||||||
|
if remove_header and i == 0: continue
|
||||||
|
for i, val in enumerate(row):
|
||||||
|
if i == 0: new_row.append(val)
|
||||||
|
else: new_row.append(float(val))
|
||||||
|
tmp_data.append(new_row)
|
||||||
|
return tmp_data
|
||||||
|
|
||||||
|
def get_line_eq(point1, point2)-> tuple:
|
||||||
|
m = ((point2[1] - point1[1])/(point2[0] - point1[0]))
|
||||||
|
# y = mx + b
|
||||||
|
# b = y - mx
|
||||||
|
# Using p1 to find b
|
||||||
|
b = point1[1] - (m*point1[0])
|
||||||
|
|
||||||
|
def valid_data(samples:list) -> bool:
|
||||||
|
# Check if we have even number of samples
|
||||||
|
return len(samples) % 2 == 0
|
||||||
|
|
||||||
|
def polarlist_to_cart(polar_points: list):
|
||||||
|
cart_tmp = list()
|
||||||
|
for i, polar_point in enumerate(polar_points, 1):
|
||||||
|
if i % 2 == 0: continue
|
||||||
|
# We can safely use i - 1 here
|
||||||
|
p1 = polar_points[i-1]
|
||||||
|
p2 = polar_points[i]
|
||||||
|
print(p1, p2)
|
||||||
|
p1 = polar_to_cart(p1[0],p1[1])
|
||||||
|
p2 = polar_to_cart(p2[0],p2[1])
|
||||||
|
|
||||||
|
|
||||||
|
def points_to_straight_line():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_filename() -> str:
|
||||||
|
try:
|
||||||
|
filename = sys.argv[1]
|
||||||
|
return filename
|
||||||
|
except IndexError:
|
||||||
|
perr('Provide target file name')
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def perr(msg):
|
||||||
|
print(msg, file=sys.stderr)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
exit(main())
|
14
notes
Normal file
14
notes
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
1 - Generate a set of fixed measurements
|
||||||
|
May also construct a room to overlay output on to visualize possible erros
|
||||||
|
2 - Translate measurements into verticies on a plane.
|
||||||
|
If we only snapshot a straight wall once, a line an infinite line is assumed
|
||||||
|
We need to snap a wall twice to make the line
|
||||||
|
Thus 2 points one with angle 0 other is *x*.
|
||||||
|
Thus we represent a wall with
|
||||||
|
(4, 0)
|
||||||
|
(4.5, 30o)
|
||||||
|
We represent this with
|
||||||
|
(find intercept of 2 lines. i forgot)
|
||||||
|
With another line we can find the intercept as the vertix.
|
||||||
|
If we construct the walls in order it was taken (Not nessesary)
|
||||||
|
3 - Minimize number of times we convert polar to cartesian, since it does lose precision.
|
9
polar_cords.csv
Normal file
9
polar_cords.csv
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
wall id,distance,angle
|
||||||
|
1,2.03855,9.6007
|
||||||
|
1,2.30208,29.683
|
||||||
|
2,2.84987,76.40
|
||||||
|
2,2.85707,104.182
|
||||||
|
3,2.33238,149.036
|
||||||
|
3,2.00997,174.289
|
||||||
|
4,1.7,298.072
|
||||||
|
4,1.68154,243
|
|
0
simulate.py
Normal file
0
simulate.py
Normal file
Loading…
Reference in New Issue
Block a user