I defined in python some shapes with corresponding corner points, for example:
square = [[251, 184],
[22, 192],
[41, 350],
[244, 346]]
triangle = [[250, 181],
[133, 43],
[21, 188]]
pentagon = [[131, 37],
[11, 192],
[37, 354],
[247, 350],
[256, 182]]
Then I use NetworkX to create the graph:
G = nx.DiGraph()
Then I create a node in the graph for each shape:
G.add_node('square', points = square, center = (139, 265))
G.add_node('triangle', points = triangle, center = (139, 135))
G.add_node('pentagon', points = pentagon, center = (138, 223))
Now the problem is, I have to create several edges connecting the two nodes if the condition is met. A condition that satisfies the condition if the center of the form is inside or outside of another form , then create an edge like this:
G.add_edge('triangle', 'pentagon', relation = 'inside')
G.add_edge('triangle', 'square', relation = 'outside')
To do this, I need to go through the nodes , extract centershapes, draw pointsfrom other shapes (NOT yourself, it's useless) and do it pointPolygonTest.
I tried a lot, but did not get any solution. The closest (not very effective) solution I received is the following:
nodes_p=dict([((u),d['points']) for u,d in G.nodes(data=True)])
nodes_c=dict([((u),d['center']) for u,d in G.nodes(data=True)])
for z,c in nodes_c.items():
print z + ' with center', c
for z,p in nodes_p.items():
p_array = np.asarray(p)
if cv2.pointPolygonTest(p_array,c,False)>=0:
print 'inside ' + z
else:
print 'outside ' + z
, , - , (, triangle inside triangle) (, pentagon inside square)
triangle with center (139, 135)
inside triangle
outside square
inside pentagon
square with center (139, 265)
outside triangle
inside square
inside pentagon
pentagon with center (138, 223)
outside triangle
inside square
inside pentagon
? . : , . , script, :
import numpy as np
import networkx as nx
import cv2