none
Kreis in Polardarstellung umwandeln RRS feed

  • Frage

  • Also wiedereinmal ein eher ungewöhnliches Problem meinerseits.

    Ich habe einen Kreis und in diesem Kreis ist ein ebenfalls kreisförmiger Auschnitt, wenn auch nicht exakt in der Mitte.

    Also in etwa wie im Bild oben, auch wenn die Kreise in meiner Anwendung rund und nicht eierförmig sind.

    Meine Frage ist nun ob es möglich ist nur die Fläche zwischen innerem und äußerem Kreis in die Polardarstellung (also ein rechteckiges Bild fester Höhe und Breite) umzuwandeln. Ich habe dazu bereits im Internet gesucht, allerdings nichts brauchbares gefunden. Ich hoffe ihr könnt mir da weiterhelfen.


    Mittwoch, 14. März 2012 15:28

Antworten

  • Hi,

    naja, wenn Du einen Kreis in ein Rechteck projizieren willst, musst Du Dir überlegen, wie Du mit den verschieden langen Strecken (Umfang an aktueller y-position zu Gesamtumfang) umgehst. Hier ein Beispiel, wie man einen Kreis in ein Rechteck "abrollen" könnte (hier: gegen den Uhrzeigersinn), so daß der Mittelpunkt des Kreises an x= 0, y= Radius liegt (ohne die Koordinaten zu interpolieren, einfach als Ints):

        public partial class Form1 : Form
        {
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.PictureBox pictureBox1;
            private System.Windows.Forms.PictureBox pictureBox2;
            Random _rnd = new Random();
    
            public Form1()
            {
                InitializeComponent();
    
                //normalerweise via Designer
                Init();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.pictureBox1.Image = GetCircleBitmap(pictureBox1.ClientSize);
            }
    
            private Image GetCircleBitmap(Size size)
            {
                Bitmap bmp2 = new Bitmap(size.Width, size.Height);
    
                using (Bitmap bmp = new Bitmap(size.Width, size.Height))
                {
                    using (Graphics g = Graphics.FromImage(bmp))
                    {
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                        g.Clear(Color.Green);
    
                        for (int i = 0; i < 20; i++)
                        {
                            //ein bischen über den Rand herauslapen lassen
                            Point pt = new Point(_rnd.Next(bmp.Width), _rnd.Next(bmp.Height));
                            Size sz = new Size(_rnd.Next(bmp.Width / 2), _rnd.Next(bmp.Height / 2));
                            Color c = Color.FromArgb(255, _rnd.Next(256), _rnd.Next(256), _rnd.Next(256));
    
                            using (SolidBrush sb = new SolidBrush(c))
                                g.FillEllipse(sb, new Rectangle(pt, sz));
                        }
                    }
    
                    using (TextureBrush t = new TextureBrush(bmp))
                    {
                        using (Graphics g = Graphics.FromImage(bmp2))
                        {
                            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                            g.FillEllipse(t, 0, 0, bmp2.Width, bmp2.Height);
                        }
                    }
                }
    
                return bmp2;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.pictureBox2.Image = GetRectangularShapeOfCircle((Bitmap)this.pictureBox1.Image);
            }
    
            private Image GetRectangularShapeOfCircle(Bitmap bIn)
            {
                //Max-Radius und -Umfang
                double radBig = bIn.Width / 2.0;
                double uBig = radBig * 2.0 * Math.PI;
    
                Bitmap bOut = new Bitmap((int)Math.Ceiling(uBig), (int)Math.Ceiling(radBig));
    
                //center
                double cX = radBig;
                double cY = radBig;
    
                for (int y = 0; y < bOut.Height; y++)
                {
                    //aktueller Radius
                    double radCur = radBig - y;
    
                    for (int x = 0; x < bOut.Width; x++)
                    {
                        //aktueller winkel in radians
                        double wCur = x / radCur;
    
                        if (wCur >= 0.0 && wCur <= Math.PI * 2.0)
                        {
                            //Koordinatenberechnung aus dem Originalbild           
                            double rX = Math.Sin(wCur) * radCur;
                            double rY = Math.Cos(wCur) * radCur;
    
                            //...vom Mittelpunkt aus
                            double lX = rX + cX;
                            double lY = rY + cY;
    
                            //un-interpolierte Werte, einfach die Koordinaten auf int gecastet
                            if (lX >= 0 && Math.Floor(lX) < bIn.Width && lY >= 0 && Math.Floor(lY) < bIn.Height)
                            {
                                bOut.SetPixel(x, y, bIn.GetPixel((int)lX, (int)lY));
                            }
                        }
                    }
                }
    
                return bOut;
            }
    
            private void Init()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                this.pictureBox2 = new System.Windows.Forms.PictureBox();
    
                this.button1.Location = new System.Drawing.Point(879, 236);
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.Text = "button1";
                this.button1.Click += new System.EventHandler(this.button1_Click);
    
                this.pictureBox1.Location = new System.Drawing.Point(12, 12);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(200, 200);
    
                this.pictureBox2.Location = new System.Drawing.Point(240, 12);
                this.pictureBox2.Name = "pictureBox2";
                this.pictureBox2.Size = new System.Drawing.Size(714, 200);
    
                this.ClientSize = new System.Drawing.Size(979, 271);
                this.Controls.Add(this.pictureBox2);
                this.Controls.Add(this.pictureBox1);
                this.Controls.Add(this.button1);
    
                this.Load += new System.EventHandler(this.Form1_Load);
            }
        }

    Viele Grüße,

      Thorsten

    • Als Antwort markiert Simon Rühle Freitag, 16. März 2012 18:00
    Freitag, 16. März 2012 16:11

