Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import math | |
| import shapely | |
| from shapely.geometry import LineString | |
| import torch | |
| from torch_geometric.utils import to_undirected, remove_self_loops | |
| from torch_geometric.data import Data | |
| def segments(polyline): | |
| return list(map(LineString, zip(polyline.coords[:-1], polyline.coords[1:]))) | |
| def edge_graph(apa_line, apa_wall): | |
| wall_seg = segments(apa_line) | |
| num_seg = len(wall_seg) | |
| edge_lst = [] | |
| for l in range(num_seg): | |
| seg = wall_seg[l] | |
| seg_length = seg.length | |
| seg_pro = apa_wall[l] | |
| south_cos = wall_segment_cosine("south", seg) | |
| east_cos = wall_segment_cosine("east", seg) | |
| north_cos = wall_segment_cosine("north", seg) | |
| west_cos = wall_segment_cosine("west", seg) | |
| if south_cos < 0: | |
| south_cos = 0 | |
| if east_cos < 0: | |
| east_cos = 0 | |
| if north_cos < 0: | |
| north_cos = 0 | |
| if west_cos < 0: | |
| west_cos = 0 | |
| if seg_pro == "I": | |
| south_cos = 0 | |
| east_cos = 0 | |
| north_cos = 0 | |
| west_cos = 0 | |
| if seg_pro == "O": | |
| seg_boo = 1 | |
| else: | |
| seg_boo = 0 | |
| edge = [seg_boo, seg_length, south_cos, north_cos, west_cos, east_cos] | |
| edge_lst.append(edge) | |
| ms_lst = [] | |
| me_lst = [] | |
| for k in range(num_seg): | |
| if k == (num_seg - 1): | |
| ms = k | |
| me = 0 | |
| else: | |
| ms = k | |
| me = k+1 | |
| ms_lst.append(ms) | |
| me_lst.append(me) | |
| mse = [ms_lst, me_lst] | |
| datasets = [] | |
| for i in range(2): | |
| node_features = torch.FloatTensor(edge_lst) | |
| x = node_features | |
| edge_index = torch.tensor(mse, dtype=torch.long) | |
| edge_index, _ = remove_self_loops(edge_index) | |
| edge_index = to_undirected(edge_index=edge_index) | |
| data = Data(x=x, edge_index=edge_index) | |
| datasets.append(data) | |
| return datasets | |
| def wall_segment_cosine(direction, apa_line_seg): | |
| seg_s = list(apa_line_seg.coords)[0] | |
| seg_e = list(apa_line_seg.coords)[1] | |
| normal_x = seg_e[0] - seg_s[0] | |
| normal_y = seg_e[1] - seg_s[1] | |
| normal_s = (-normal_y, normal_x) | |
| normal_e = (normal_y, -normal_x) | |
| o = np.array([-normal_y, normal_x]) | |
| w = np.array([normal_y, -normal_x]) | |
| if direction == "south": | |
| d = np.array([-normal_y, normal_x-1]) | |
| if direction == "east": | |
| d = np.array([-normal_y+1, normal_x]) | |
| if direction == "north": | |
| d = np.array([-normal_y, normal_x+1]) | |
| if direction == "west": | |
| d = np.array([-normal_y-1, normal_x]) | |
| od = d - o | |
| ow = w - o | |
| cosine = np.dot(od, ow) / (np.linalg.norm(od) * np.linalg.norm(ow)) | |
| return cosine | |