![]() |
[Help!]Simulation eines Doppelschiebers
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, auf der suche im Web um etwas Hilfe für meinen Info-Beleg zu bekommen bin ich auf euer schönes Forum gestoßen. :thumb:
Ich hatte noch nie was mit Programmieren zu tun und wurde dieses Semester in info quasi ins kalte Wasser geworfen. Ich hab ne Aufgabe bekommen die ich mit Delphi(7) im Selbststudium zu Hause lösen soll. Naja, soweit so gut. Ich hab die Aufgabenstellung mal angehangen. Und soweit bin ich bis jetzt:
Delphi-Quellcode:
also die zu berechnende Bahngleichung des Punktes wird bei mir ausgegeben, aber mehr auch nicht...
unit info2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; laenge: TEdit; abstand: TEdit; Reset: TButton; procedure PaintBox1Click(Sender: TObject); procedure laengeChange(Sender: TObject); procedure abstandChange(Sender: TObject); procedure ResetClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; laenge1:integer; abstand1:integer; PunktA : array[0..600] of record x,y:integer ; end; PunktB : array[0..600] of record x,y:integer ; end; Pixel : array[0..600] of record x,y:integer; end; implementation {$R *.dfm} procedure TForm1.laengeChange(Sender: TObject); begin laenge1:=strtoint(laenge.Text); end; procedure TForm1.abstandChange(Sender: TObject); begin abstand1:=strtoint(abstand.Text); end; procedure TForm1.PaintBox1Click(Sender: TObject); var laufvar:integer; begin with paintbox1.Canvas do begin pen.color:=(clblack); moveto(20,580); lineto(20,20); moveto(20,580); lineto(580,580); textout(580,585,'x'); textout(10,10,'y'); laufvar:=0; PunktA[0].x:=20; //fester Wert PunktA[0].y:=580-laenge1; PunktB[0].x:=20; PunktB[0].y:=580; //ferster Wert Pixel[0].x:=20; Pixel[0].y:=580-laenge1+abstand1; repeat inc(laufvar,1); PunktA[laufvar].y:=PunktA[laufvar-1].y+1; PunktA[laufvar].x:=20; PunktB[laufvar].x:=20+round(sqrt(sqr(laenge1)-(sqr(580-PunktA[laufvar].y)))); PunktB[laufvar].y:=580; Pixel[laufvar].x:=PunktA[laufvar].x+round((abstand1/laenge1)*(PunktB[laufvar].x-PunktA[laufvar].x)); Pixel[laufvar].y:=PunktA[laufvar].y+round((abstand1/laenge1)*(PunktB[laufvar].y-PunktA[laufvar].y)); Pixels[Pixel[laufvar].x,Pixel[laufvar].y]:=clblack; moveto(Pixel[laufvar].x,Pixel[laufvar].y); lineto(Pixel[laufvar-1].x,Pixel[laufvar-1].y); until PunktA[laufvar].y>579; end; end; procedure TForm1.ResetClick(Sender: TObject); var laufvar:integer; begin with paintbox1.Canvas do begin pen.color:=(clbtnface); laufvar:=0; PunktA[0].x:=20; //fester Wert PunktA[0].y:=580-laenge1; PunktB[0].x:=20; PunktB[0].y:=580; //ferster Wert repeat inc(laufvar,1); PunktA[laufvar].y:=PunktA[laufvar-1].y+1; PunktA[laufvar].x:=20; PunktB[laufvar].x:=20+round(sqrt(sqr(laenge1)-(sqr(580-PunktA[laufvar].y)))); PunktB[laufvar].y:=580; moveto(20,PunktA[laufvar].y); lineto(PunktB[laufvar].x,580); until PunktA[laufvar].y=580; pen.color:=(clblack); moveto(20,580); lineto(20,20); moveto(20,580); lineto(580,580); textout(580,585,'x'); textout(10,10,'y'); end; end; end. wie ich die Schieberstange Anzeige weis ich bereits, aber nicht wie ich es realiesieren kann das nicht alles aufeinmal berechnet und dargestellt wird. Man sollte es ja schon mit dem menschl. Auge verfolgen können wie sich die Stange bewegt und der Punkt die Kurve zeichnet. Ich hoffe ihr könnt mir dabei helfen. |
Re: [Help!]Simulation eines Doppelschiebers
hm, 40 views und keiner konnte helfen :(
ich weis nun das ich die Timerfunktion benutzen muss, aber ich bekomms nicht hin könnt ihr mir garnicht helfen? donnerstag ist Abgabetermin :pale: |
Re: [Help!]Simulation eines Doppelschiebers
Brauchst du das ding noch? dann würd ich mich mal dransetzen :wink:
|
Re: [Help!]Simulation eines Doppelschiebers
Herzlich willkommen in der Delphi-PRAXiS, TU-Student.
Als Maschinenbau-Student solltest du etwas mehr Ordnung in dein Vorgehen bringen. Erst der Entwurf, dann die Realisierung. Welche Controls brauchst du für Benutzereingaben? Vorgegeben sind Edit-Komponenten für die Länge L der Verbindungsstange und den Abstand r zwischen A und P. Den Reset-Button nicht vergessen. Wie soll die Ausgabe erfolgen? Du hast dich für eine PaintBox entschieden. Wie könnte die geforderte robuste Eingabe aussehen? Wie sind die Wertebereich für die beiden Eingabegrößen L und r definiert? Darf der Benutzer die Größe der PaintBox zur Laufzeit verändern? Dann wirst du die Funktion implementieren, welche dir die Koordinaten x und y zu gegebenem Winkel alpha liefert. Dass der Punkt P auf einer elliptischen Bahn mit den Radien r und (L - r) um den Ursprung deines Koordinatensystems läuft weißt du sicher. Für die Ausgabe kannst du mit einem Timer arbeiten - musst es aber nicht. Die Zeitverzögerung kann genauso gut auch durch ein Delay() in einer Schleife eingebracht werden. Nicht einfach irgendwo in der Mitte anfangen. Alles in überschaubare Teilaufgaben zerlegen. Divide et Impera! Grüße vom marabu |
Re: [Help!]Simulation eines Doppelschiebers
wie, wo, was? erstmal danke das überhauptjemand geantwortet hat :hello:
@marabu jo, du hast genau ins schwarze getroffen, bin maschbauer :hi: aber du schreibst viel um den heißen Brei, die Aufgabenstellung kann ich auch selber lesen... ist aber nicht böse gemeint. Ob ich nun die Paintbox explizit nach der Eingabe des Benutzers anpasse oder sie beschränke und eine Fehlermeldung bei zur großen Werten ausgebe ist ja erstmal egal. Weiterhin ist mein Programm ja auch schon in der Lage die Bahnkurve für die inidviduellen Eingabewerte darzusellen. Mein Problem ist es den Schieber langsam (also so, dass man es verfolgen kann) zu bewegen und gleichzeitgig die Kurve zu Zeichnen... @mr.winkle ich würd mich sehr freuen wenn du dich etwas mit dem Problem beschäftigen würdest wie gesagt, die Abgabe des Programms ist am Donnerstag (15.6.), also eig. noch genug Zeit Danke, schonmal :corky: |
Re: [Help!]Simulation eines Doppelschiebers
Du kannst mal die Funktion delay von Hagen so einfügen (wie marabu bereits vorgeschlagen hat):
Delphi-Quellcode:
und delay hier aufrufen:
implementation
{$R *.dfm} procedure Delay(Milliseconds: Integer); var Tick: DWord; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWord(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin Application.ProcessMessages; if Application.Terminated then Exit; Milliseconds := Tick - GetTickcount; end; finally CloseHandle(Event); end; end;
Delphi-Quellcode:
Dann wird Deine Kurve in jedem Schleifendurchlauf um 50 ms verzögert.moveto(Pixel[laufvar].x,Pixel[laufvar].y); lineto(Pixel[laufvar-1].x,Pixel[laufvar-1].y); delay(50); until PunktA[laufvar].y>579; Grüße Klaus |
Re: [Help!]Simulation eines Doppelschiebers
Zitat:
Zitat:
marabu |
Re: [Help!]Simulation eines Doppelschiebers
ok, danke für deine Hilfe, Klaus
mehr wollte ich ja garnicht wissen habs jetzt soweit fertig :dancer: Zitat:
ihr seit klasse, genau das hab ich gesucht, schönes we noch zusammes :cheers: |
Re: [Help!]Simulation eines Doppelschiebers
ohne Deine Euphorie jetzt bremsen zu wollen
Zitat:
- hast Du für die Länge schonmal eine 0 eingegeben? - wenn Dein Programm läuft, hast Du schonmal ein anderes Programm darübergelegt, und war deine Grafik danach noch zu sehen? - was passiert wenn Du den reset Buton drückst während der Ausgabe Deiner Grafik? Nur mal so als Anregung. Grüße und ein schönes Wochenende Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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-2025 by Thomas Breitkreuz