XYZCreate

XYZCreate erzeugt einen 3D-Datensatz. Die Daten können entweder als XYZ-Tripel oder als Matrix vorliegen.Die XYZ-Tripel können beliebig in der XY-Ebene verteilt sein. Es sind mindestens 3 Koordinaten-Tripel erforderlich, um einen 3D-Datensatz erzeugen zu können. Aus den XYZ-Tripeln wird durch Interpolation eine Z-Matrix berechnet.

hData = XYZCreate(ssName, rvX, rvY, rvZ)
hData = XYZCreate(ssName, rvX, rvY, rvZ, bIsoScale)
hData = XYZCreate(ssName, rvX, rvY, rvZ, bIsoScale, svWOT)
hData = XYZCreate(ssName, rvX, rvY, rmZMatrix)
hData = XYZCreate(ssName, rvX, rvY, rmZMatrix, bIsoScale)
hData = XYZCreate(ssName, rmZMatrix, rvRect)

Returnwert

hData ist die Zugriffsnummer (Handle), mit der auf den Datensatz zugegriffen werden kann. Falls der Datensatz nicht erzeugt werden kann, ist hData gleich 0.

Parameter

ssName

ssName ist ein skalarer String.

rvX

rvX ist ein Vektor mit den X-Koordinaten.

rvY

rvY ist ein Vektor mit den Y-Koordinaten.

rvZ

rvZ ist ein Vektor mit den Z-Koordinaten.

rmZMatrix

rmZMatrix ist eine Matrix mit den Z-Koordinaten. Falls die Abstände der Matrixspalten und -zeilen konstant sind, können die x/y-Koordinaten der Matrix über den Parameter rvRect festgelegt werden. Wenn die Abstände der Spalten oder Zeilen nicht konstant sind, werden die Koordinaten über die Parameter rvX und rvY festgelegt. In diesem Fall ist der Parameter rvX ein Vektor mit den X-Koordinaten der Matrixspalten und rvY ein Vektor mit den Y-Koordinaten der Matrixzeilen. In diesem Fall wird keine Interpolation durchgeführt. Falls die Matrix ungültige Werte enthält, werden diese Werte durch Interpolation ergänzt. Ungültige Werte am Rand werde für die Bestimmung der Hülle verwendet.

rvRect

rvRect legt der Wertebereich der Z-Matrix in der XY-Ebene fest.

Wert Bedeutung
rvRect[1] xmin der ersten Matrix-Spalte
rvRect[2] ymin der ersten Matrix-Zeile
rvRect[3] xmax der ersten Matrix-Spalte
rvRect[4] ymax der letzten Matrix-Zeile
bIsoScale

bIsoScale hat den Wert TRUE (1), wenn für den Datensatz automatisch Isolinien erzeugt werden sollen und FALSE (0), wenn keine Isolinien erzeugt werden sollen. Falls die Funktion mit vier Parametern aufgerufen wird, wird für bIsoScale TRUE verwendet.

svWOT

svWOT ist ein String-Vektor, der die Volllastlinie festlegt. Jedes Vektorelement besteht aus einem Zeichen und kann die Werte "a", "e", "v", "A", "E", "V", "" annehmen. Die Zeichen haben folgende Bedeutung:

Wert Bedeutung
“a” Anfang der Volllastlinie ohne Beschriftung.
“e” Ende der Volllastlinie ohne Beschriftung.
“v” Punkt gehört zur Volllastlinie und wird nicht beschriftet.
“A” Anfang der Volllastlinie mit Beschriftung.
“E” Ende der Volllastlinie mit Beschriftung.
“V” Punkt gehört zur Volllastlinie und wird beschriftet.
“” (leerer String) Punkt gehört nicht zur Volllastlinie.

Kommentar

Bei XYZ-Tripeln müssen die Vektoren alle die gleiche Anzahl an Elementen haben. Die Punkte dürfen in der x,y-Ebene beliebig verteilt sein. Doppelte Datenpunkte, d.h. Punkte mit den gleichen x,y-Koordinaten werden automatisch entfernt. Es sind mindestens 3 Punkte erforderlich.

Wenn der Datensatz von einer Matrix erzeugt wird, sollen die Vektoren rvX und rvY aufsteigend sortiert sein. Falls das nicht der Fall ist, werden die Vektoren aufsteigend sortiert. Die Matrix wird entsprechend mit sortiert.

