[Wsplgen-commits] r57 - trunk/src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Mon Sep 4 08:40:21 CEST 2006
Author: mrchip
Date: 2006-09-04 08:40:20 +0200 (Mon, 04 Sep 2006)
New Revision: 57
Modified:
trunk/src/file.cpp
trunk/src/tri.cpp
trunk/src/wsplgen.h
trunk/src/xy.cpp
trunk/src/xy.h
Log:
Ein Fehler bei der Einarbeitung von Linienobjekten wurde behoben und die
Ausgaben z.t. etwas ?\195?\188berarbeitet.
Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp 2006-08-05 11:53:04 UTC (rev 56)
+++ trunk/src/file.cpp 2006-09-04 06:40:20 UTC (rev 57)
@@ -163,6 +163,7 @@
{
write_fortschritt("->Löschen aussenliegender Kanten gestartet\n");
+ int Count = 0;
for (TElementList::iterator i=ElementList->begin(); i != ElementList->end(); i++)
{
TElement *Element = *i;
@@ -197,6 +198,13 @@
Element->Typ = NO_ELEMENT;
continue;
}
+
+ Count++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count % 50000 == 0))
+ {
+ write_fortschritt("%d von %d Elementen überprüft\n", Count, ElementList->size());
+ }
}
write_fortschritt("<-Löschen aussenliegender Kanten beendet\n");
@@ -860,7 +868,7 @@
if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
{
- write_fortschritt("%d Zeilen, %d Knoten geladen %d Elemente gezählt\n", AnzZeilen, NodeList->size(), AnzElemente);
+ write_fortschritt("%d Zeilen, %d Knoten geladen, %d Elemente gezählt\n", AnzZeilen, NodeList->size(), AnzElemente);
}
if (strncmp (line, "E4Q", 3) == 0 || strncmp (line, "E3T", 3) == 0)
@@ -909,7 +917,7 @@
if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
{
- write_fortschritt("%d Zeilen, %d Knoten geladen %d Elemente geladen\n", AnzZeilen, NodeList->size(), ElementList->size());
+ write_fortschritt("%d Zeilen, %d Knoten geladen, %d Elemente geladen\n", AnzZeilen, NodeList->size(), ElementList->size());
}
int Nr;
@@ -2561,6 +2569,7 @@
write_fortschritt("->Löschen der zu kleinen Ergebnispolygone gestartet\n");
+ int Count = 0;
int DelCount = 0;
double MinArea = -1;
TErgebnisPolygonList::iterator j = ErgebnisPolygonList->begin();
@@ -2580,6 +2589,10 @@
continue;
}
j++;
+
+ Count++;
+
+ if (Count % 10000 == 0) write_fortschritt("Ergebnispolygon %d von %d überpfüft\n", Count+1, ErgebnisPolygonList->size());
}
write_fortschritt("%d Ergebnispolygone gelöscht\n", DelCount);
write_fortschritt("minimale Polygonfläche: %.3f\n", MinArea);
@@ -2588,7 +2601,7 @@
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
- int Count = 0;
+ Count = 0;
TErgebnisPolygonList::iterator i = ErgebnisPolygonList->begin();
while (i != ErgebnisPolygonList->end())
{
@@ -2682,7 +2695,7 @@
}
}
- if (DebugLevel >= 1) write_fortschritt("%d. Polygon Wassertiefe %.2f, %d Teile, %d Ecken\n", Count+1, AktDiff / 100.0, AnzPolyParts, AnzPolyPoints);
+ write_fortschritt("%d. Ergebnispolygon (Wassertiefe %.2f, %d Ringe, %d Stützstellen)\n", Count+1, AktDiff / 100.0, AnzPolyParts, AnzPolyPoints);
if (AnzPolyParts > 0 && AnzPolyPoints > 0)
{
@@ -2875,14 +2888,14 @@
{
if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzPolygone % 5000 == 0) || (AnzPolygone > 0 && AnzPolygone % 50000 == 0))
{
- write_fortschritt("%d von %d Elementen (Polygone) gespeichert\n", AnzPolygone, ElementList->size());
+ write_fortschritt("%d von %d Elementen gespeichert\n", AnzPolygone, ElementList->size());
}
TElement *Element = *i;
AnzPolygone = OutElement(AnzPolygone, Element, TopoDiff, DBFHandle, SHPHandle);
}
- write_fortschritt("%d von %d Elementen (Polygone) gespeichert\n", AnzPolygone, ElementList->size());
+ write_fortschritt("%d von %d Elementen gespeichert\n", AnzPolygone, ElementList->size());
SHPClose(SHPHandle);
DBFClose(DBFHandle);
Modified: trunk/src/tri.cpp
===================================================================
--- trunk/src/tri.cpp 2006-08-05 11:53:04 UTC (rev 56)
+++ trunk/src/tri.cpp 2006-09-04 06:40:20 UTC (rev 57)
@@ -376,12 +376,20 @@
int DiffMSec = NowMSec - StartMSec;
- write_fortschritt("%d von ca. %d Elementen erzeugt (%d von %d Kanten)\n", ElementList->size(), NodeList->size() * 2, AktEdgeIndex, EdgeList->Anz);
+ write_fortschritt("%d von ca. %d Elementen erzeugt\n", ElementList->size(), NodeList->size() * 2);
if (ElementList->size() > 0)
{
- double RestMSec = DiffMSec * 2.0 * (NodeList->size() * 2.0 - ElementList->size()) / ElementList->size();
- write_fortschritt("%.2f sec -> %.4f sec pro Element, Dauer noch ca. %.0f sec\n", DiffMSec / 1000.0, DiffMSec / 1000.0 / ElementList->size(), RestMSec / 1000.0);
+ unsigned int EleBisher = ElementList->size();
+ unsigned int EleGesamt = NodeList->size() * 2;
+ double TimeBisher = DiffMSec;
+ double MitTimeBisher = TimeBisher / EleBisher;
+ double MitTimeNoch = 0.2;
+
+ double TimePerElement = (MitTimeBisher * EleBisher + MitTimeNoch * EleGesamt - MitTimeNoch * EleBisher) / EleGesamt;
+ double RestMSec = (EleGesamt - EleBisher) * TimePerElement;
+
+ write_fortschritt("Dauer bisher: %.0f sec -> Dauer noch ca. %.0f sec\n", DiffMSec / 1000.0, RestMSec / 1000.0);
}
}
}
@@ -392,6 +400,7 @@
// SaveNet("_tmp.2dm", NodeList, ElementList, DebugLevel);
+ int Count = 0;
for (TElementList::iterator i=ElementList->begin(); i != ElementList->end(); i++)
{
TElement *Element = *i;
@@ -435,6 +444,13 @@
continue;
}
}
+
+ Count++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count % 50000 == 0))
+ {
+ write_fortschritt("%d von %d Elementen überprüft\n", Count, ElementList->size());
+ }
}
write_fortschritt("<-Triangulierung der Knoten beendet\n");
Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h 2006-08-05 11:53:04 UTC (rev 56)
+++ trunk/src/wsplgen.h 2006-09-04 06:40:20 UTC (rev 57)
@@ -10,8 +10,13 @@
// Read the file COPYING coming with WSPLGEN for details.
//
-const char Version[] = "0.9.16 r1";
+const char Version[] = "0.9.16 r2";
+// Ein Fehler bei der Erzeugung von Dämmen und Gräben wurde behoben.
+// Kleine Änderungen bei den Fortschrittsanzeigen (u.a. Dauerberechnung der Triangulierung)
+
+// const char Version[] = "0.9.16 r1";
+
// Die Abstände für das Interpolieren der Profile wurden verkleinert
// Die Dateiendung für ASCII-Wasserstandsdateien muss jetzt TXT, DAT oder ASC sein.
// Es werden nun fast alle Elemente gelöscht, die ausserhalb des Begrenzungpolgons liegen
Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp 2006-08-05 11:53:04 UTC (rev 56)
+++ trunk/src/xy.cpp 2006-09-04 06:40:20 UTC (rev 57)
@@ -1033,24 +1033,20 @@
}
//---------------------------------------------------------------------------
-void TElementList::ChangeElements(TNodeList *NodeList, TProfilList *SperrenList, TProfilList *GrabenList, int DebugLevel)
+void TElementList::HelpChangeElements(TNodeList *NodeList, TProfilList *LinienList, int ZWert, int DebugLevel)
{
- write_fortschritt("->Anpassung der Elemente an Dämme und Gräben gestartet\n");
-
int MaxNodeNr = NodeList->MaxNr;
- NodeList->SortByXY();
-
- write_fortschritt("->Anpassung der Elemente an Dämme gestartet\n");
-
int ChangeCount = 0;
int Count = 0;
for (unsigned int i = 0; i < size(); i++)
{
- if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count > 0 && Count % 50000 == 0))
+ Count++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count % 50000 == 0))
{
- write_fortschritt("%d von %d Elemente, %d Elemente angepasst\n", Count, size(), ChangeCount);
+ write_fortschritt("%d von %d Elementen, %d Elemente angepasst\n", Count, size(), ChangeCount);
}
TElement* Element = (*this)[i];
@@ -1058,6 +1054,13 @@
// Hier werden die zum löschen markierten Elemente ignoriert.
if (Element->Typ == NO_ELEMENT) continue;
+ // Hier werden die neuen Elemente wieder auf einen korrekten Typ gesetzt und dann ignoriert.
+ if (Element->Typ == NEWTRI)
+ {
+ Element->Typ = TRI;
+ continue;
+ }
+
if (Element->Typ == QUAD)
{
dump_error(__FILE__, __LINE__, "Viereckselemente werden im Moment noch nicht unterstützt");
@@ -1069,458 +1072,330 @@
TElement* NewElement = 0;
- double XD = 0.0;
- double YD = 0.0;
- double Meter = 0.0;
+ double dummyMeter = 0.0;
+
if (Node1->X == Node2->X && Node1->Y == Node2->Y)
{
write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node1->X / 100.0, Node1->Y / 100.0, Node2->X / 100.0, Node2->Y / 100.0);
}
- if (CalcProfilSchnitt(Node1->X, Node1->Y, Node2->X, Node2->Y, SperrenList, &XD, &YD, &Meter))
+ if (Node2->X == Node3->X && Node2->Y == Node3->Y)
{
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node2->X / 100.0, Node2->Y / 100.0, Node3->X / 100.0, Node3->Y / 100.0);
+ }
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
+ if (Node3->X == Node1->X && Node3->Y == Node1->Y)
+ {
+ write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node3->X / 100.0, Node3->Y / 100.0, Node1->X / 100.0, Node1->Y / 100.0);
+ }
- bool MustNewElement = true;
- TNode* Node = 0;
+ double XD12 = 0.0;
+ double YD12 = 0.0;
+ double XD23 = 0.0;
+ double YD23 = 0.0;
+ double XD31 = 0.0;
+ double YD31 = 0.0;
+ long X12 = 0;
+ long Y12 = 0;
+ long X23 = 0;
+ long Y23 = 0;
+ long X31 = 0;
+ long Y31 = 0;
+ TNode* Node12 = 0;
+ TNode* Node23 = 0;
+ TNode* Node31 = 0;
+
+ bool Schnitt12 = CalcProfilSchnitt(Node1->X, Node1->Y, Node2->X, Node2->Y, LinienList, &XD12, &YD12, &dummyMeter);
+ bool Schnitt23 = CalcProfilSchnitt(Node2->X, Node2->Y, Node3->X, Node3->Y, LinienList, &XD23, &YD23, &dummyMeter);
+ bool Schnitt31 = CalcProfilSchnitt(Node3->X, Node3->Y, Node1->X, Node1->Y, LinienList, &XD31, &YD31, &dummyMeter);
+
+
+ if (Schnitt12)
+ {
+ X12 = (long)(XD12 + 0.5);
+ Y12 = (long)(YD12 + 0.5);
+
+ TNodeList* FoundNodeList = NodeList->FindAllByXY(X12, Y12, 4);
+
if (FoundNodeList->size() > 0)
{
for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
{
- Node = *j;
+ TNode* Node = *j;
if (Node1->X == Node->X && Node1->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt12 = false;
}
else if (Node2->X == Node->X && Node2->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt12 = false;
}
else if (Node3->X == Node->X && Node3->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt12 = false;
}
+
+ double D = (Node->X - X12) * (Node->X - X12) + (Node->Y - Y12) * (Node->Y - Y12);
+
+ if (Node12 == 0 || D < (Node12->X - X12) * (Node12->X - X12) + (Node12->Y - Y12) * (Node12->Y - Y12))
+ {
+ Node12 = Node;
+ }
}
}
- if (MustNewElement)
+ if (0 == Node12)
{
- if (FoundNodeList->size() == 1)
+ Node12 = new TNode(++MaxNodeNr, X12, Y12, ZWert);
+ if(false == NodeList->AddWithQuadTree(Node12))
{
- Node = *FoundNodeList->begin();
- Node->Z = DammZ;
+ dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X12 / 100.0, Y12 / 100.0);
}
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, DammZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
-
- NewElement = new TElement(Node1, Node, Node3);
- push_back(NewElement);
-
- NewElement = new TElement(Node2, Node3, Node);
- push_back(NewElement);
-
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
-
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
}
}
- if (Node2->X == Node3->X && Node2->Y == Node3->Y)
+ if (Schnitt23)
{
- write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node2->X / 100.0, Node2->Y / 100.0, Node3->X / 100.0, Node3->Y / 100.0);
- }
+ X23 = (long)(XD23 + 0.5);
+ Y23 = (long)(YD23 + 0.5);
- if (CalcProfilSchnitt(Node2->X, Node2->Y, Node3->X, Node3->Y, SperrenList, &XD, &YD, &Meter))
- {
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ TNodeList* FoundNodeList = NodeList->FindAllByXY(X23, Y23, 4);
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
-
- bool MustNewElement = true;
- TNode* Node = 0;
if (FoundNodeList->size() > 0)
{
for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
{
- Node = *j;
+ TNode* Node = *j;
if (Node1->X == Node->X && Node1->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt23 = false;
}
else if (Node2->X == Node->X && Node2->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt23 = false;
}
else if (Node3->X == Node->X && Node3->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt23 = false;
}
+
+ double D = (Node->X - X23) * (Node->X - X23) + (Node->Y - Y23) * (Node->Y - Y23);
+
+ if (Node23 == 0 || D < (Node23->X - X23) * (Node23->X - X23) + (Node23->Y - Y23) * (Node23->Y - Y23))
+ {
+ Node23 = Node;
+ }
}
}
- if (MustNewElement)
+ if (0 == Node23)
{
- if (FoundNodeList->size() == 1)
+ Node23 = new TNode(++MaxNodeNr, X23, Y23, ZWert);
+ if(false == NodeList->AddWithQuadTree(Node23))
{
- Node = *FoundNodeList->begin();
- Node->Z = DammZ;
+ dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X23 / 100.0, Y23 / 100.0);
}
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, DammZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
-
- NewElement = new TElement(Node2, Node, Node1);
- push_back(NewElement);
-
- NewElement = new TElement(Node3, Node1, Node);
- push_back(NewElement);
-
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
-
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
}
}
- if (Node3->X == Node1->X && Node3->Y == Node1->Y)
+ if (Schnitt31)
{
- write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node3->X / 100.0, Node3->Y / 100.0, Node1->X / 100.0, Node1->Y / 100.0);
- }
+ X31 = (long)(XD31 + 0.5);
+ Y31 = (long)(YD31 + 0.5);
- if (CalcProfilSchnitt(Node3->X, Node3->Y, Node1->X, Node1->Y, SperrenList, &XD, &YD, &Meter))
- {
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ TNodeList* FoundNodeList = NodeList->FindAllByXY(X31, Y31, 4);
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
-
- bool MustNewElement = true;
- TNode* Node = 0;
if (FoundNodeList->size() > 0)
{
for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
{
- Node = *j;
+ TNode* Node = *j;
if (Node1->X == Node->X && Node1->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt31 = false;
}
else if (Node2->X == Node->X && Node2->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt31 = false;
}
else if (Node3->X == Node->X && Node3->Y == Node->Y)
{
- Node->Z = DammZ;
- MustNewElement = false;
+ Node->Z = ZWert;
+ Schnitt31 = false;
}
+
+ double D = (Node->X - X31) * (Node->X - X31) + (Node->Y - Y31) * (Node->Y - Y31);
+
+ if (Node31 == 0 || D < (Node31->X - X31) * (Node31->X - X31) + (Node31->Y - Y31) * (Node31->Y - Y31))
+ {
+ Node31 = Node;
+ }
}
}
- if (MustNewElement)
+ if (0 == Node31)
{
- if (FoundNodeList->size() == 1)
+ Node31 = new TNode(++MaxNodeNr, X31, Y31, ZWert);
+ if(false == NodeList->AddWithQuadTree(Node31))
{
- Node = *FoundNodeList->begin();
- Node->Z = DammZ;
+ dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X31 / 100.0, Y31 / 100.0);
}
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, DammZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
-
- NewElement = new TElement(Node3, Node, Node2);
- push_back(NewElement);
-
- NewElement = new TElement(Node1, Node2, Node);
- push_back(NewElement);
-
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
-
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
}
}
- Count++;
- }
- write_fortschritt("%d von %d Elemente, %d Elemente geändert\n", Count, size(), ChangeCount);
+ if (Schnitt12 && Schnitt23 && Schnitt31)
+ {
+ NewElement = new TElement(Node1, Node12, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- write_fortschritt("<-Anpassung der Elemente an Dämme beendet\n");
+ NewElement = new TElement(Node12, Node2, Node23);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- write_fortschritt("->Anpassung der Elemente an Gräben gestartet\n");
+ NewElement = new TElement(Node12, Node23, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- Count = 0;
- for (unsigned int i = 0; i < size(); i++)
- {
- if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count > 0 && Count % 50000 == 0))
- {
- write_fortschritt("%d von %d Elemente, %d Elemente geändert\n", Count, size(), ChangeCount);
- }
+ NewElement = new TElement(Node23, Node3, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TElement* Element = (*this)[i];
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- // Hier werden die zum löschen markierten Elemente ignoriert.
- if (Element->Typ == NO_ELEMENT) continue;
-
- if (Element->Typ == QUAD)
- {
- dump_error(__FILE__, __LINE__, "Viereckselemente werden im Moment noch nicht unterstützt");
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
}
+ else if (Schnitt12 && Schnitt23)
+ {
+ NewElement = new TElement(Node1, Node12, Node3);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TNode* Node1 = Element->Node1;
- TNode* Node2 = Element->Node2;
- TNode* Node3 = Element->Node3;
+ NewElement = new TElement(Node12, Node2, Node23);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TElement* NewElement = 0;
+ NewElement = new TElement(Node12, Node23, Node3);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- double Meter = 0.0;
- double XD = 0.0;
- double YD = 0.0;
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- if (Node2->X == Node1->X && Node2->Y == Node1->Y)
- {
- write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node1->X / 100.0, Node1->Y / 100.0, Node2->X / 100.0, Node2->Y / 100.0);
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
}
-
- if (CalcProfilSchnitt(Node1->X, Node1->Y, Node2->X, Node2->Y, GrabenList, &XD, &YD, &Meter))
+ else if (Schnitt12 && Schnitt31)
{
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ NewElement = new TElement(Node1, Node12, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
+ NewElement = new TElement(Node12, Node2, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- bool MustNewElement = true;
- TNode* Node = 0;
- if (FoundNodeList->size() > 0)
- {
- for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
- {
- Node = *j;
+ NewElement = new TElement(Node2, Node3, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (Node1->X == Node->X && Node1->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node2->X == Node->X && Node2->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node3->X == Node->X && Node3->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- }
- }
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- if (MustNewElement)
- {
- if (FoundNodeList->size() == 1)
- {
- Node = *FoundNodeList->begin();
- Node->Z = GrabenZ;
- }
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, GrabenZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
+ }
+ else if (Schnitt23 && Schnitt31)
+ {
+ NewElement = new TElement(Node1, Node2, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- NewElement = new TElement(Node1, Node, Node3);
- push_back(NewElement);
+ NewElement = new TElement(Node2, Node23, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- NewElement = new TElement(Node2, Node3, Node);
- push_back(NewElement);
+ NewElement = new TElement(Node23, Node3, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
- }
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
}
-
- if (Node3->X == Node2->X && Node3->Y == Node2->Y)
+ else if (Schnitt12)
{
- write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node2->X / 100.0, Node2->Y / 100.0, Node3->X / 100.0, Node3->Y / 100.0);
- }
+ NewElement = new TElement(Node1, Node12, Node3);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (CalcProfilSchnitt(Node2->X, Node2->Y, Node3->X, Node3->Y, GrabenList, &XD, &YD, &Meter))
- {
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ NewElement = new TElement(Node12, Node2, Node3);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- bool MustNewElement = true;
- TNode* Node = 0;
- if (FoundNodeList->size() > 0)
- {
- for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
- {
- Node = *j;
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
+ }
+ else if (Schnitt23)
+ {
+ NewElement = new TElement(Node1, Node2, Node23);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (Node1->X == Node->X && Node1->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node2->X == Node->X && Node2->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node3->X == Node->X && Node3->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- }
- }
+ NewElement = new TElement(Node2, Node23, Node3);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (MustNewElement)
- {
- if (FoundNodeList->size() == 1)
- {
- Node = *FoundNodeList->begin();
- Node->Z = GrabenZ;
- }
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, GrabenZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- NewElement = new TElement(Node2, Node, Node1);
- push_back(NewElement);
-
- NewElement = new TElement(Node3, Node1, Node);
- push_back(NewElement);
-
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
-
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
- }
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
}
-
- if (Node1->X == Node3->X && Node1->Y == Node3->Y)
+ else if (Schnitt31)
{
- write_error(3214, "Knotenabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", Node3->X / 100.0, Node3->Y / 100.0, Node1->X / 100.0, Node1->Y / 100.0);
- }
+ NewElement = new TElement(Node1, Node2, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- if (CalcProfilSchnitt(Node3->X, Node3->Y, Node1->X, Node1->Y, GrabenList, &XD, &YD, &Meter))
- {
- long X = (long)(XD + 0.5);
- long Y = (long)(YD + 0.5);
+ NewElement = new TElement(Node2, Node3, Node31);
+ NewElement->Typ = NEWTRI;
+ push_back(NewElement);
- TNodeList* FoundNodeList = NodeList->FindAllByXY(X, Y, 4);
+ if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
- bool MustNewElement = true;
- TNode* Node = 0;
- if (FoundNodeList->size() > 0)
- {
- for (TNodeList::iterator j=FoundNodeList->begin(); j != FoundNodeList->end(); j++)
- {
- Node = *j;
-
- if (Node1->X == Node->X && Node1->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node2->X == Node->X && Node2->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- else if (Node3->X == Node->X && Node3->Y == Node->Y)
- {
- Node->Z = GrabenZ;
- MustNewElement = false;
- }
- }
- }
-
- if (MustNewElement)
- {
- if (FoundNodeList->size() == 1)
- {
- Node = *FoundNodeList->begin();
- Node->Z = GrabenZ;
- }
- else
- {
- Node = new TNode(++MaxNodeNr, X, Y, GrabenZ);
- if(false == NodeList->AddWithQuadTree(Node))
- {
- dump_error(__FILE__, __LINE__, "Der Knoten (%.2f, %.2f) wurde nicht gefunden und konnte nicht eingefügt werden\n", X / 100.0, Y / 100.0);
- }
- }
-
- NewElement = new TElement(Node3, Node, Node2);
- push_back(NewElement);
-
- NewElement = new TElement(Node1, Node2, Node);
- push_back(NewElement);
-
- if (DebugLevel >= 9) write_fortschritt("Element %d : %d - %d - %d wird geändert\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
-
- Element->Typ = NO_ELEMENT;
- ChangeCount++;
- continue;
- }
+ Element->Typ = NO_ELEMENT;
+ ChangeCount++;
}
-
- Count++;
}
- write_fortschritt("%d von %d, %d Elemente geändert\n", Count, size(), ChangeCount);
+ write_fortschritt("%d von %d Elemente, %d Elemente geändert\n", Count, size(), ChangeCount);
+}
+//---------------------------------------------------------------------------
+void TElementList::ChangeElements(TNodeList *NodeList, TProfilList *SperrenList, TProfilList *GrabenList, int DebugLevel)
+{
+ write_fortschritt("->Anpassung der Elemente an Dämme und Gräben gestartet\n");
+ NodeList->SortByXY();
+
+ write_fortschritt("->Anpassung der Elemente an Dämme gestartet\n");
+ HelpChangeElements(NodeList, SperrenList, DammZ, DebugLevel);
+ write_fortschritt("<-Anpassung der Elemente an Dämme beendet\n");
+
+ write_fortschritt("->Anpassung der Elemente an Gräben gestartet\n");
+ HelpChangeElements(NodeList, GrabenList, GrabenZ, DebugLevel);
write_fortschritt("<-Anpassung der Elemente an Gräben beendet\n");
write_fortschritt("<-Anpassung der Elemente an Dämme und Gräben beendet\n");
Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h 2006-08-05 11:53:04 UTC (rev 56)
+++ trunk/src/xy.h 2006-09-04 06:40:20 UTC (rev 57)
@@ -26,7 +26,7 @@
#include "quadtree.h"
//----------------------------------------------------------------------------
-typedef enum { NO_ELEMENT, TRI, QUAD } TElementTyp;
+typedef enum { NO_ELEMENT, TRI, QUAD, NEWTRI } TElementTyp;
typedef enum { NOT_INSIDE, INSIDE, ON_LINE, UNDEFINED } TInsideTyp;
const int NoWsp = -999999;
@@ -253,6 +253,9 @@
//----------------------------------------------------------------------------
class TElementList : public std::vector<TElement *>
{
+ private:
+ void HelpChangeElements(TNodeList *NodeList, TProfilList *LinienList, int ZWert, int DebugLevel);
+
public:
~TElementList(void);
void Clear(void);
More information about the Wsplgen-commits
mailing list