Autor Beitrag
carlos_csharp
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 07.02.12 23:05 
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.


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:
ausblenden volle Höhe C#-Quelltext
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:
        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, ich versuche es schon ziemlich lange, aber ich komme nicht drauf!
Wenn möglich bitte mit einem Beispiel Code, ich durchforst mittlerweile seit 2 Tagen sämtliche Forums und ich finde nichts was mir annähernd helfen könnt!!
Lg

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 08.02.12 10:45 
Hallo carlos_csharp :welcome:

ich denke, mit DrawArc kommst du hier nicht (elegant) weiter, denn dazu müßtest du die Ellipse (bzw. dessen umfassendes Rechteck) definieren, so daß dein Kurvenauschnitt Teil dieser Ellipse wäre (und dann noch dessen Winkel berechnen).

Besser geeignet sind hierfür Splines.

Und hier insbesondere der Catmull-Rom-Spline:
Wikipedia hat folgendes geschrieben:

In der Computergrafik wird diese Form häufig genutzt um zwischen Schlüsselbildern (Keyframes) zu interpolieren oder grafische Objekte darzustellen.


Einige Code-Beispiele gibt es u.a. unter
tehc0dez.blogspot.co...rom-spline-in-c.html
www.codeproject.com/...ser.aspx?msg=4081781

Da ein Catmull-Rom-Spline immer vier Punkte benötigt, mußt du hier ein bißchen experimentieren und den 1. und 4. Punkt aus deinen Straights berechnen (z.B. jeweils 5 Pixel zurück bzw. vor).