[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