Wenn der Datensatz von einer Matrix erzeugt wird, kann die Hülle mit Hilfe der Funktion XYZSetHullNewData definiert werden.

Wird die Funktion ohne den Parameter svVolllast aufgerufen, wird eine konvexe Hülle berechnet.

Bevor der Datensatz erzeugt wird, werden Datenpunkte, die in der x/y-Ebene sehr dicht beieinander liegen, entfernt. Dazu wird die Funktion reduce3d aufgerufen. Die Funktion legt ein Netz der Größe 100 mal 100 Netz über die Daten. Fallen mehrere Punkte in ein Rechteck des Netzes, wird nur jeweils ein Punkt aus dieser Gruppe verwendet, wobei der “Median”-Punkt verwendet wird. Bei einem 100 mal 100 Netz ergeben sich dann höchstens 10000 Punkte. Liegen alle Punkte auf einer Geraden ergeben sich 100 Punkte.

Um das Filtern abzuschalten kann der folgende Aufruf im Kommandofenster eingegeben werden:

WriteProfileInt("Settings", "XYZFilterCallback_enable", 0);

Filter wieder einschalten:

WriteProfileInt("Settings", "XYZFilterCallback_enable", 1);

Die Filterfunktion kann im Dialogfeld Extras=>Weitere Optionen ein- bzw. ausgeschaltet werden.

Korrektur am Kennfeldrand

Die lineare und nicht-lineare Interpolation basiert auf einer Triangulation der Stützstellen in der X/Y-Ebene. Bei der Triangulation können am Rand sehr flache Dreiecke entstehen, die zu unerwarteten Isolinienverläufen führen können.

Das folgende Beispiel zeigt in den beiden oberen Diagrammen den Verlauf der Isolinien bei unkorrigierten Daten und in den unteren beiden Diagrammen den Verlauf bei korrigierten Daten am Rand. Bei der Korrektur werden Datenpunkte in der Nähe des Randes auf die konvexe Hülle verschoben. Durch die Korrektur werden bei der Triangulation sehr flache Dreiecke vermieden.

../../_images/xyz_flat_triangle_correction.png

Ohne Korrektur der Randpunkte werden durch die Triangulation am Rand abknickende Ioslinienverläufe berechnet. Im Bild kann man das am rechten und linken Rand des Kennfeldes beobachten.

Die Korrektur kann im Dialogfeld Extras=>Weitere Optionen ein- bzw. ausgeschaltet werden. Der Defaultwert ist “eingeschaltet”. Für die Bestimmung der Randpuntke wird eine Toleranz in Prozent eingegeben. Der Defaultwert beträgt 0.1 % des Wertebereichs in der X/Y-Ebene. Für die Berechnung werden die Daten auf den Bereich von 0 bis 1 skaliert. Das entspricht einer Toleranz von 6 1/min für den Drehzahlbereich von 500 bis 6500 1/min.

Die Einstellung kann per Skript wie folgt ausgeschaltet werden:

WriteProfileInt("Settings", "XYZRemoveFlatTriangles", 0);

Einschalten:

WriteProfileInt("Settings", "XYZRemoveFlatTriangles", 1);

Beispiel

Das folgende Beispiel können Sie in einen Editor kopieren (Datei=>Neu [Programm Editor]) und dann den Befehl UniScript=>Speichern/Ausführen ausführen.

Es wird eine 2 mal 3 Matrix erzeugt. (Die x-Koordinaten legen die Spalten fest und y-Koordinaten legen die Zeilen der Matrix fest.)

x = [1, 1.5, 2]
y = [1, 5]
z = [1, 1, 3;
     1, 2, 3]
hData = XYZCreate("Test", x, y, z);
if (hData == 0) {
    error();
}
hLayer = LayerCreate();
hDoc = DocCreate();
hPage = PageCreate();
DocAddPage(hDoc, hPage);
PageAddLayer(hPage, hLayer);
LayerAddDataset(hLayer, hData);
LayerAutoScale(hLayer);
PageReplot(hPage);

History

Version Beschreibung
5.3.4 Aufruf mit drei Parametern korrigiert: XYZCreate(ssName, rmZMatrix, rvRect).

id-428507