Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
a7866e92
Commit
a7866e92
authored
Sep 01, 2026
by
Pries
Browse files
SweepUtilities: Method to calculate new target plane prepared
parent
caf5d65b
Pipeline
#12434
failed with stage
in 2 minutes and 29 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healing/SweepUtilities.java
View file @
a7866e92
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
)
{
...
...
CityDoctorParent/Extensions/CityDoctorHealer/src/main/java/de/hft/stuttgart/citydoctor2/healing/SweepVertex.java
View file @
a7866e92
...
@@ -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
;
}
}
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment