01.04.2020
[17:19 Uhr]
Heute gab es endlich mal einen Geistesblitz, der erklärt, warum die Scutoid-Analyse nicht funktioniert. Nach ich einen kurzen Test mit einem manuell geschriebenen Datensatz durchgeführt habe, stellte sich meine Vermutung als richtig heraus - den Fehler erörter ich im Folgenden, aber erstmal kurz zu dem System, mit dem ein Scutoid erkannt wird.
Scutoids können über ihre charakteristische Dreiecksfläche identifiziert werden (im folgenden Bild gut zu sehen). Eine Eigenschaft dieser Fläche ist es, dass sie im Gegensatz zu den restlichen Seiten NICHT beiden Deckflächen miteinander verbindet, sondern nur an die eine angeschlossen ist. Bei einer unbekannten Zelle mit unbekannter Orientierung muss somit jedes mögliche Flächenpaar auf Deckflächeneingenschaft getestet werden (dürfen sich nicht berühren und müssen durch fast alle Seitenflächen miteinander verbunden sein).
Der Fehler, der sich ursprünglich in mein „Analyse-Tool“ geschlichen hatte, ist dieser: Es werden zwei Deckflächen ausgewählt und dann getestet, ob alle anderen Flächen bis auf eine diese miteinander verbinden. Ich hatte bisher aber nicht ausgeschlossen, dass hierbei erneut die Deckflächen gewählt werden. Da diese Deckfläche beim Test nur mit einer der beiden Deckflächen mindestens eine gemeinsame Kante aufweist, wird sie als Dreiecksfläche angesehen. Deshalb wurden echte Scutoids bisher nicht erkannt, da beide Deckflächen + echte Dreiecksfläche gezählt wurden, und somit das Scutoid laut Test insgesamt 3 Dreiecksflächen besaß.
Diese Fälle ließen sich durch ein einfaches if-Statement in der Analyse-Methode ausmerzen und somit werden nun die entstehenden Scutoids im fertigen Diagramm korrekt in blau eingefärbt.
(Die hier erörterte, finale Methode)
def ScutoidTest(faces): # Diese Funktion testet, ob ein Meshobjekt ein Scutoid ist oder nicht. Hierzu bekommt es eine Liste aller # faces übermittelt und testet, ob es eine Kombination aus zwei Flächen gibt (diese beiden dürfen sich nicht berühren, # sind die Deckflächen des "Prismas"), an die jeweils jede andere Fläche anschließt # (bis auf eine Fläche, diese ist die Dreiecksfläche) # das kleinstmöglichste Scutoid hat eine Dreiecksgrundgläche und eine Vierecksgrundfläche # und hätte somit 6 Außenflächen. Zellen mit weniger Flächen können also automatisch keine Scutoids sein # und müssen nicht weiter untersucht werden if (len(faces) < 6): return False for a in range(0, len(faces)): for b in range(a+1, len(faces)): print(a, b) scutellum = 0 if not (grenzenFlächenAneinander(faces[a], faces[b])): for g in faces: # # # (diese nachfolgende Zeile musste eingefügt werdem) if (g != faces[a] and g != faces[b]): if not (grenzenFlächenAneinander(g, faces[a]) == True and grenzenFlächenAneinander(g, faces[b]) == True): scutellum = scutellum + 1 print(" Scutellum Anzahl : ", scutellum) if (scutellum == 1): return True return False