tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Shakie
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
687
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    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:

    Vectorzeichenprogramm-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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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
    Geändert von KarlPichler (30.01.12 um 17:25 Uhr)
     

  2. #2
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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?
    Zitat Zitat von KarlPichler Beitrag anzeigen
    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?
     
    hihi = -h²

  3. #3
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    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
     

  4. #4
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von KarlPichler Beitrag anzeigen
    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?
     
    hihi = -h²

  5. #5
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    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
     

  6. #6
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Bist du mit den mathematischen Konzepten der Vektor- und Matrixrechnung vertraut? Wenn ja, dann ist deine Aufgabe ganz einfach...
    KarlPichler bedankt sich. 
    hihi = -h²

  7. #7
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    Hallo, danke für den Hinweis, jetzt hab ichs mal mit den drawLines hinbekommen.

    für alle
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
            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
     

  8. #8
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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.
     
    hihi = -h²

  9. #9
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    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