Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Epizykloide programm (https://www.delphipraxis.net/67253-epizykloide-programm.html)

Langa 11. Apr 2006 23:00


Epizykloide programm
 
Liste der Anhänge anzeigen (Anzahl: 2)
Guten abend sitze gerade an einem program

ich soll ein epizykloide simulieren
d.h. ein äußerer Kreis rollt um einen inneren mit einem punkt auf dem äußeren
der punkt beschreibt eine so genannte epizykloide die bahngleichung hab ich

so also meine probleme mein kreis außen ich hab keine ahnung wie ich das mache das der rollt

dann damit das ne simulation ist muss ja nach jedem timmer schritt sein das ein neus bild gemacht wird
das mit das so sieht als ob der kreis rollt nur der bahn muss gezeichnet werden

hoffe ihr versteht das und könnt mir helfen

hab mein prog bis jetzt schon mal angehangen

netscanner 11. Apr 2006 23:24

Re: Epizykloide programm
 
und was soll jetzt noch gemacht werden?????

Langa 11. Apr 2006 23:39

Re: Epizykloide programm
 
Liste der Anhänge anzeigen (Anzahl: 1)
es soll so aussehen al sob der äußere kreis um den anderen rollt

das tut er ja nich er bleibt star wenn er rollt bewegt sich ja der rote punkt auf den äußeren kreis mit
da ich alles in eine bitmap mache sieht das so aus wie es ist

es soll aberso sein das immer wenn der timer einen schritt macht ein neues bild kommt also es nach dem rollen aus sieht

hab schon ein ähnliches program mal gesehen was mein vorhaben evtl verdeutlicht

hab angehangen

netscanner 11. Apr 2006 23:51

Re: Epizykloide programm
 
wenn du es in bitmamps machst is es zwar leicht viel arbeit aber okey:
Der kreis in diesem Programm rollt nicht (von dem anderen) sondern
ändert immer nur die position, indem er einen neuen 2. kreis erzeugt.

Der Programmierer hat wahrsch. mit einer Schleife ausgerechnet wie viele Punkte der innere Kreis hat und hat dann über eine Formel die Position der Schnittpunktes (1. und 2. Kreis) errechnet.
Dann hat er mit dem OnTimer Event immer einen neuen Kreis erzeugt mit der Schnitt Position, diie er vorher immer ausrechnet.

Angaben ohne Gewähr. Kann sein dass ich mir total irre :duck:

Langa 11. Apr 2006 23:53

Re: Epizykloide programm
 
so weit war ich auch schon aber trotzdem bekomm ich das nicht hin
das ist mein problem weiß nich wie ich das programieren kann
bin total am ende.

Hoffe mir kann mal jemand ne formal sagen und sagen wie ich das rollen hin bekomme
wollte das mit ne zweiten bitmap machen aber das ging nicht :(

Jelly 12. Apr 2006 08:21

Re: Epizykloide programm
 
Ich werf mal 3 Stichworte in die Runde:
  • Lokale Koordinaten
  • Kugel (bzw.) Kreiskoordinaten
  • Überlagerung von 2 Kreisbewegungen
Du hast im Grunde 2 Bewegungen. Die eine ist die Kreisbewegug von Mittelpunkt des äusseren Kreises um den Mittelpunkt des inneren Kreises. Die zweite ist die Bewegung eines äusseren Punktes des kleinen Kreises um dessen Mittelachse... Und diese beiden Bewegungen muss du überlagern. Und weil sich alles im Kreise dreht, nutzz du am besten die Polardarstellung... Hier am Beispiel einer Kreisbewegung:

Ein Punkt r auf dem Kreis hat die Koordinaten

r(R,phi) = R*cos(phi)

Phi ist dein Winkel... Und da das Ganze sich dreht, geht die Zeit ein und die Winkelgeschwinigkeit:
phi = omega*t

Ich denk damit lass ich dich jetzt mal bichsen recherchieren ;-)

Langa 12. Apr 2006 23:19

Re: Epizykloide programm
 
Liste der Anhänge anzeigen (Anzahl: 1)
so hab es jetzt mal etwas vorangetrieben das ganze programm

aber halt der eine kreis kommt da nicht mit bekomm die formeln nicht hin um die koordinaten zu berechnen

:wall: bin wohl etwas verbohrt

häng das noch mal an vielleicht bekommt das hier jemand hin

achso wenn ihr mal dabei seid kann mir jemand sagen wieso die bitmaps nich beim start gleich angezeigt werden

hoffe ich komm durch eure hilfe voran

Khabarakh 13. Apr 2006 13:24

Re: Epizykloide programm
 
Zitat:

Zitat von Langa
bekomm die formeln nicht hin um die koordinaten zu berechnen

Parameterdarstellung:
Code:
x(t) = (r2 + r) * cos(r / r2 * t) - r * cos(t + r / r2 * t)
 y(t) = (r2 + r) * sin(r / r2 * t) - r * sin(t + r / r2 * t)
AFAIR war t der Winkel zwischen den zwei Radien im Mittelpunkt des zweiten Kreises.

Du kannst dir auch mal http://www.delphipraxis.net/internal...ct.php?t=53442 anschauen, aber versuch es erst einmal selbst ;) .

Langa 16. Apr 2006 14:40

Re: Epizykloide programm
 
Hm wird mir nich viel bringen denk ich mal da den winkel vom mittelpunkt des inneren kreises "hochzählen" lasse vom timer.

vielleicht hat ja jemand ne alternative als das was da so in den wikepdias und so rum schwirrt+

schöne ostern noch

Khabarakh 16. Apr 2006 19:31

Re: Epizykloide programm
 
Die beiden Winkel lassen sich ziemlich leicht ineinander umrechnen, schau es dir einfach mal auf einem Blatt Papier an.

Kleiner Tipp zu Ostern: Gleichlange Bögen an den beiden Kreisen

Langa 16. Apr 2006 20:52

Re: Epizykloide programm
 
Hm sind die formeln die du mir gegeben hast für den punkt auf dem außenkreis der die kurve malt oder für den mittel punkt des äußeren kreises???

Khabarakh 16. Apr 2006 21:30

Re: Epizykloide programm
 
Das ist der Punkt auf dem Kreis, also schon fertig. Aber vielleicht versuchst du trotzdem mal, die Formel selbst herzuleiten ;) .

