Autor Beitrag
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 12.04.11 15:54 
Einen schönen sonnigen Nachmittag (zumindest ist er das hier..),

ich möchte momentan lernen, wie ich mit Vektorgrafiken umgehe:

-beliebige Kurven in einer Vektorgrafik darstellen
-diese Zeichnen

Das ganze möchte ich lernen um kurzfristig ein Spiel (wer kennt "Achtung, die Kurve!" nicht), aber auch für langfristige Aufgaben meistern zu können. Herumgepixele hilft halt nur bis zu nem bestimmten Punkt.

Habt ihr:
-Tutorials
-mathematische Ansätze. Mit dem Mathe-LK traue ich es mir zu, diese zu verstehen und umzusetzen..

Gruss,

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 12.04.11 18:21 
Mathematische Ansätze: kubische Splines/B-Splines, Bézier-Kurven.

Für kubische Bézierkurven gab es irgendwie einen Befehl. TCanvas.DrawBezier oder TCanvas.DrawPolyBezier oder sowas.

Aber möchtest du jetzt damit programmiertechnisch umgehen, oder willst du ein Grafikprogramm bedienen? Ich nehme jetzt aufgrund der Sparte ersteres an, aber ganz sicher war ich mir beim Lesen nicht.

Übrigens: für runde Kurven ist es wichtig, dass letzter und vorletzter Punkt der ersten sowie erster und zweiter Punkt der zweiten Kurve eine Gerade bilden (und natürlich letzter Punkt der ersten = erster Punkt der zweiten Kurve).
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Di 12.04.11 18:36 
Also ich bin zwar gym10 und kenne Vektorrechnungen, weil mein Bruder sie sie mir grob erklärt hat, aber für mein Minigolfprogramm habe ich eine extra Unit mit eigenen Typen und ca. 30-40 Funktionen (+Erklärung) erstellt. Besteht aus Funktionen wie zum Beispiel "function LineLineCollision(L1, L2: TLine): Boolean" , "function MovingcircleCircleCollision(c1, c2: TCircle): Boolean", "function LineLineIntersection(L1, L2: TLine): TVector2D". Ich weiß ja nicht inwiefern du das gebrauchen könntest, weil du ja gerade von Kurven redest ( keine Ahnung :P ), aber sonst ist das sicher sehr praktisch.

Hrüße, Thomas
der organist Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 12.04.11 19:00 
Danke für die Antworten. Jap, es geht ums Programmieren nicht um Grafikprogramme. Nun, es geht weiterhin darum, Geraden zu beschreiben und bei Bedarf (Druck von Pfeiltasten) einen Kreis nach rechts oder links.

Gruss,

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Di 12.04.11 19:09 
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
Danke für die Antworten. Jap, es geht ums Programmieren nicht um Grafikprogramme. Nun, es geht weiterhin darum, Geraden zu beschreiben und bei Bedarf (Druck von Pfeiltasten) einen Kreis nach rechts oder links.

Gruss,



eine Kreis nach rechts oder links auszuweiten(also Ellipse)? zu verschieben? zu vergrößern?

wenn du jetzt den Typen TCircle erstellst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TVector2D = record    x, y: extended;

type
  TCircle = record
    m: TVector2D;           // Mittelpunkt als 2-dimensionaler Vektor
    r: extended;            // Radius las sehr große Fließzahl


Kannste sagen in der Prozedur "KeyDown":

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Kreis: TCircle;

...

if Key = #47 then          // Ich rate jetzt einfach mal, dass #47 die rechte Pfeiltaste ist
  Kreis.m.x := Kreis.m.x + 1
else if Key = ...



Ich denke, du meinst das ;)
der organist Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 12.04.11 19:15 
tut mir Leid, wenn ich euch raten lasse. Es geht um das Spiel "Achtung, die Kurve!". Dort bewegt man wie bei Snake das deine Ende eines Pfades und verlängert diesen damit stetig. Möglich als Bewegung sind da wie gesagt: Geraden und Kreise. Wichtig ist dabei halt, dass diese nur in Teilen und auch nacheinander gezeichnet werden müssen. Dazu kommt eine Kollisionsabfrage...

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Di 12.04.11 20:20 
Na dann hilft meine Unit mit den vielen Rechnung aus - würde ich dir gern geben.

