Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [Help!]Simulation eines Doppelschiebers (https://www.delphipraxis.net/70985-%5Bhelp-%5Dsimulation-eines-doppelschiebers.html)

TU-student 7. Jun 2006 16:25


[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:
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.
also die zu berechnende Bahngleichung des Punktes wird bei mir ausgegeben, aber mehr auch nicht...
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.

TU-student 9. Jun 2006 16:19

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:

mr.winkle 9. Jun 2006 16:59

Re: [Help!]Simulation eines Doppelschiebers
 
Brauchst du das ding noch? dann würd ich mich mal dransetzen :wink:

marabu 9. Jun 2006 19:18

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

TU-student 9. Jun 2006 20:05

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:

Klaus01 9. Jun 2006 21:00

Re: [Help!]Simulation eines Doppelschiebers
 
Du kannst mal die Funktion delay von Hagen so einfügen (wie marabu bereits vorgeschlagen hat):
Delphi-Quellcode:
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;
und delay hier aufrufen:
Delphi-Quellcode:
     
       moveto(Pixel[laufvar].x,Pixel[laufvar].y);
       lineto(Pixel[laufvar-1].x,Pixel[laufvar-1].y);
       delay(50);
    until PunktA[laufvar].y>579;
Dann wird Deine Kurve in jedem Schleifendurchlauf um 50 ms verzögert.

Grüße
Klaus

marabu 9. Jun 2006 21:03

Re: [Help!]Simulation eines Doppelschiebers
 
Zitat:

Zitat von TU-student
aber du schreibst viel um den heißen Brei

Noch etwas konkreter und ich hätte deine Heimaufgabe gelöst.

Zitat:

Zitat von TU-student
die Aufgabenstellung kann ich auch selber lesen... ist aber nicht böse gemeint.

Kein Zweifel. Und wenn du glaubst, dass deine Heimarbeit schon fast fertig ist, dann hänge einfach noch eine Aufruf von Delay() in deine REPEAT-Schleife (hallo Klaus) und vielleicht ein SpinEdit zum Einstellen der Verzögerung. Ich weiß ja nicht welche Qualitätsansprüche dein Prof an den Code hat.

marabu

TU-student 9. Jun 2006 21:24

Re: [Help!]Simulation eines Doppelschiebers
 
ok, danke für deine Hilfe, Klaus

mehr wollte ich ja garnicht wissen
habs jetzt soweit fertig :dancer:


Zitat:

Noch etwas konkreter und ich hätte deine Heimaufgabe gelöst.
da hätte ich auch nix dagegen gehabt, die Prüfung am Ende des Semesters muss ich eh nicht bestehen :mrgreen:




ihr seit klasse, genau das hab ich gesucht, schönes we noch zusammes :cheers:

Klaus01 10. Jun 2006 06:52

Re: [Help!]Simulation eines Doppelschiebers
 
ohne Deine Euphorie jetzt bremsen zu wollen

Zitat:

habs jetzt soweit fertig
- hast Du in Deine Editfelder schonmal Werte eingegeben die ungleich einer Zahl sind?
- 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 05:54 Uhr.

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