Outline_Embedding_2 / utils /edge_features.py
LuyangZ's picture
Upload 34 files
e760df8 verified
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