[C#] Bogenendpunkt berechnen

Guten Tag,

Mein Ziel ist es, Biegeformen zu zeichnen. Das ist normalerweise eine Folge von Schenkel/Winkel/Schenkel/Winkel/... usw. Leider gibt es auch noch Radialbiegungen, sprich Bögen.
Schenkel zeichnet es korrekt, den Bogen kann ich auch knapp noch zeichnen, den Endpunkt krieg ich aber nicht richtig berechnet. Aktuell wird dort, wo der Endpunkt berechnet wurde, ein rotes Quadrat gezeichnet - und man sieht sehr schnell, das es nicht dort ist, wo es sein sollte.
Im Anhang findet ihr das volle C# VS 2008 (Express) Projekt. Sollte sich problemlos compilen/starten lassen.

Die Daten liegen natürlich in einer DB, zum testen habe ich mir das ganze aber hardcoded in den Code ausgelagert:

Code:
        public Item[] CreateTestData()
        {

            Item[] oItem = new Item[20];

            oItem[1].size = 50;         // Schenkel, parallel x-achse
            oItem[1].angle = 0;

            oItem[2].size = 45;        // Schenkel, 45° abgebogen vom vorgänger Schenkel.
            oItem[2].angle = 45;

            oItem[3].size = 150;        // Radialbogen - size entspricht der Bogenlänge
            oItem[3].radius = 45;       // Bogenradius
            oItem[3].angle = 0;         // Bogen liegt tangentiell auf Vorgänger Schenkel.
            oItem[3].radiusdirection = vector.Directions.LEFT; // Richtung des Bogens LEFT|RIGHT

            return oItem;
        }
Weiter hier noch die problematische Funktion:
Code:
private Point CalcArcEndPoint(vector BaseVector, double bogenlaenge, double radius, vector.Directions Direction, Point StartPoint)
        {
            double Angle2X = BaseVector.GetAngle2X();
            double BogenWinkel = GetBowAngle(bogenlaenge, radius) + Angle2X;
            double BogenSehne = 2 * radius * Math.Sin(Degree2RAD(BogenWinkel / 2));
            Point BowEndPoint = new Point();

            //Delta x/y vom Bogenstartpunkt zu Bogen Endpunkt berechnen
            BowEndPoint.X = (int)(Math.Sin(Degree2RAD(Math.Round(BogenWinkel, 0))) * radius);
            BowEndPoint.Y = (int)(Math.Abs((Math.Cos(Degree2RAD(Math.Round(BogenWinkel, 0)))-1)) * radius);

            if (Direction == vector.Directions.RIGHT)
            {
                BowEndPoint.Y = BowEndPoint.Y * -1;
                BowEndPoint.X = BowEndPoint.X * -1;
            }
                
            BowEndPoint.X += StartPoint.X;
            BowEndPoint.Y += StartPoint.Y;
            
            return BowEndPoint;
        }
Kuze erklärung dazu:
Als Parameter benötige ich erstmal den Vorgängerschenkel in Form des BaseVektor. Damit lässt sich bestimmen, wie die Tangente an welche der Kreisbogen gelegt wird, im 2D Raum liegt.
Bogenlänge/Radius definieren den Bogen. Direction zeigt, ob der Bogen nach Links oder Rechts geht.
StartPoint enthällt die Startkoordinaten des Bogens.
Gesucht sind wie gesagt die Endkoordinaten des Bogens.

Ich mühe mich nun schon seit Tagen damit ab, immer wieder mit anderen Ansätzen - meine Geometrieberechnungen funktionieren auf dem Blatt -im Code aber nicht.

Die Klasse vector habe ich übrigens selber geschrieben - also auch da könnte ein Fehler sein...
Desweiteren ist beim GDI+ Koordinatensystem die Y-Achse *(-1) verdreht zum normalen kartesischen.

Danke an jeden, der sich das mal anschaut. :P
Grüsse, 90nop
 
Zuletzt bearbeitet:
Zurück
Oben