Vectorzeichenprogramm

KarlPichler

Mitglied
Hallo an alle!

Hab mal wieder ne Frage.
Bin gerade dabei ein Zeichenprogramm zu programmieren. Bin auch schon ziemlich weit, aber für das letzte fehlende Puzzle- Stück fehlt mir einfach die Logik, od. vl. gehts auch einfach nicht so! Ich bitte um eure Hilfe:

Erklärung:

bild1.jpg

Als ersten Schritt lass ich den Benutzer den Ausgangspunkt bestimmen! (New Origin Position)

Nun möchte ich mit den beiden Buttons (str -> STRAIGHT, cu-> CURVE) eine Bahn zeichen lassen! Die STRAIGHT sollte sich immer dem Winkel der vorherigen Kurve anpassen, also im gleichen Winkel gezeichnet werden! Bei der STRAGHT kann der User nur ne Länge angeben, bei Kurven kann er den raidus und relativen Winkel angeben!

Für das Zeichen habe ich mir ein Array aus Frames angelegt!

Code:
public struct FrameXYA
        {
            public int XStart, YStart, AngleStart, XEnd, YEnd, AngleEnd;
        }


---------------------------------------------

FrameXYA[] iF_Frames = new FrameXYA[FramesCount];

Allerdings habe ich keinen plan wie ich das berechnen soll!? Mit 90° Kurven ist es ja kein Problem!

So sieht mein Koordinatensystem aus (Standart):

-x/-y | +x/-y
------------|---------------------
-x/+y | +x/+y

Aber wenn ich nun z.B.: 30° Kurven zeichen soll, bin ich hilflos!

Sollten die positionen Stimmen, wie Funktioniert danach der DrawArc? Da wird ja immer von einem gesamten Kreis ausgeganen oder?

Und noch eine Frage: Mit den 4 Pfeilen am oberen rechten Rand kann ich den Mittelpunkt meines Koordinatensystems verschieben! Wie kann ich das mit der Maus realisieren? Das aus und ein Zoom funktioniert wunderbar!

Vl. hat schon mal sowas ähnliches gemacht!?
Ihr wärd meine Rettung!

Danke!
Lg
 
Zuletzt bearbeitet:

Shakie

Erfahrenes Mitglied
Bei der DrawArc-Methode kannst du angeben, ab welchem Winkel angefangen werden soll zu zeichnen und wie viel Winkelstück der Bogen dann besitzen soll.
Aber ich glaube du hast hier eher ein Mathe-Problem als ein Programmier-Problem, oder?
Allerdings habe ich keinen plan wie ich das berechnen soll!?
Was genau meinst du mit "das"? Über was weißt du nicht, wie du es berechnen sollst?
 

KarlPichler

Mitglied
Hey erstmal danke!
Ja wie schon im Beitrag oben beschrieben, bin ich eigentlich mit dem Implementieren meiner Funktionen soweit fertig, funktioniert auch alles recht gut!
Auch der letzte Punkt (Koordinatensystem verschieben) hat sich erledigt.

Und wie du auch richtig erkannt hast, habe ich eher ein Mathe Problem, aber hab mir gedacht ich schreibs mal in diese Forum, vl. hat ja jemand sowas schon mal gemacht,

Ich probiers nochmal zu erklären:

Am Beginn der Zeichnung muss der User einmal die Startorientieren eingeben. (Sprich ob dieser in YPlus, YMinus, XPlus oder XMinus zu zeichnen beginnen möchte)

Danach hat der User zwei Buttons zur Auswahl: STRAIGHT od. CURVE.
Es muss immer eine Straight auf eine Kurve folgen (dann wieder Kurve und wieder Straight, etc .. )

Die Straight muss immer der Kurve folgen, sprich im selben Winkel weiter gezeichnet werden!

Ich habe nun ein FrameBegin Array und FramEnd Array, wo ich immer die Anfangswerte und die Endwerte eines Teilstückes abspeichere.

Mit diesen beiden Arrays möchte ich danach die Gesamte Bahn zeichnen!

Allerdings weis ich nicht wie ich die Frames in einer allgemeinen Form berechnen kann, weil mir eben für das die Logik fehlt! Mein Hirn raucht, und du Bahn sieht trotzdem nicht so als wie sie sollte ;)

Bitte helft mir! Danke
 

Shakie

Erfahrenes Mitglied
Ich probiers nochmal zu erklären:

Am Beginn der Zeichnung muss der User einmal die Startorientieren eingeben. (Sprich ob dieser in YPlus, YMinus, XPlus oder XMinus zu zeichnen beginnen möchte)

Danach hat der User zwei Buttons zur Auswahl: STRAIGHT od. CURVE.
Es muss immer eine Straight auf eine Kurve folgen (dann wieder Kurve und wieder Straight, etc .. )

