Autor Beitrag
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 26.05.06 22:08 
Complex Library

Was ist die Complex Library?

Complex Library ist eine Bibliothek für .NET 2.0 (geschrieben in C#), die Datentypen und Methoden zum Berechnen und Darstellen von komplexen Zahlen bereitstellt. Sie definiert den Namespace DSComplexLib.Calculation mit der Klasse ComplexNumber, die die komplexe Zahl ansich darstellt und diverse Funktionen (zum Formatieren, Parsen, Rechnen...) bereitstellt, sowie den Namespace DSComplexLib.Visualization zur grafischen Darstellung von komplexen Zahlen.

Weitere Informationen findet ihr in der angehängten Dokumentation (siehe Posting unten!), einen Screenshot der Demo ebenfalls. Hinweis: die Demo zeigt nur einen Bruchteil der Funktionalität, allerdings ist dafür auch dementsprechend wenig Quelltext notwendig (siehe Code unten).

Verwendungs-Beispiele

Hier ein Beispiel, wie zwei komplexe Zahlen dividiert und die Wurzel des Ergebnisses berechnet und auf einem Label dargestellt werden kann:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
using DSComplexLib.Calculation;

ComplexNumber c1 = ComplexNumber.j; //j
ComplexNumber c2 = new ComplexNumber(12); //1+2j

ComplexNumber c = (c1 / c2).Sqrt();
c.SetAngleRestriction(AngleRestriction.ar0To2Pi); //Winkel soll zwischen 0 und 2Pi liegen

label1.Text = c.ToCompString(); //In Komponenten-Form ausgeben
label2.Text = c.ToPolarString(false); //In Polar-Form ausgeben


Und hier ein Beispiel, wie man zwei Strings in eine komplexe Zahl umwandeln und addieren kann:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
using DSComplexLib.Calculation;

String s1 = "1+j2"//1+2j
String s2 = "1*e^j90°"//j

ComplexNumber c = ComplexNumber.Parse(s1) + ComplexNumber.Parse(s2);
label1.Text = c.ToCompString(); //In Komponenten-Form ausgeben


Hier ein Teil des Sourcecodes der Demo - ihr braucht nur eine leere Form - die entsprechenden Eventhandler sind einzustellen .DLL in die Referenzen hinzufügen nicht vergessen. Die Kommentare sollten selbsterklärend sein.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
using System;
//...

using DSComplexLib.Calculation;
using DSComplexLib.Visualization;

namespace DSComplexLibDemo
{
    public partial class Form1 : Form
    {
        ComplexPlane cPlane;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cPlane = new ComplexPlane(this.CreateGraphics());
            cPlane.SetSmoothingMode(SmoothingMode.AntiAlias); //Enable Antialiasing

            Pen AuxiliaryPen = new Pen(Color.LightGray, 1);
            AuxiliaryPen.DashStyle = DashStyle.Dot; //Make auxiliary raster lines gray dotted
            cPlane.SetAuxiliaryRasterPen(AuxiliaryPen);
            cPlane.AddCircle(Circle.UnitCircle); //Show unit circle
            cPlane.AddCircle(new Circle(Pens.Black, Math.Sqrt(2))); //Show circle with radius Sqrt(2)

            ComplexPhasorGroup g1 = new ComplexPhasorGroup("Group 1"false); //Create phasor group
            g1.AddPhasor(new ComplexPhasor(new ComplexNumber(11), Pens.Red, "Phasor 1"truetrue, ContentAlignment.TopLeft, false, ContentAlignment.BottomLeft, new Font("Verdana"10), Brushes.Red)); //Add phasor
            g1.AddPhasor(new ComplexPhasor(new ComplexNumber(1, -1), Pens.Blue, "Phasor 2"truetrue, ContentAlignment.BottomLeft, false, ContentAlignment.TopLeft, new Font("Verdana"10), Brushes.Blue));
            cPlane.AddPhasorGroup(g1); //Add phasor group to complex plane

            ComplexPhasorGroup g2 = new ComplexPhasorGroup("Group 2"true); //Create phasor group where phasors are added graphically
            g2.AddPhasor(new ComplexPhasor(new ComplexNumber(-1, -1), Pens.Green, "Phasor 3"truetrue, ContentAlignment.BottomRight, false, ContentAlignment.TopRight, new Font("Verdana"10), Brushes.Green));
            g2.AddPhasor(new ComplexPhasor(new ComplexNumber(02), Pens.Purple, "Phasor 4"truetrue, ContentAlignment.MiddleLeft, false, ContentAlignment.MiddleRight, new Font("Verdana"10), Brushes.Purple));
            cPlane.AddPhasorGroup(g2);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            cPlane.Render(this.ClientSize.Width, this.ClientSize.Height); //Redraw
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            Form1_Paint(sender, null); //Redraw when size of window changes
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (((MouseEventArgs)e).Button == MouseButtons.Left) //When moving mouse and left button is pressed...
                cPlane.StretchSelectedPhasor(((MouseEventArgs)e).Location); //...stretch currently selected phasor
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            cPlane.SelectPhasor(((MouseEventArgs)e).Location);
        }
    }
}


Lizenz

Die Bibliothek darf frei verwendet und modifiziert werden, solange ich als ursprünglicher Autor genannt werde. Für Details bitte den Lizenztext in der angehängten readme.txt lesen.

Download

Die Dateien findet ihr im Anhang.

Würde mich über jegliche Art von Kritik und eventuelle Verbesserungsvorschläge freuen