Langa 17. Apr 2006 13:00

Re: Epizykloide programm
 
so hab alles her geLitten. geht auch alles ganz gut
was mich jetzt aber noch stört ist das der mir beim start nich gleich anzeigt sondern erst wenn man reset oder start drückt kann da mir mal jemand sagen wie man das hin bekommt
Delphi-Quellcode:
procedure TForm1.Formcreate(Sender: TObject);

begin
        x0:=148;
        y0:=128;
   form1.button2.Visible:=true;
   form1.Button4.Visible:=false;
   timer1.Enabled:=false;
   doublebuffered := true;                                                     // anzeigen der erzeugten bitmaps

   w:= paintbox1.width ;
   h:= paintbox1.height ;
   paintbox1.canvas.brush.color:=clwhite;
   bitmap1 := Tbitmap.Create;
   bitmap2 := Tbitmap.Create;

   bitmap1.PixelFormat := pf8bit;
   bitmap1.Width := w;
   bitmap1.height := h;
   bitmap1.TransparentColor := clBtnFace;

   bitmap2.PixelFormat := pf8bit;
   bitmap2.Width :=  w ;
   bitmap2.height :=  h ;

with bitmap1.Canvas do begin
      ellipse(x0-r1,y0-r1,x0+r1,y0+r1);           //zentraler Kreis
      ellipse(x0+r1,y0+r2,x0+r1+2*r2,y0-r2);      //außen Kreis
      pen.Color:=clred;
      ellipse(x0+r1+2,y0+2,x0+r1-2,y0-2);
      pen.Color:=clblack;
      end;
    paintbox1.Canvas.Draw(0,0,bitmap1);


end;
falls der ausschnitt nich reicht oben ist ja der gesammte angehängt

hoffe ihr könnt mir helfen

achso hab gleich noch ein problem

wenn ich stop drücke und dann wieder ohne was zu machen wieder start mache soll der mir ander stelle weiter malen das macht er aber die alte bahn soll auch erhalten werden und das wird immer gelöscht
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
winkel:=winkel+1;                                                            // pro schritt erhöhung des winkels

  winkelrad:=winkel/180*pi;
  xn:=x0+round((r1+r2)*cos(winkelrad)-r2*cos((r1+r2)*winkelrad/r2));
  yn:=y0+round((r1+r2)*sin(winkelrad)-r2*sin((r1+r2)*winkelrad/r2));
  xk:=x0+round((r1+r2)*cos(winkelrad));
  yk:=y0+round((r1+r2)*sin(winkelrad));
  with bitmap1.Canvas do begin
      brush.Color:=clwhite;
      pen.Color:=clwhite;
      rectangle(0,0,w,h);
      pen.Color:=clblack;
      ellipse(x0-r1,y0-r1,x0+r1,y0+r1);
      ellipse(xk-r2,yk-r2,xk+r2,yk+r2);
      pen.Color:=clred;
      ellipse(xn+2,yn+2,xn-2,yn-2);
      pen.Color:=clblack;
   end;
  bitmap2.Canvas.Pixels[xn,yn]:=clblack;
  paintbox1.Canvas.Draw(0,0,bitmap2);
  paintbox1.Canvas.Draw(0,0,bitmap1);
  paintbox1.Canvas.CopyMode:=cmSrcAnd;
  paintbox1.Canvas.CopyRect(rect(0,0,w,h) ,bitmap2.Canvas, rect(0,0,w,h));
  paintbox1.Canvas.CopyMode:=cmSrcCopy ;