Denn wenn ich das richtig verstanden habe ist das Spiel eine Art Snake bloß, dass man runde Kurven fahren kann anstatt, dass man immer nur nach rechts/links/oben/unten kann, oder?
Um die alten Positionen zu merken, die dann den Schwanz der Schlage bilden, speichert man diese als Ortsvektoren. Wenn du sehr viele Punkte in kurzer Entfernung hast und zwischen denen Linien denkst, dann hast du eine nahe zu abgerundete Kurve ( eine Kurve bekanntlich = n-Eck ). Umso kürzer die Abstände zwischen den gespeicherten Punkten, umso abgerundeter wirkt alles ;)
Oder ich bin zu blöd und versteh wieder nicht, was du meinst xD

Edit: Jep, meinst du - es gibt bloß mehrere Schlangen -> [url]fricke.webdiggi.de/?p=830[/url]
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 12.04.11 21:47 
Ach papalapap!
Es gibt zwei Möglichkeiten, soetwas zu realisieren.

1. Du zeichnest auf eine Zeichenfläche dein Pixel (in beliebiger Form [als Rechteck]) und bewegst den Pixel anschließend und wiederholst das ganze. Für die Bewegung hast du ein Richtungsvektor, dessen x und y Werte du mit Sin & Cos berechnest (Alpha Wert als Winkel).

oder

2. Ähnlich wie #1, nur speicherst du die Daten in einer Liste. Dh. jedes Mal, wenn sich die Richtung ändert, machst du ein Snapshot - du fügst die Position deiner Liste hinzu! Ansonsten zeichnest du halt ganz normal!

Wenn ich noch Lust darauf habe, implementiere ich es kurzerhand!

MfG
Einloggen, um Attachments anzusehen!
der organist Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 12.04.11 22:22 
vielen Dank für diese Arbeit, das ist wirklich unerwartet. Das einzige Problem was ich grad noch sehe ist, dass man die Bewegung nicht erst bei einer Änderung speichern darf, sondern das viel häufiger tun muss, gegeben den Fall, dass andere Spieler just in diesem Moment in die momentane Gerade/Kurve hineinrasen...

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 12.04.11 22:27 
Ne?!
Es reicht vollkommen aus, wenn du die Ecken (Knoten) hast.
Die letzte Gerade kannst du dir formen, indem du von der letzten Kante zur "Position" eine Gerade erzeugst und mit ihr dann halt rechnest!
Bei jeder Bewegung ein "Snapshot" zu machen wäre overkill!
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Di 12.04.11 22:43 
Quelltext sind ein bisschen lang und aufwendig aus, aber dafür funktionierts ja auch :)
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Mi 13.04.11 00:18 
Ansonsten hier noch ne kleine Funktion um Schnittpunkte ausfindig zu machen:
ausblenden Delphi-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:
function PointOfIntersection(const A, B, C, D: TVector2D): TVector2D;
var
  AB, CD  : TVector2D;
  delta   : Single;
  t, s    : Single;
begin
  Result.Assign(-1, -1);
  AB.Assign(B.X-A.X, B.Y-A.Y);
  CD.Assign(D.X-C.X, D.Y-C.Y);
  // is ab ein vielfaches von cd oder vice versa?
  delta := AB.X/CD.X;
  if AB.Y*delta = CD.Y then
  begin
    // liegen beide Punkte A ^ C auf derselben Gerade?
    delta := (C.X-A.X)/AB.X;
    if (A.Y + delta * AB.Y = C.Y) and (delta <= 1then
      Result.Assign(A.X+delta*AB.X, A.Y+delta*AB.Y);
  end else
  begin
    delta := AB.X/AB.Y;
    t := (A.X-A.Y*delta-C.X+C.Y*delta)/(CD.X-CD.Y*delta);
    s := (C.X+t*CD.X-A.X)/AB.X;
    if (t >= 0and (t <= 1and (s >= 0and (s <= 1then
      Result.Assign( C.X + t*CD.X, C.Y + t*CD.Y )
  end;
end;


Vlt. gibts ja schon etwas ähnliches oder besseres aber jo mei :P

Die Funktion in Aktion -> Blub

Hab die davor gepostete Demo überarbeitet - nun kann man in seinen eigenen Schwanz krachen!
(Edit siehe nächsten Beitrag; kann nicht mehr als 3 Dateianhänge posten!)
Einloggen, um Attachments anzusehen!
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Mi 13.04.11 01:43 
Sodale, genug für heut.
Einloggen, um Attachments anzusehen!
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Do 14.04.11 20:39 
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
Nun, es geht weiterhin darum, Geraden zu beschreiben


Einfach über Anstieg und Absolutglied.