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);
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
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**
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á.