Commit a7866e92 authored by Pries's avatar Pries
Browse files

SweepUtilities: Method to calculate new target plane prepared

parent caf5d65b
Pipeline #12434 failed with stage
in 2 minutes and 29 seconds
package de.hft.stuttgart.citydoctor2.healing; package de.hft.stuttgart.citydoctor2.healing;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError; import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError;
import de.hft.stuttgart.citydoctor2.datastructure.Edge;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
...@@ -57,9 +59,19 @@ public class SweepUtilities { ...@@ -57,9 +59,19 @@ public class SweepUtilities {
for (SweepVertex v : sweepVertices) { for (SweepVertex v : sweepVertices) {
v.collectOutgoingEdges(errorPolygon, minSweepEdgeLength); v.collectOutgoingEdges(errorPolygon, minSweepEdgeLength);
v.initStatus(targetPlane, pointOnPlaneTolerance); v.initStatus(targetPlane, pointOnPlaneTolerance, true);
} }
if ( isMultiVertexStatus() ) {
calcNewTargetPlane();
// Mit der neuen Zielebene nochmals Status ermitteln
// Jetzt erhalten Multi-Knoten aber den Status ERROR
for (SweepVertex v : sweepVertices) {
v.initStatus(targetPlane, pointOnPlaneTolerance, false);
}
}
} }
public boolean calculate() { public boolean calculate() {
...@@ -72,19 +84,6 @@ public class SweepUtilities { ...@@ -72,19 +84,6 @@ public class SweepUtilities {
return false; return false;
} }
//todo spaeter: Anzahl der Ecken mit mehr als einer outging Edge zaehlen
// Wenn es alle diese Ecken auf der Zielebene liegen --> weiter
// Wenn es maximal drei solche Ecken gibt: Zielebene neu berechnen
// Wenn es mehr als drei solche Ecken gibt: diese Ecken bekommen den ERROR-Status,
// hasErrorStatus() verhindert danach das Heilen.
/*
// If there is a new target plane, new initialization of status is necessary:
for (SweepVertex v : verts) {
v.initStatus(targetPlane, pointOnPlaneTolerance);
}
*/
for (SweepVertex v : sweepVertices) { for (SweepVertex v : sweepVertices) {
v.calculateNewPoint(targetPlane, errorPolygon, minSweepEdgeLength, minLinePlaneAngle); v.calculateNewPoint(targetPlane, errorPolygon, minSweepEdgeLength, minLinePlaneAngle);
} }
...@@ -137,6 +136,50 @@ public class SweepUtilities { ...@@ -137,6 +136,50 @@ public class SweepUtilities {
return false; return false;
} }
private boolean isMultiVertexStatus() {
for (SweepVertex v : sweepVertices) {
SweepVertexStatus status = v.getStatus();
if (status == SweepVertexStatus.MULTI) {
return true;
}
}
return false;
}
public void calcNewTargetPlane() {
//todo:
List<SweepVertex> multiVerts = new LinkedList<>();
// SweepVertices mit mehr als einer outgoing Edge in multiVerts-Liste sammeln,
// im Unterschied zu initStatus unabhaengig davon, ob sie auf der alten Zielebene liegen
Plane newTargetPlane = null;
if ( multiVerts.size() == 0 ) {
return; //kann eigentlich nicht passieren
}
else if ( multiVerts.size() == 1 ) {
//newTargetPlane = new Plane(Normale der alten Zielebene, multiVerts[0].getVertex())
}
else if ( multiVerts.size() == 2 ) {
// Normale entspr. Diss. von Raul berechnen
//newTargetPlane = new Plane(neue Normale, multiVerts[0].getVertex())
}
else if ( multiVerts.size() == 3 ) {
// Wenn die drei Multi-Knoten auf einer Geraden liegen, siehe Fall ==2
// Ansonsten
// Normale einer Ebene durch die drei Punkte berechnen
//newTargetPlane = new Plane(neue Normale, multiVerts[0].getVertex())
}
else {
// Ausgleichsebene zur Liste der Multi-Knoten berechnen
// mit Methode von Matthias
}
if ( newTargetPlane != null )
targetPlane = newTargetPlane;
}
private int countSweepVertices(Polygon p) { private int countSweepVertices(Polygon p) {
......
...@@ -18,6 +18,7 @@ enum SweepVertexStatus { ...@@ -18,6 +18,7 @@ enum SweepVertexStatus {
ON_PLANE, ON_PLANE,
SWEEP, SWEEP,
PROJECT, PROJECT,
MULTI,
ERROR ERROR
} }
...@@ -71,7 +72,7 @@ public class SweepVertex { ...@@ -71,7 +72,7 @@ public class SweepVertex {
} }
} }
public void initStatus (Plane targetPlane, double pointOnPlaneTolerance) { public void initStatus (Plane targetPlane, double pointOnPlaneTolerance, boolean bWithMulti) {
if (targetPlane == null) { if (targetPlane == null) {
status = SweepVertexStatus.ERROR; status = SweepVertexStatus.ERROR;
...@@ -84,35 +85,13 @@ public class SweepVertex { ...@@ -84,35 +85,13 @@ public class SweepVertex {
else if ( outgoingEdges.size() == 0 ) { else if ( outgoingEdges.size() == 0 ) {
status = SweepVertexStatus.PROJECT; status = SweepVertexStatus.PROJECT;
} }
/* else if ( outgoingEdges.size() == 1 ) {
* todo spaeter:
* else {
* status = SweepVertexStatus.SWEEP;
* }
*
* zunaechst Ecken mit mehr als einer outgoing Edge nicht beruecksichtigen:
*/
else if ( outgoingEdges.size() == 1 )
status = SweepVertexStatus.SWEEP; status = SweepVertexStatus.SWEEP;
}
else if ( bWithMulti && outgoingEdges.size() > 1 ) {
status = SweepVertexStatus.MULTI;
}
else { else {
/*
* Fall 3 nach Piepereit:
* Mehr als eine abführende Kante darf später nicht pauschal fehlschlagen.
* Zuerst müssen die abführenden Kanten nach Sweep-Richtung klassifiziert
* werden: negativ bedeutet, die Kante würde verkürzt; positiv bedeutet, die
* Kante würde verlängert.
*
* Geplante Aufteilung:
* - nur negative Kanten: Split-Cut, Vertex vervielfältigen und Kanten auf
* die Kopien verteilen.
* - nur positive Kanten: Split-Pull, Vertex duplizieren und eine neue Kante
* entlang der Schnittgeraden zweier Nachbarflächen einfügen.
* - gemischt: positive und negative Kanten auf Original/Duplikat trennen und
* danach erneut als Fall 2, Fall 3.1 oder Fall 3.2 behandeln.
*
* Bis diese Topologieoperationen implementiert sind, bleibt Fall 3 bewusst
* ERROR.
*/
status = SweepVertexStatus.ERROR; status = SweepVertexStatus.ERROR;
} }
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment