Laden...

[gelöst] Pie, Vector aus Winkel und Radius

Erstellt von KainPlan vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.527 Views
K
KainPlan Themenstarter:in
133 Beiträge seit 2009
vor 14 Jahren
[gelöst] Pie, Vector aus Winkel und Radius

Ich weiß nict genau wie ich mich jetzt ausdrücken soll aber ich möchte gerne einen Vector anhand eines Winkel und einem Radius errechnen. Ist das irgendwie möglich? Bin nicht so das Mathegenie wüsste auch nicht wie ich sowas Suchen sollte...

Ich möchte nämlich ein Kreisdiagramm zeichnen und mittels Pfeilen auf dessen Teilstücke zeigen.


                // Calculate & Draw Pie
                float ang = totalStep * (TotalSize - FreeSpace);
                Rectangle pieTop = new Rectangle(bounds.Width - 80 - 8, 8, 80, 80);


                b.Color = Color.FromArgb(100, Color.Red);
                dc.FillPie(b, pieTop, 0 - 90, ang);
                p.Color = clTable.Text;
                dc.DrawPie(p, pieTop, 0 - 90, ang);
                b.Color = Color.FromArgb(100, Color.Blue);
                dc.FillPie(b, pieTop, ang - 90, 360 - ang);
                p.Color = Color.FromArgb(50, 255, 255, 255);
                p.Width = 1.5F;
                dc.DrawEllipse(p, pieTop);

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo KainPlan,

s. Trigonometrische Funktionen.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

K
KainPlan Themenstarter:in
133 Beiträge seit 2009
vor 14 Jahren

Hab mir das ganze mal angeschaut und folgendes ist dabei herumgekommen:


        private PointF PosFrom(double ang, double radius)
        {
            if (ang < 0 || ang > 360)
                throw new Exception("ang have to be between 0 - 360.");
                        
            double fcos = 1;
            double fsin = 1;
            
            /*   	        ± 	        sin± 	cos± 	tan± 	cot±
             * 1. Quadrant 	0–90° 	    + 	    + 	    +    	+
             * 2. Quadrant 	90–180° 	+ 	     	     	    
             * 3. Quadrant 	180–270° 	 	     	    +    	+
             * 4. Quadrant 	270–360° 	 	    +   	 	    
             */
            if (ang  < 90)
            {
                fcos = 1;
                fsin = 1;
            }
            else if (ang < 180)
            {
                fcos = -1;
                fsin = 1;
            }
            else if (ang < 270)
            {
                fcos = -1;
                fsin = -1;
            }
            else if (ang < 360)
            {
                fcos = 1;
                fsin = -1;
            }

            double cos = Math.Cos(ang);
            double sin = Math.Sin(ang);

            PointF B = new PointF();
            B.X = (float)(cos * radius * fcos);
            B.Y = (float)(sin * radius * fsin);

            return B;
        }

Funktioniert aber nicht so wirklich 🤔 irgendwas mach ich wohl noch falsch jemand ne idee?
**
[EDIT] Math.Cos sowie Math.Sin und Math.Tan erwarten Bogenmaß omfg... da hab ich jetzt dran geschraubt... is mir beim debuggen aufgefallen cos war bei nem wert von 90 nicht 0 ich dacht ich fall vom glauben ab... xD**

K
KainPlan Themenstarter:in
133 Beiträge seit 2009
vor 14 Jahren

So hier nochmal eine vernünftige funktion zur Lösung des Problems:


        /// <summary>
        /// Berechnet anhand eines gegebenen Winkels (a) und des Radius (r) 
        /// einen von [0, 0] ausgehenden Vector.
        /// </summary>
        /// <param name="a"> Winkel. </param>
        /// <param name="r"> Radius. </param>
        /// <returns>Der Vector.</returns>
        private PointF AngleToPosition(double a, double r)
        {                       
            // Bogenmaß des Winkels errechnen
            a *= (Math.PI / 180);

            // Kosinus des Winkels a 
            double cos = Math.Cos(a);
            // Sinus des Winkels a 
            double sin = Math.Sin(a);

            // Der Vector
            PointF B = new PointF();
            B.X = (float)(cos * r);
            B.Y = (float)(sin * r);
            return B;
        }

**Anwendungsbeispiel: **
Wie man auf dem von mir angehängten Bild erkennen kann zeigen zwei Linien auf die Mittelpunkte der Kreisdiagrammteile. Um diese Mittelpunkte zu errechnen wird die obige funktion mit der hälfte des Winkels des einen Kreisdiagrammteil und dessen Radius * .75f aufgerufen. Der daraus resultierende Vektor wird mit dem Mittelpunkt des Kreisdiagrammes einfach addiert. Eviolá.