Alle Antworten

  • Hi,

    was meinst Du mit "rechteckiges Bild fester Höhe und Breite"? http://de.wikipedia.org/wiki/Polarkoordinaten 

    (Normalerweise ist am Computer ein (Raster-)Bild rechteckig und hat für gewöhnlich auch eine feste Größe)

    Viele Grüße,

      Thorsten

    Mittwoch, 14. März 2012 18:35
  • Meine Frage ist nun ob es möglich ist nur die Fläche zwischen innerem und äußerem Kreis in die Polardarstellung (also ein rechteckiges Bild fester Höhe und Breite) umzuwandeln.

    Wenn Du nur die Fläche zwischen zwei Kreisen zeichnen willst, geht das sehr einfach mittels GraphicsPath... (Ein Koordinatensystem, kannst Du Dir ja dahinter zeichnen... falls nötig)

      public partial class Form1 : Form
        {
            System.Drawing.Drawing2D.GraphicsPath _gP = null;
            public Form1()
            {
                InitializeComponent();
                _gP = new System.Drawing.Drawing2D.GraphicsPath();
                _gP.AddEllipse(new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height));
                _gP.AddEllipse(new RectangleF(this.ClientSize.Width / 2f + 30, this.ClientSize.Height / 2f, this.ClientSize.Width / 4f, this.ClientSize.Height / 4f));
                this.Paint +=new PaintEventHandler(Form1_Paint);
                this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
            }
    
            void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (_gP != null)
                    _gP.Dispose();
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                if (_gP != null)
                    e.Graphics.FillPath(Brushes.Red, _gP);
            }
        }

    Viele Grüße,

      Thorsten


    Mittwoch, 14. März 2012 18:42
  • @ Thorsten: Ich werd deinen Vorschlag einmal ausprobieren, auch wenn ich nicht weiß ob es das ist was ich gesucht habe.

    Also hier nochmal zwei Bilder zur Erläuterung:

    Bild vorher.

    Bild nachher.

    Mittwoch, 14. März 2012 19:22
  • ... aha, und wie soll das gemacht werden? Sollen die roten Flächen in beiden Bildern die gleiche Größe haben? Wie kommt das Rechteck zustande (wenn Du den Kreis "abrollen" würdest wäre die Form ja eher ein Trapez) ?

    Mein code dient nur zur Darstellung, kannste getrost vergessen für diesen "task".

    Viele Grüße,

      Thorsten


    Mittwoch, 14. März 2012 19:57
  • Umgangsprachlich gesagt soll der Kreis unten "aufgeschnitten" werden und gerade gezogen werden und anschließend in die Rechtecksform gepresst werden.

    Ich bin nicht der größte Zeichner, aber ich hoffe man kann erkennen wie ich es meine.

    Mittwoch, 14. März 2012 20:13
  • Hallo Simon,

    Deine Anforderung ist eine anspruchsvolle mathematische Aufgabe. Das lässt sich lösen mit Hilfe einer Koordinatentransformation

    Für die Mathematik hat NET einiges zu bieten: z.B. die Math Class und wenn es genau werden soll die Double Structure 

    Wie Du in GDI mit Kreisen umgehen kannst, hat Thorsten Dir schon gezeigt.

    Ich überlege mal

    Gruss Ellen


    Ich benutze/ I'm using VB2008 & VB2010

    Mittwoch, 14. März 2012 20:15
  • Umgangsprachlich gesagt soll der Kreis unten "aufgeschnitten" werden und gerade gezogen werden und anschließend in die Rechtecksform gepresst werden.

    Ich bin nicht der größte Zeichner, aber ich hoffe man kann erkennen wie ich es meine.

    Hallo Simon,

    also die Fläche zwischen den beiden Kreisen soll ab dem Winkel des geringsten Abstandes beider Kreise  radial bezogen auf den Mittelpunkt des inneren Kreises normiert transformiert werden?

    Ich habe hier einen code gefunden. Ist banal, aber würde den Lösungsansatz treffen: Analog clock

    Vielleicht hilft Dir das

    schöne Grüsse Ellen


    Ich benutze/ I'm using VB2008 & VB2010

    Mittwoch, 14. März 2012 20:36
  • Hallo,

    wie sollen die ungleich-langen Strecken denn verzerrt werden? (z.B: die Differenz zwischen Innen- und Außenradius?) Soll die kürzere der beiden Strecken "aufgezogen", verlängert werden? Sollen beide Flächen aber gleich groß sein? Generell wirst Du hier mit einem (wohl speziellen) Verzerrungs-Algorithmus die Koordinaten mappen. Hierzu ist es oftmals am Günstigsten, man setzt einen Array in Größe des Zielbildes auf und schreibt an jede Koordinate des Array die errechnete Position im Originalbild. (Quasi, wo soll der Wert an dieser Stelle herkommen). Anschließend schickt man Original und Zielbild, sowie den Array an eine Displacement-Methode die die Übertragung vornimmt.

    http://www.codeproject.com/Articles/3419/Image-Processing-for-Dummies-with-C-and-GDI-Part-5

    Oder auch - eine Test-Anwendung die obiges nutzt (z.B. um jemanden die Nase lang zu ziehen :-) - die Undo-Konstruktoren sind sicher nicht die endgültig genutzten... ich war nur zu faul, für ein Testprogramm die ganzen Parameter "auseinander zu nehmen" und nur das Nötige jeweils zu nutzen...

    https://skydrive.live.com/redir.aspx?cid=d5e5bd21dbf5e4e9&resid=D5E5BD21DBF5E4E9!2151&parid=D5E5BD21DBF5E4E9!1479&authkey=!

    Viele Grüße,

      Thorsten





    Mittwoch, 14. März 2012 20:58
  • Danke für die Antworten, allerdings muss ich, bevor ich eine als Antwort markiere, denke ich ersteinmal jede durchgehen, ob sie das trifft, was ich wollte. Das kann, da ich im Moment viel zu tun habe, allerdings ein wenig dauern.

    Auf den ersten Blick könnte allerdings die Lösung dabei sein.

    Donnerstag, 15. März 2012 11:45
  • Also ich habe mir das näher angesehen und der Wikipedia Artikel beinhaltet die mathematischen Grundlagen. Jedoch ist das Problem, das mein Code 1. ewig braucht und 2. nicht so rechts funktioniert.

    public static Bitmap CircleToRectangle(Bitmap bmp)
            {
                Bitmap bmpResult = new Bitmap(bmp.Width * 2, bmp.Height / 2);
                Point middlePoint = new Point(bmp.Width / 2, bmp.Height / 2);
                Color pixTemp;
                Point currentPosition=new Point();
                Point newPosition = new Point();
    
                for (int line = 0; line < bmp.Width; ++line)
                {
                    for (int column = 0; column < bmp.Height; ++column)
                    {
                        pixTemp = bmp.GetPixel(line, column);
                        currentPosition.X = line;
                        currentPosition.Y = column;
                        newPosition = CalculatePolToKat(currentPosition,middlePoint);
                        try
                        {
                            bmpResult.SetPixel(newPosition.X, newPosition.Y, pixTemp);
                        }
                        catch { }
                    }
                }
                return bmpResult;
            }
    
            private static Point CalculatePolToKat(Point currentPosition, Point centre)
            {
                double radius;
                double angle;
                Point pointToReturn = new Point();
                int x;
                int y;
    
                if (currentPosition.Y > centre.Y)
                {
                    y = centre.Y - currentPosition.Y;
                    if (currentPosition.X == centre.X)
                    {
                        angle = 90;
                        pointToReturn.X = (int)Math.Round(y * Math.Cos(angle));
                        pointToReturn.Y = (int)Math.Round(y * Math.Sin(angle));
                    }
                    else
                    {
                        if (currentPosition.X < centre.X)
                        {
                            x = centre.X - currentPosition.X;
                            angle = Math.Atan(x / y) + 90;
                            radius = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                            pointToReturn.X = (int)Math.Round(radius * Math.Cos(angle));
                            pointToReturn.Y = (int)Math.Round(radius * Math.Sin(angle));
                        }
                        else
                        {
                            x = currentPosition.X - centre.X;
                            angle = Math.Atan(y / x);
                            radius = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                            pointToReturn.X = (int)Math.Round(radius * Math.Cos(angle));
                            pointToReturn.Y = (int)Math.Round(radius * Math.Sin(angle));
                        }
                    }
                }
                else
                {
                    if (currentPosition.Y == centre.Y)
                    {
                        if (currentPosition.X > centre.X)
                        {
                            angle = 0;
                            x=currentPosition.X-centre.X;
    
                        }
                        else
                        {
                            angle = 180;
                            x=centre.X-currentPosition.X;
                        }
    
                    }
                    else
                    {
                        y = currentPosition.Y - centre.Y;
                        if (currentPosition.X > centre.X)
                        {
                            x = centre.X - currentPosition.X;
                            angle = Math.Atan(x / y) + 90;
                            radius = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                            pointToReturn.X = (int)Math.Round(radius * Math.Cos(angle));
                            pointToReturn.Y = (int)Math.Round(radius * Math.Sin(angle));
                        }
                        else
                        {
                            x = currentPosition.X - centre.X;
                            try
                            {
                                angle = Math.Atan(y / x);
                                radius = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
                                pointToReturn.X = (int)Math.Round(radius * Math.Cos(angle));
                                pointToReturn.Y = (int)Math.Round(radius * Math.Sin(angle));
                            }
                            catch
                            {
                                pointToReturn.X = 0;
                                pointToReturn.Y = 0;
                            }
                        }
                    }
                }
                return pointToReturn;
            }

    Das Problem ist, dass ich im Bild nur mit ganzen Zahlen abrbeiten kann, jedoch die exakten Positionen ungerade sind.

    Hat jemand ein Idee, wie ich das lösen kann?

    Donnerstag, 15. März 2012 18:27
  • Hi,

    das Problem lässt sich lösen, wenn man den Vorgang "anders herum" durchführt. Du berechnest dann nicht die neue Position, sondern gehts durch das neue Bild und berechnest die Position im Ausgangsbild, von der die Farbwerte geholt werden sollen. Da Du auch dort Nachkommastzellen erhälst, kannst Du die Werte interpolieren. Siehe dazu auch meinen Link zur codeproject-Seite in meiner vorigen Antwort, sowie: http://www.codeproject.com/Articles/2122/Image-Processing-for-Dummies-with-C-and-GDI-Part-4 .

    Grundsätzlich ist es besser, immer über die neuen fixen Positionen zu "loopen" und sich die Werte aus den berechnten Positionen aus dem Ausgansgibld zu holen, weil so auch jede Koordinate im neuen Bild sicher einen Wert zugewiesen bekommt.

    Viele Grüße,

      Thorsten


    Donnerstag, 15. März 2012 20:25
  • Danke für die schnelle Antwort, es scheint mir aber, dass ich mit solchen Berechnungen noch Schwierigkeiten habe (wobei es auch das erste mal ist, das ich etwas mathematisches Programmiere).

    Ich habe jetzt den Code umgeschrieben, wobei das Ergebnis komisch ist. Wenn die berechneten Punkte falsch wären, so müsste das resultierende Bild rot sein, wobei es nur schwarz ist.

    public static Bitmap CircleToRectangle(Bitmap bmp)
            {
                Bitmap bmpResult = new Bitmap((int)(1*Math.PI*(bmp.Height/2)), bmp.Height / 2);
                Point middlePoint = new Point(bmp.Width / 2, bmp.Height / 2);
                Color pixTemp;
                Point currentPosition=new Point();
                Point newPosition = new Point();
    
                for (int line = 0; line < bmpResult.Width; ++line)
                {
                    for (int column = 0; column < bmpResult.Height; ++column)
                    {                    
                        currentPosition.X = line;
                        currentPosition.Y = column;
                        newPosition = CalculateKatToPol(currentPosition, middlePoint);
                        try
                        {
                           pixTemp= bmp.GetPixel(newPosition.X, newPosition.Y);
                        }
                        catch 
                        {
                            pixTemp = Color.Red;
                        }
                        bmpResult.SetPixel(line, column, pixTemp);
                    }
                }
                return bmpResult;
            }
    
            private static Point CalculateKatToPol(Point currentPosition, Point middlePoint)
            {
                int radius = (int) Math.Round(Math.Sqrt(Math.Pow(currentPosition.X, 2) + Math.Pow(currentPosition.Y, 2)));
                double phi;
                if (currentPosition.Y >= 0)
                {
                    if (radius == 0)
                    {
                        phi = Math.Acos(currentPosition.X);
                    }
                    else
                    {
                        phi = Math.Acos(currentPosition.X / radius);
                    }
                }
                else
                {
                    phi = Math.Acos(currentPosition.X / radius) * -1;
                }
                int y = (int)Math.Sin(phi) * radius;
                if (y <= 0)
                {
                    y = middlePoint.Y - y;
                }
                else
                {
                    y += middlePoint.Y;
                }
                int x = (int)Math.Sin(phi) * radius;
                if (x <= 0)
                {
                    x += middlePoint.X;
                }
                else
                {
                    x = middlePoint.X - x;
                }
    
                return new Point(x, y);
            }
    Hat jemand eine Idee, woran da liegt?
    Freitag, 16. März 2012 10:08
  • Hi,

    naja, wenn Du einen Kreis in ein Rechteck projizieren willst, musst Du Dir überlegen, wie Du mit den verschieden langen Strecken (Umfang an aktueller y-position zu Gesamtumfang) umgehst. Hier ein Beispiel, wie man einen Kreis in ein Rechteck "abrollen" könnte (hier: gegen den Uhrzeigersinn), so daß der Mittelpunkt des Kreises an x= 0, y= Radius liegt (ohne die Koordinaten zu interpolieren, einfach als Ints):

        public partial class Form1 : Form
        {
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.PictureBox pictureBox1;
            private System.Windows.Forms.PictureBox pictureBox2;
            Random _rnd = new Random();
    
            public Form1()
            {
                InitializeComponent();
    
                //normalerweise via Designer
                Init();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.pictureBox1.Image = GetCircleBitmap(pictureBox1.ClientSize);
            }
    
            private Image GetCircleBitmap(Size size)
            {
                Bitmap bmp2 = new Bitmap(size.Width, size.Height);
    
                using (Bitmap bmp = new Bitmap(size.Width, size.Height))
                {
                    using (Graphics g = Graphics.FromImage(bmp))
                    {
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                        g.Clear(Color.Green);
    
                        for (int i = 0; i < 20; i++)
                        {
                            //ein bischen über den Rand herauslapen lassen
                            Point pt = new Point(_rnd.Next(bmp.Width), _rnd.Next(bmp.Height));
                            Size sz = new Size(_rnd.Next(bmp.Width / 2), _rnd.Next(bmp.Height / 2));
                            Color c = Color.FromArgb(255, _rnd.Next(256), _rnd.Next(256), _rnd.Next(256));
    
                            using (SolidBrush sb = new SolidBrush(c))
                                g.FillEllipse(sb, new Rectangle(pt, sz));
                        }
                    }
    
                    using (TextureBrush t = new TextureBrush(bmp))
                    {
                        using (Graphics g = Graphics.FromImage(bmp2))
                        {
                            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                            g.FillEllipse(t, 0, 0, bmp2.Width, bmp2.Height);
                        }
                    }
                }
    
                return bmp2;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.pictureBox2.Image = GetRectangularShapeOfCircle((Bitmap)this.pictureBox1.Image);
            }
    
            private Image GetRectangularShapeOfCircle(Bitmap bIn)
            {
                //Max-Radius und -Umfang
                double radBig = bIn.Width / 2.0;
                double uBig = radBig * 2.0 * Math.PI;
    
                Bitmap bOut = new Bitmap((int)Math.Ceiling(uBig), (int)Math.Ceiling(radBig));
    
                //center
                double cX = radBig;
                double cY = radBig;
    
                for (int y = 0; y < bOut.Height; y++)
                {
                    //aktueller Radius
                    double radCur = radBig - y;
    
                    for (int x = 0; x < bOut.Width; x++)
                    {
                        //aktueller winkel in radians
                        double wCur = x / radCur;
    
                        if (wCur >= 0.0 && wCur <= Math.PI * 2.0)
                        {
                            //Koordinatenberechnung aus dem Originalbild           
                            double rX = Math.Sin(wCur) * radCur;
                            double rY = Math.Cos(wCur) * radCur;
    
                            //...vom Mittelpunkt aus
                            double lX = rX + cX;
                            double lY = rY + cY;
    
                            //un-interpolierte Werte, einfach die Koordinaten auf int gecastet
                            if (lX >= 0 && Math.Floor(lX) < bIn.Width && lY >= 0 && Math.Floor(lY) < bIn.Height)
                            {
                                bOut.SetPixel(x, y, bIn.GetPixel((int)lX, (int)lY));
                            }
                        }
                    }
                }
    
                return bOut;
            }
    
            private void Init()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                this.pictureBox2 = new System.Windows.Forms.PictureBox();
    
                this.button1.Location = new System.Drawing.Point(879, 236);
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.Text = "button1";
                this.button1.Click += new System.EventHandler(this.button1_Click);
    
                this.pictureBox1.Location = new System.Drawing.Point(12, 12);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(200, 200);
    
                this.pictureBox2.Location = new System.Drawing.Point(240, 12);
                this.pictureBox2.Name = "pictureBox2";
                this.pictureBox2.Size = new System.Drawing.Size(714, 200);
    
                this.ClientSize = new System.Drawing.Size(979, 271);
                this.Controls.Add(this.pictureBox2);
                this.Controls.Add(this.pictureBox1);
                this.Controls.Add(this.button1);
    
                this.Load += new System.EventHandler(this.Form1_Load);
            }
        }

    Viele Grüße,

      Thorsten

    • Als Antwort markiert Simon Rühle Freitag, 16. März 2012 18:00
    Freitag, 16. März 2012 16:11
  • ... wenn Du eine andere Projektion wünscht - z.B die untere Seite des Rechecks ist überall der Kreismittelpunkt, wie bei vielen Erd-karten die Pole, dann siehe hier:

    http://de.wikipedia.org/wiki/Kartennetzentwurf (Flächen- vs Längen-treue Projektionen)

    Viele Grüße,

      Thorsten

    Freitag, 16. März 2012 17:22