Schleife durch die Knoten und Attribute extrahieren in Networkx

Ich in python definiert einige Formen mit den entsprechenden Eckpunkte, wie diese:

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]]

Dann nutze ich NetworkX-Paket um ein Diagramm zu erstellen:

G = nx.DiGraph()

Dann erstelle ich einen Knoten im Diagramm für jede Form:

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))

Nun ist das problem, ich haben Sie einige Kanten verbinden zwei Knoten, wenn eine Bedingung erfüllt ist. Die Bedingung zu erfüllen, ist wenn das Zentrum einer Form ist, die innerhalb oder außerhalb einer anderen Form, dann erstellen Sie einen Rand wie diese:

G.add_edge('triangle', 'pentagon', relation = 'inside')
G.add_edge('triangle', 'square', relation = 'outside')

Dazu habe ich eine Schleife über das Knoten, extrahieren Sie die center einer Form, extrahieren Sie die points des andere Formen (NICHT selbst, es ist nutzlos) und machen die pointPolygonTest.

Ich versuche schon Recht viel, aber nicht kam mit einer Lösung. Die nächsten (nicht wirklich effektiv) Lösung, die ich habe ist dieses:

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
            #create edge
        else:
            print 'outside ' + z
            #create edge

Dieser gibt mir folgende Ausgabe, das ist nicht optimal, weil es eine Beziehung, die hätte vermieden werden können (wie triangle inside triangle) oder falsche Beziehungen (wie 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

Wie kann ich dieses problem lösen? Jede Anregung ist apreciated. Zur Erinnerung: das Hauptproblem ist, wie eine Schleife durch die Knoten, und extrahieren Sie die info. Die Pakete, die ich importieren, die für das gesamte Skript sind:

import numpy as np
import networkx as nx
import cv2
  • Sie sollten wahrscheinlich hinzufügen Ihre import-Anweisungen (numpy und cv2) zu helfen, die künftigen Leser
Schreibe einen Kommentar