Die Straight muss immer der Kurve folgen, sprich im selben Winkel weiter gezeichnet werden!
Das hatte ich schon so weit alles verstanden. Mir ist nur nicht klar welche Berechnung konkret schief geht. Ist es der Mittelpunkt des Kreises, auf dem dein Bogensegment liegen soll, den du falsch berechnest? Oder ist es der Startwinkel? Oder ist es die Endposition der Geraden? Oder was ist es?
 

KarlPichler

Mitglied
Wie schon oben beschrieben: Es gibt einen FrameBegin und einen FrameEnd Arry. Der FrameBegin bekommt immer die Werte vom FrameEnd[ i-1 ].

Und ich weis nicht wie ich den FramEnd[ i ] berechnen soll!
Bevor ich mir Gedanken über den Kreismittelpunkt mache, möchte ich mal alle Punkte mit drawLine verbinden, und sicher gehen das wenigstens diese Positionen stimmen! Aber ich komme auf keine allgemeine Formel, welche für alle Winkel bzw. Richtungen gilt! Daran scheiters******

Lg und Danke
 

KarlPichler

Mitglied
Hallo, danke für den Hinweis, jetzt hab ichs mal mit den drawLines hinbekommen.

für alle
Code:
        public void GetNewFrameStraight(int index, FrameXYA[] frames, int origin, int length)
        {
            
            if (origin == 0)alpha = 90;
            if (origin == 1) alpha = 270; 
            if (origin == 2) alpha = 180;
            if (origin == 3) alpha = 0;

            if (index == 0)
            {
                frames[index].XStart = 0;
                frames[index].YStart = 0;
                frames[index].AngleStart = alpha;
            }
            if (index > 0)
            {
                frames[index].XStart = frames[index - 1].XEnd;
                frames[index].YStart = frames[index - 1].YEnd;
                frames[index].AngleStart = frames[index - 1].AngleEnd;
            }

            frames[index].XEnd = frames[index].XStart + (float) Math.Cos(frames[index].AngleStart * Math.PI / 180.0) * length;
            frames[index].YEnd = frames[index].YStart + (float) Math.Sin(frames[index].AngleStart * Math.PI / 180.0) * length;      
    }


        public void GetNewFrameCurve(int index, FrameXYA[] frames, int radius, int angle)
        {
            Vector3 v1 = new Vector3();

            if (index > 0)
            {
                frames[index].XStart = frames[index - 1].XEnd;
                frames[index].YStart = frames[index - 1].YEnd;
                frames[index].AngleStart = frames[index - 1].AngleEnd;
            }

            if (angle >= 0.0)
            {
                v1.X = (float)Math.Sin(angle * Math.PI / 180.0) * radius;
                v1.Y = (float)-(1.0 - Math.Cos(angle * Math.PI / 180.0)) * radius;
            }
            else
            {
                v1.X = (float)-Math.Sin(angle * Math.PI / 180.0) * radius;
                v1.Y = (float)(1.0 - Math.Cos(angle * Math.PI / 180.0)) * radius;
            }

            frames[index].XEnd = ((frames[index].XStart + (float)(v1.X * Math.Cos(frames[index].AngleStart * Math.PI / 180.0) - v1.Y * (float)Math.Sin(frames[index].AngleStart * (float)Math.PI / 180.0))));
            frames[index].YEnd = ((frames[index].YStart + (float)(v1.X * Math.Sin(frames[index].AngleStart * Math.PI / 180.0) + v1.Y * (float)Math.Cos(frames[index].AngleStart * (float)Math.PI / 180.0))));
            frames[index].AngleEnd = (frames[index].AngleStart - angle);
        }
    }

Allerdings bin ich nun wieder radlos mit dem Kreismittelpunkt!

@shakie, hast du hierfür eine idee? also das ich die Kurven auch wiklich aus Kurve darstelle!

Danke vielmals
lg
 

Shakie

Erfahrenes Mitglied
Das sollte nicht weiter schwer sein. Den Weg vom Start zum Ziel kannst du über zwei Geraden mit Umweg über den Kreismittelpunkt darstellen. Das heißt von deinem Startpunkt gehst du erst 90° nach rechts oder links (je nach dem ob es eine Rechts- oder Linkskurve ist), wobei die Länge dieser Geraden gleich dem Radius entspricht. Schon bist du beim Kreismittelpunkt angekommen! Wenn du dich vom Mittelpunkt nochmal mit der Länge "Radius" im entsprechenden Winkel entfernst, dann bist du beim Ziel (=Ende des Bogensegments) angelangt.
 

KarlPichler

Mitglied
Okay danke für die Anwort! Vom Prinzip versteh ichs! aber praktisch bring ichs nicht zusammen! hast du ein wenig code für mich?
Danke
 

Neue Beiträge