end;



procedure TForm1.Button4Click(Sender: TObject); //Stop knopf
begin
form1.button2.Visible:=true;
form1.Button4.Visible:=false;
timer1.Enabled:=false;
end;

Langa 19. Apr 2006 22:29

Re: Epizykloide programm
 
SO jetzt funzt fast alles

aber hab mal ne frage hab das ja mit ner paintbox und 2 bitmaps gemacht

damit mir die bitmaps gleich beim start angezeigt werden hab ich das mit dem eventmanager gemacht

und bei onpaint paintbox1click ein gestellt das klappt auch
aber wenn ich fenster klein mache oder ein anderes fenster drüber mache und dann wieder das prog an mache macht der die bitmaps wieder neu und malt nich einfach weiter und also geht die bahn verloren geht das auch anders??? so das auch mal klein gemacht werden kann oder ist das nich möglich???

fkerber 19. Apr 2006 22:35

Re: Epizykloide programm
 
Hi!

Vielleicht lässt sich das ganze durch
Delphi-Quellcode:
Form1.Doublebuffered:=True;
lösen (wenn Form1 das entsprechende Formular ist :wink: )

Ansonsten auf ein Bitmap im Speicher zeichnen und das dann onPaint erst anzeigen.


Ciao Frederic

Langa 19. Apr 2006 22:47

Re: Epizykloide programm
 
also Form1.Doublebuffered:=True; geht nich oder sag mal so es hat nix bewirkt
hm hab auch die procedure formfestroy drin
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
   bitmap1.Free;
   bitmap2.Free;
end;
wurde mir empfohlen obwohl ich nich weiß was das bewirken soll

kann es sein das es deswegen nich geht???

Hawkeye219 19. Apr 2006 22:55

Re: Epizykloide programm
 
Hallo Langa,

schaue Dir mal Delphi-Referenz durchsuchenTPaintBox.OnPaint in der Online-Hilfe an. Ganz besonders das Beispiel 2...

Gruß Hawkeye

fkerber 19. Apr 2006 22:59

Re: Epizykloide programm
 
hi!

Zitat:

Zitat von Langa
hm hab auch die procedure formfestroy drin
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
   bitmap1.Free;
   bitmap2.Free;
end;
wurde mir empfohlen obwohl ich nich weiß was das bewirken soll

kann es sein das es deswegen nich geht???

Nein, damit hat es nichts zu tun.
Anscheinend benutzt du intern schon die von mir angesprochenen Bitmaps und die werden hier (beim Beenden des Programms) sauber freigegeben.
Allerdings frage ich mich, ob das nicht im FormClose besser aufgehoben wäre....


Ciao Frederic

Langa 19. Apr 2006 23:11

Re: Epizykloide programm
 
Hm gut also daran leigt es schon mal nicht aber trotzdem versteh ich das nich mit dem paintbox.onpaint steig da nich durch bei mir verschwindet was immer noch wie kann ich das speichern so das es nicht weg ist???

Kroko1999 20. Apr 2006 08:10

Re: Epizykloide programm
 
Zitat:

Zitat von Langa
Hm gut also daran leigt es schon mal nicht aber trotzdem versteh ich das nich mit dem paintbox.onpaint steig da nich durch bei mir verschwindet was immer noch wie kann ich das speichern so das es nicht weg ist???

(a) bei dem Deutsch fällt mir das "Durchsteigen" auch sehr schwer :wink:
(b) in OnPaint der PaintBox musst Du das richtige Bitmap ausgeben
also
Delphi-Quellcode:
procedure TForm.PaintBox1Paint (Sender: TObject);
begin
  PaintBox.Canvas.Draw (0,0,Bitmap);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz