3D-Graphen zeichnen in C# mit ILNumerics

ILNumeric - different 3D plotsIn folgendem Artikel soll es darum gehen, wie sich mit Hilfe der ILNumerics-Bibliotheken in C# aufwendige Graphen zeichenen lassen – auf Wunsch sogar interaktiv.

Wie bei fast allen Artikel dieser Art hier im Blog, stelle ich zuerst kurz die Library vor, gehe dann auf die nötigen Grundlagen für das spätere Coding ein und zeige euch abschließend Schritt für Schritt den weg dorthin. Los geht’s!

Was ist ILNumerics?

ILNumerics ist eine .NET-Klassenbibliothek die aus mehreren Komponenten besteht. Die beiden Kernkomponenten sind hierbei die Computing- und die Visualization-Engine. ILNumerics erweitert das .NET-Framework unter anderem um komplexe Zahlen, Skalar-Rechnung, Vektoren, Matrizen und Matrizenrechnung sowie beliebig Dimensionale Datenstrukturen.

Eine weitere Stärke ILNumerics’ ist die Visualization-Engine, die es ermöglicht 2- und 3-dimensionale Graphen zu plotten, worauf auch der Fokus dieses Artikels liegt.

Was kostet ILNumerics?

Wer schon einmal mit ILNumerics zu tun hatte, der mag vielleicht noch auf dem Stand sein, dass ILNumerics komplett kostenlos ist. Diese Information stammt aus den Jahren 2007-2011 als ILNumerics kostenfrei unter LGPL verbreitet wurde.

Seit 2011 wird ILNumerics jedoch unter einer proprietären Lizenz vertrieben, die bei monatlicher Zahlweise als Subscription-Modell bei 89€ oder bei jährlicher Zahlweise bei 1.300€ beginnt. Das Subscription-Modell bietet entgegen dem Perpetual-Modell Updates, Upgrades und Support.

Weiterhin gibt es natürlich die Möglichkeit eines kostenlosen Trials, um die Fähigkeiten der Libraries zu evalurieren.

Projektidee und Datengrundlage

Kommen wir zu dem Übungsprojekt, welches wir heute umsetzen wollen. Ziel soll es sein, mehrere tausend Punkte in einem 3D-System zu plotten.

Bei den Punkten handelt es sich je um die drei Ausprägungen “Downloadzahl”, “Rating” und “Preis” eines jeden WordPress-Plugins auf CodeCanyon, die auf je einer Achse des 3D-Graphen abgebildet werden sollen.

Solltet ihr das Beispiel mit tagesaktuellen Daten nachvollziehen wollen, könnte ihr meinen kleinen Python-Crawler nutzen, den ich eigens für die Beschaffung dieser Daten geschrieben habe.

Das Thema ist nun klar und die Daten sollten mit dem Crawler beschafft sein. Kommen wir zur Umsetzung in C#.

3D-Diagramm in C# erstellen

ilnumerics visual studioZuerst benötigen wir Projekt im Visual Studio – der Einfachheit halber reicht hier ein WinForms-Projekt. Nun ziehen wir im Form-Designer die Komponente ILPanel aus der Toolbox auf das Form. (Die Komponente sollte sich nach der Installation von ILNumerics im Reiter “ILNumerics” in der Toolbox befinden. Ist dem nicht so, reicht ein Rechtsklick in die Toolbox, dann “Element auswählen…”, um die ILNumerics-Controls zu suchen und hinzuzufügen.)

Ist das ILPanel hinzugefügt, kann es im Code losgehen. Da der Code recht übersichtlich ist, entnehmt ihr die Funktionsweise des Codes bitte den Kommentaren im Quelltext.

//When form loads...
private void Form1_Load(object sender, EventArgs e)
{
	//Open a filestream and read the data points into an comma-seperated string
	StreamReader sr = new StreamReader(Application.StartupPath + "\\stats_plugins.csv");
	string dataLines = string.Empty;
	while (sr.Peek() != -1)
		dataLines += sr.ReadLine().Replace(";",",") + "\n";
	sr.Close();
	dataLines = dataLines.Trim('\n');

	//Convert the data-string into an ILArray
	ILArray<int> AN = ILMath.csvread<int>(dataLines);

	//Create a new scene, which is the base for our graph
	var scene = new ILScene();
	using (ILScope.Enter())
	{
		//Convert all data points to float
		ILArray<float> A = ILMath.tosingle(AN);

		//Add a plot to the scene and configure it
		scene.Add(new ILPlotCube
		{
			//Render in 3D
			TwoDMode = false, 

			//Add 3 axes
			Axes =
			{

				XAxis =
				{
					Label = { Text = "Price in $" },
					GridMajor =
					{
						DashStyle = DashStyle.Dashed,
						Color = Color.DarkGray,
						Width = 1
					}
				},
				YAxis =
				{
					Label = { Text = "Rating count" },
					GridMajor =
					{
						DashStyle = DashStyle.Dashed,
						Color = Color.DarkGray,
						Width = 1
					}
				},
				ZAxis =
				{
					Label = { Text = "Download count" }
				}
			},
			//Add the data points
			Children = {
				new ILPoints {
					Positions = A
				},
			},
			//Set start rotation for 3D rendered graph
			Rotation = Matrix4.Rotation(new Vector3(1, 1, 1), 0.5f)
		});
	}

	//Add the scene to the ILPanel
	ilPanel1.Scene = scene;
}

Dieser Code reicht schon aus, um nebenstehendes Ergebnis zu erhalten. Durch die Verwendung des ILPanels erhält man nicht nur einen ansehnlichen 3D-Plot, sondern kann diesen auch noch drehen, zoomen und verschieben.

ilnumerics

Das ILPanel ist übrigens nur eine Möglichkeit eine Scene darzustellen. So ist es zum Beispiel auch möglich ein SVG aus der Scene zu erstellen, welches sich für die Darstellung in Webprojekten eignet. Einen guten Artikel hierzu bietet Scott Hanselman auf seinem Blog.

Fazit

Die Ergebnisse (am Ende des Absatz) können sich sehen lassen. Ohne großen Aufwand lassen sich auch schwierige Graphen plotten, wobei ich zugeben muss, dass ILNumerics noch wesentlich mehr kann, was jedoch wiederum meine mathematischen Fähigkeiten übersteigt.

download rating price  download price  download rating  price rating

Der Preis hingegen ist ein Klopper. 89€ monatlich habe ich derzeit definitiv nicht über. Je nach Kunde und Auftrag oder für größere Unternehmen, sollte der Preis in anbetracht der gebotenen Leistung jedoch kein Hindernis darstellen.

Abschließend noch drei Links zum leichten Einstieg und bei Problemen.

2 Kommentare

  1. Mariesays:

    super blog! hat mir sehr geholfe, danke!
    lg vom kalterer see

  2. Schaut sehr interessant aus. Ist das denn auch für einen mathematischen bzw. statistischen Laien zu verstehen und zu bedienen? Gibt es extra studenten Preise?
    Lieben Gruß aus Wengen in Südtirol!

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.