![]() |
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 |
Re: Epizykloide programm
und was soll jetzt noch gemacht werden?????
|
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 |
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: |
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 :( |
Re: Epizykloide programm
Ich werf mal 3 Stichworte in die Runde:
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 ;-) |
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 |
Re: Epizykloide programm
Zitat:
Code:
AFAIR war t der Winkel zwischen den zwei Radien im Mittelpunkt des zweiten Kreises.
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) Du kannst dir auch mal ![]() |
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 |
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 |
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???
|
Re: Epizykloide programm
Das ist der Punkt auf dem Kreis, also schon fertig. Aber vielleicht versuchst du trotzdem mal, die Formel selbst herzuleiten ;) .
|
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:
falls der ausschnitt nich reicht oben ist ja der gesammte angehängt
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; 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; |
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??? |
Re: Epizykloide programm
Hi!
Vielleicht lässt sich das ganze durch
Delphi-Quellcode:
lösen (wenn Form1 das entsprechende Formular ist :wink: )
Form1.Doublebuffered:=True;
Ansonsten auf ein Bitmap im Speicher zeichnen und das dann onPaint erst anzeigen. Ciao Frederic |
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:
wurde mir empfohlen obwohl ich nich weiß was das bewirken soll
procedure TForm1.FormDestroy(Sender: TObject);
begin bitmap1.Free; bitmap2.Free; end; kann es sein das es deswegen nich geht??? |
Re: Epizykloide programm
Hallo Langa,
schaue Dir mal ![]() Gruß Hawkeye |
Re: Epizykloide programm
hi!
Zitat:
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 |
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???
|
Re: Epizykloide programm
Zitat:
(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