AXMD

//EDIT: Diverse Aktualisierungen (v.a. Files)
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von AXMD am So 04.06.06 16:26, insgesamt 6-mal bearbeitet
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 27.05.06 14:37 
Ist das "j" ein Schreibfehler, oder heißt das neuerdings "Jmaginärteil" ?

_________________
Ist Zeit wirklich Geld?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 27.05.06 14:42 
Es gibt beide Schreibweisen (also 5+3*i und 5+3*j). Andreas hat wohl letztere gelernt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 27.05.06 15:01 
Zwei Fragen:
1. Unterstützt die Bibliothek beide Schreibweisen (sowohl i als auch j, einstellbar???)
2. Ist die Imaginäre Einheit als Präfix oder Postfix zu verwenden (einstellbar\automatisch erkannt?)

Inwiefern werden Operatoren überladen? (** für Potenzen?)
Warum die Trennung der statischen Funktionen von der Klasse ComplexNumber? Sollte man nicht sowohl als auch zulassen?

ausblenden C#-Quelltext
1:
2:
c3 = ComplexNumber.Multiply(c1, c2); //Erzeugt eine neue Instanz, die das Ergebnis enthält
c1.Multiply(c2); //Multipliziert c1 mit c2 und speichert das Ergebnis in c1


Oder ist ComplexNumber als immutable zu betrachten (was eine solche Verwendung ausschließen würde)?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
MagicAndre1981
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 27.05.06 15:02 
i = Mathematik- und j=Elektrotechnikschreibweise, das lernst du bei Studium ;)
AXMD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 27.05.06 15:44 
user profile iconMagicAndre1981 hat folgendes geschrieben:
i = Mathematik- und j=Elektrotechnikschreibweise, das lernst du bei Studium ;)

So ist es ;)

user profile iconBenBE hat folgendes geschrieben:
Zwei Fragen:
1. Unterstützt die Bibliothek beide Schreibweisen (sowohl i als auch j, einstellbar???)

Jep. ComplexFormat.ImaginaryUnitSymbol einfach entsprechend setzen
user profile iconBenBE hat folgendes geschrieben:
2. Ist die Imaginäre Einheit als Präfix oder Postfix zu verwenden (einstellbar\automatisch erkannt?)

Momentan ist nur die Präfix-Schreibweise (also z.B. 1+j2) erlaubt - werd ich noch einbauen.
user profile iconBenBE hat folgendes geschrieben:
Inwiefern werden Operatoren überladen? (** für Potenzen?)

** kenne ich nicht (diese Referenz hier übrigens auch nicht: msdn.microsoft.com/l...gusageguidelines.asp), ich habe stattdessen ^ überladen - werde ich bei Bedarf noch ändern. Überladen werden aktuell + - * / ^ ~ (vgl. Doku)
user profile iconBenBE hat folgendes geschrieben:
Warum die Trennung der statischen Funktionen von der Klasse ComplexNumber? Sollte man nicht sowohl als auch zulassen?

ausblenden C#-Quelltext
1:
2:
c3 = ComplexNumber.Multiply(c1, c2); //Erzeugt eine neue Instanz, die das Ergebnis enthält
c1.Multiply(c2); //Multipliziert c1 mit c2 und speichert das Ergebnis in c1


Oder ist ComplexNumber als immutable zu betrachten (was eine solche Verwendung ausschließen würde)?

Prinzipiell spricht nichts dagegen - werde ich, wenn ich Zeit habe, implementieren. Wobei das eine eher geringe Priorität hat - eben weil ja die Grundrechenarten durch Operatorüberladung direkt unterstützt werden.

AXMD
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 27.05.06 17:51 
user profile iconMagicAndre1981 hat folgendes geschrieben:
i = Mathematik- und j=Elektrotechnikschreibweise, das lernst du bei Studium ;)

Aber nicht beim Informatik/Mathematik Studium. Zumindest ist mir das "j" noch nie über den Weg gelaufen. Aber man lernt ja nie aus.

_________________
Ist Zeit wirklich Geld?
MagicAndre1981
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 27.05.06 20:24 
user profile iconAndyB hat folgendes geschrieben:
user profile iconMagicAndre1981 hat folgendes geschrieben:
i = Mathematik- und j=Elektrotechnikschreibweise, das lernst du bei Studium ;)

Aber nicht beim Informatik/Mathematik Studium.


Du musst ja auch was gescheites studieren :P :angel:
AXMD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 27.05.06 20:29 
Oben eine neue (hoffentlich sinnvoller aufgeteilte) Version der Bibliothek - es existiert nun nur mehr eine einzige Klasse ComplexNumber, die alle Formatierungs- und sonstige Funktionen beinhaltet - sie ist allerdings (partial) auf 3 Dateien aufgeteilt. Die Add/Subtract/...-Methoden habe ich noch nicht implementiert, dafür alles andere, was gewünscht wurde.

Weitere Verbesserungsvorschläge sind herzlich willkommen :)
AXMD
AXMD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 02.06.06 21:23 
Großes Update ;): der .Visualization-Namespace ist hinzugekommen und bietet umfangreiche Darstellungsmöglichkeiten für komplexe Zahlen. Beispiele und Demo siehe erster Post. Hier im Anhang die Doku und ein Screenshot der Demo (es sind ja nur 3 Anhänge pro Post erlaubt ;)).

AXMD
Einloggen, um Attachments anzusehen!