tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
714
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 liebes Forum,

    Habe eine Frage zu DrawArc:

    Programm Erklärung:

    Der User hat 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!

    Diese Punkte sind mit den färbigen Kreuzen gekennzeichnet.

    Das funktioniert auch soweit gut! Allerdings weis ich nicht wirklich wie ich nun die Kurve zeichen muss, bzw. auf die Werte komme die ich für den DrawArc Befehl brauche.

    DrawArc, aber wie?-d.jpg

    Also ich möchte den Punkt "Pinkes Kreuz" mit dem Punkt "blaues Kreuz" mit einem DrawArc (od. vl. mit einem anderen) verbinden!

    Ich hoffe das Bild hilt euch weiter.

    Nun folgt der Code wie ich die Koordinaten berechne:

    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
    54
    55
    56
    
      public void GetNewFrameStraight(int index, FrameXYA[] frames, int origin, int length)
            {
                
                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;
                frames[index].AngleEnd = frames[index].AngleStart;
                frames[index].Typ = 0;
                frames[index].Id = (float)index;
                
        }
     
     
            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);
                frames[index].Typ = 1;
                frames[index].Id = (float)index;
     
            }

    Bitte helft mir, i versuche es schon ziemlich lange, aber ich komme nicht drauf!

    Lg
     

  2. #2
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    hallo Forum,

    hat niemand eine idee?
    ich komme einfach nicht weiter!
    lg
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Ich habe es doch schon hier erklärt.
     
    hihi = -h²

  4. #4
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    ja stimmt, hab aber auch geschrieben das ichs nicht kapier, und bat dich um ein wenig code!

    mir fehlt total die logik! sorry für meine dummheit

    lg und danke
     

  5. #5
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    Hallo wieder mal,

    @Shakie, hab jetzt wieder mal einen kleinen schritt in richtung ziel geschafft! Allerdings habe ich weiterhin riesen Probleme mit dem DrawArcBefehl.

    Hier mal der Code, den ich verwende um den X, Y für den DrawArc Befehl auszurechnen.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
              radius = /*(Prexe - Prexs)*/ frames[j].Radius / 20 * (float)iZoomFactor;
     
                        Vector3 vecToRadius;
                        if (frames[j].Angle >= 0.0)
                            vecToRadius = new Vector3(-radius, -2.0 * radius, 0);
                        else
                            vecToRadius = new Vector3(-radius, 2.0 * radius, 0);
     
                        vecToRadius.Roll(frames[j-1].AngleEnd); // angle prev section
     
                        vecToRadius += new Vector3(Prexe, Preye, 0);

    Die Vector Klasse hab ich theCodeProject! DrawArc, aber wie?-d2.jpg

    Im folgenden Bild kannst du mein Problem erkennen! Der erste Kreis stimmt noch, aber eben zufällig. Der zweite ist schon falsch!
    Negative werte für width und height sind ja bei DrawArc nicht möglich od.?
    Wie dreh ich nun den DrawArc bzw. was soll ich drehen um das gewünschte Ergebniss zu erhalten?

    Lg und Danke
     

  6. #6
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    @Vektor: Im .Net-Framework gibt es auch eine Vektor3D-Klasse, nämlich im System.Windows.Media.Media3D-Namespace, siehe hier.
    Es spricht aber natürlich nichts dagegen die Vektor-Klasse von CodeProject zu verwenden.

    @DrawArc: Ich weiß nicht wie ich es anders erklären soll...
    Um vom pinken zum gelben Punkt zu gelangen benötigst du zum Beispiel diese drei Vektoren:
    • vecA: Vektor vom Koordinatenursprung (0,0) zum gelben Punkt
    • vecB: Vektor vom gelben Punkt zum Kreismittelpunkt
    • vecC: Vektor vom Kreismittelpunkt zur oberen linken ecke des umschließenden Quadrats
    Ich vermute, dass in deinem Code
    Code csharp:
    1
    
    vecA = new Vector3(Prexe, Preye, 0);  //Sind Prexe und Preye die Koordinaten des pinken Punktes?
    ist.
    Zum Mittelpunkt gelangst du (wenn ich deinen Code richtig interpretiere) mittels:
    Code csharp:
    1
    2
    
    vecB = new Vector3(radius, 0 ,0);  // Vektor mit Länge "Radius" erstellen, der parallel zur X-Achse zeigt
    vecB.Roll(frames[j-1].AngleEnd +- 90);  // Vektor auf Winkel "im pinken Punkt" plus/minus 90° drehen
    Die 90° musst du ggf. im Bogenmaß angeben, ich kenne die CodeProject-Klasse nicht. Das eine Vorzeichen ist für eine Linkskurve, das andere für eine Rechtskurve (welches welches ist musst du wissen)
    Jetzt musst du nur noch vom Kreismittelpunkt zur linken oberen Ecke gehen:
    Code csharp:
    1
    
    vecC = new Vector3(+-radius, +-radius, 0);  // Vektor mit Länge "sqrt(2)*Radius" erstellen, der vom Kreismittelpunkt zur linken oberen Ecke des umschließenden Quadrats zeigt
    Die richtigen Vorzeichen in vecC hängen wieder von der Wahl deines Koordinatensystems ab. Wenn die positive X-Achse nach rechts und die positive Y-Achse nach unten geht, dann musst du jeweils ein Minus wählen.
    Den gelben Punkt erreichst du dann per Addition dieser drei Vektoren:
    Code csharp:
    1
    
    GelberPunkt = vecA + vecB + vecC;
    Geändert von Shakie (09.02.12 um 13:40 Uhr)
     
    hihi = -h²

  7. #7
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    Okay ich checks nicht ganz.
    Also der gelbe Punkt wird bereits errechnet!
    Hab nur probier den x und y Kordinate etwas zu verschieben!
    Den wirklichen Mittelpunkt des Kreises berechne ich auch! --> dank deiner Hilfe

    Allerdings geht der DrawArc immer vom linken oberen Punkt weg? (also seine x und y Location) richtig?, und nicht vom Mittelpunkt des Kreises!

    Jap Prexe und Prexy sind immer die Endkoordinaten des vorgehenden Segments!

    Gibt es eine Klasse bzw. einen Befehl der mir den DrawArc aus der mitte zeichnet?

    Also so: Links ist momentan, und rechts hätte ich gern!

    DrawArc, aber wie?-d3.jpg
    Dann wärs erheblich einfacher!

    Danke und Lg
     

  8. #8
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    DrawArc will immer die linke obere Ecke des Quadrats/Rechtecks haben. Hier bietet es sich an mal einen Blick in die Dokumentation in der MSDN zu werfen.
     
    hihi = -h²

  9. #9
    KarlPichler KarlPichler ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Beiträge
    62
    Ich glaub das schrieb ich bereits im vorherigen beitrag!

    Ich war auf der suche nach einem DrawArc ersatz, der eben von der mitte aus zeichnet

    lg
     

  10. #10
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Den gibt's aber nicht. Ist aber auch nicht schwierig selber zu programmieren...
     
    hihi = -h²

Ähnliche Themen

  1. Endposition DrawArc
    Von KarlPichler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 8
    Letzter Beitrag: 17.08.11, 11:40
  2. Problem mit drawArc()
    Von KarlPichler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 11
    Letzter Beitrag: 12.08.11, 12:41
  3. OCR aber wie?
    Von igfas im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 24.07.06, 10:24
  4. Fur ? Aber wie ?
    Von GRUBER im Forum Autodesk Maya (ehemals Alias)
    Antworten: 7
    Letzter Beitrag: 06.04.05, 22:00
  5. im php css. aber wie?
    Von saint_wbl im Forum PHP
    Antworten: 3
    Letzter Beitrag: 14.05.02, 20:23