Autor Beitrag
fritierte
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 58



BeitragVerfasst: Do 29.07.04 15:41 
ich hab vor einiger zeit versucht, einen punkt von einem anderen punkt anziehen zu lassen. es hat im endeffekt nur 2 tage gedauert, nur sind die kräfte die auf den punkt einwirken nicht korrekt

ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit Unit1;

interface

uses
  Windows, math, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  geschw,speed,x,y:array[1..2] of single;
  alpha,xdelta,ydelta,kraft,s:single;
implementation

{$R *.DFM}
procedure sammeln;
begin
  xdelta:=x[1]-x[2];  //die zwei seitenlängen
  ydelta:=y[1]-y[2];  //zur berechnung von s
  s:=sqrt(sqr(xdelta)+sqr(ydelta));  //abstand punkt->gravitation
  if ydelta<>0 then
    alpha:=arcsin(xdelta/s) else
    alpha:=arccos(xdelta/s);  //<--ignorieren^^'
  speed[1]:=speed[1]-sin(alpha);  //geschwindigkeit und horizontaler richtung
  if ydelta>0 then       //nötig damit die kräfte nicht ins negativ umschlagen
  speed[2]:=speed[2]-cos(alpha) //vertikale geschwindigkeit
  else
  speed[2]:=speed[2]+cos(alpha); //vertikale geschwindigkeit
  kraft:=1/(s*s);  //wirkende kraft
  geschw[1]:=speed[1]*kraft; //keine funktion
  geschw[2]:=speed[2]*kraft; //keine funktion
  x[2]:=x[2]-speed[1]*kraft; //letztendliche lageänderung
  y[2]:=y[2]-speed[2]*kraft; //letztendliche lageänderung
end;

procedure zeichnen;
var i:byte;
begin
  for i:=1 to 2 do
  Form1.Canvas.Ellipse(trunc(x[i]*10+100)-5,trunc(y[i]*10+100)-5,trunc(x[i]*10+100)+5,trunc(y[i]*10+100)+5);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
sammeln;
zeichnen;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  speed[1]:=0;  //horizontale geschwindigkeit
  speed[2]:=50; //vertikale anfangsgeschwindigkeit
  x[1]:=17.5;
  x[2]:=32.3;
  y[1]:=1.5;
  y[2]:=15.3;
  timer1.Enabled:=true;
end;

end.


es soll hier nicht um den code gehen(die art und weise is katastrophal, ich weiß), ich komm nur auf keinen grünen zweig bei der kräfteverteilung für vertikale und horizontale geschwindigkeit, bei 45° ist die summer der kraft zu groß, da cos(45)=0,7 und sin(45)=0,7 und damit insgesamt 1,4 mal soviel kraf herrscht, als wenn der punkt senk- oder wagerecht fliegen würde. selbst wenn die bahnen eigentlich ganz ok aussehen, denke ich nicht, dass die berechnungen korrekt sind. so ich hoffe mal dass ein paar hilfsbereite mathematik-asse im forum sind die mir weiterhelfen können :oops:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 29.07.04 16:30 
Hallo!

Ich muss leider sagen, dass ich mit Deinem Code gar nicht klar komme. :oops:

Also, ich gehe jetzt mal durch. Zuerst einmal berechnest Du die Distanz in x- und in y-Richtung und dann daraus den Gesamtabstand. Dann den Winkel. Wieso prüfst Du dort, ob ydelta <> 0 ist und rechenst dann mit xdelta? Ob die Winkelbeziehungen so richtig sind, kann ich Dir nicht sagen, weil ich nicht weiß, wie Dein Koordinatensystem und Dein Winkel definiert ist.

Und ab da hakt es dann noch mehr. Was machst Du da mit der Geschwindigkeit? Ich schon richtig, dass die sich ändern muss. Aber die Änderung der Geschwindigkeit ist bei Dir unabhängig von der Entfernung und das kann nicht sein!

Dann kommen wir zur Kraft. Wenn ich alle Konstanten auf 1 setze, ist das schon in Ordnung. Aber wieso ist die Lageänderung Geschwindigkeit mal Kraft? :shock:

Ich würde Dir vorschlagen, dass ganze noch einmal zu durchdenken. Und zwar nicht als Quellcode, sondern in Formeln. Ganz wichtig ist eine Skizze. :-)

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
fritierte Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 58



BeitragVerfasst: Do 29.07.04 16:44 
ich hab elendig viele skizzen gemacht, hab es auf verschiedenen wegen probiert, aber der hier scheint der einfachste und offensichtlichste zu sein.

Zitat:

Wieso prüfst Du dort, ob ydelta <> 0 ist und rechenst dann mit xdelta

das kann man getrost ignorieren, ich musste etwas rumprobieren bis das ergebnis zumindest ordentlich aussah, es sah vorher so aus, dass wenn ydelta 0 war, eine division durch null entstand, das ist alles


Zitat:

Dann kommen wir zur Kraft. Wenn ich alle Konstanten auf 1 setze, ist das schon in Ordnung. Aber wieso ist die Lageänderung Geschwindigkeit mal Kraft?


oi das hab ich garnicht mitbekommen, du hast recht, eigentlich müsste das ganze so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  speed[1]:=speed[1]-sin(alpha)*kraft;
  if ydelta>0 then
  speed[2]:=speed[2]-cos(alpha)*kraft
  else
  speed[2]:=speed[2]+cos(alpha)*kraft;


koordinatensystem ist ganz normal xy, ich hab es auch schonmal nur mit winkeln versucht, also den punkt mit geschwindigket und richtung fliegen zu lassen, aber da kann ich auch nicht weit

*edit*
ok mit dieser veränderung, und der verringerung der geschwindigkeit auf 0.1 funktionierts wunderprächtig und augenscheinlich korrekt :D :D :D

auch wenn du mir nur indirekt geholfen hast, VIEEEELEN DANK!
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Do 29.07.04 17:02 
Ich glaube Peter meinte hiermit
Zitat:
Dann kommen wir zur Kraft. Wenn ich alle Konstanten auf 1 setze, ist das schon in Ordnung. Aber wieso ist die Lageänderung Geschwindigkeit mal Kraft?

diesen Abschnitt am Schluss:
ausblenden Delphi-Quelltext
1:
2:
3:
  x[2]:=x[2]-speed[1]*kraft; //letztendliche lageänderung   
  y[2]:=y[2]-speed[2]*kraft; //letztendliche lageänderung   
end;

Denn Weg ungleich Geschwindigkeit * Kraft, bzw. in Einheiten: [v * F] = m/s² * kg*m/s² = kg*m²/s^4 und das ist ungleich m :wink:

/e: Solange unten Lageänderung = augenblickliche Lage - aug. Geschw. * Kraft steht kann es noch nicht korrekt sein :shock:

_________________
MfG
Johannes ehem. jbmaier
fritierte Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 58



BeitragVerfasst: Do 29.07.04 17:41 
jbmaier hat folgendes geschrieben:
Ich glaube Peter meinte hiermit diesen Abschnitt am Schluss:
ausblenden Delphi-Quelltext
1:
2:
3:
  x[2]:=x[2]-speed[1]*kraft; //letztendliche lageänderung   
  y[2]:=y[2]-speed[2]*kraft; //letztendliche lageänderung   
end;

Denn Weg ungleich Geschwindigkeit * Kraft, bzw. in Einheiten: [v * F] = m/s² * kg*m/s² = kg*m²/s^4 und das ist ungleich m :wink:

/e: Solange unten Lageänderung = augenblickliche Lage - aug. Geschw. * Kraft steht kann es noch nicht korrekt sein :shock:

das ist mir bewusst, und die änderung bezog sich auch darauf, sodass es richtig so lauten musste, was es eigentlich auch müsste(nicht nachgeprüft)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  kraft:=1/(s*s);
  speed[1]:=speed[1]-sin(alpha)*kraft;  //hier kommt die änderung hin
  if ydelta>0 then
  speed[2]:=speed[2]-cos(alpha)*kraft
  else
  speed[2]:=speed[2]+cos(alpha)*kraft;
  x[2]:=x[2]-speed[1];  //und hier fehlt
  y[2]:=y[2]-speed[2];  //auch das "*kraft"
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 29.07.04 21:56 
Warum nicht einfach:

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:
27:
type
TMassepunkt = packed record
  x: Extended; //X in Meter
  y: Extended; //Y in Meter
  m: Extended; //Masse in kg
end;

var
  pts: array [1..2] of TMassepunkt;
  r: Extended;  //Abstand
  F: Extended;  //Gravitationskraft
  dx, dy: Extended;

begin
  dx := pts[2].x - pts[1].x;
  dy := pts[2].y - pts[1].y;

  r := sqrt(dx * dx + dy * dy);
  
  F := Grav * pts[1].m * pts[2].m / r;  //Für r = 0 prüfen

  pts[1].x := pts[1].x + F / 2 / pts[1].m * (dx / r); //For Time Scaling: * (t * t);
  pts[1].y := pts[1].y + F / 2 / pts[1].m * (dy / r); //For Time Scaling: * (t * t);

  pts[2].x := pts[2].x + F / 2 / pts[2].m * (dx / r); //For Time Scaling: * (t * t);
  pts[2].y := pts[2].y + F / 2 / pts[2].m * (dy / r); //For Time Scaling: * (t * t);
end;


Frag mich, wozu Ihr da Winkel braucht ;-)

P.S.: Wenn mehr als 2 Punkte existieren, dann muss die Alte Lage zwischengespeichert werden und die Gesamtkraft berechnet werden. Hab das ganze mit einem QBasic-Programm mal für beliebige Anzahl von Massepunkten gemacht. Funzt ohne Probleme.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 29.07.04 22:23 
Ich bin davon ausgegangen, dass fritierte noch keine Vektorrechnung hatte, dann ist es mit dem Winkel einfacher. Aber Du wirst sehen: Wenn Du die Formeln in firtiertes Quelltext ineinander einsetzt, verschwindet auch der Winkel. :-)

Übrigens fehlt bei Dir die Geschwindigkeit. Oder hast Du die absichtlich weggelassen? :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 29.07.04 23:32 
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Fr 30.07.04 07:36 
Hmm erstens geht's wirklch mit Vektoren einfacher, und zweitens hab ich noch ne Frage :wink:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  kraft:=1/(s*s);   
  speed[1]:=speed[1]-sin(alpha)*kraft;  //hier kommt die änderung hin   
  if ydelta>0 then   
  speed[2]:=speed[2]-cos(alpha)*kraft   
  else   
  speed[2]:=speed[2]+cos(alpha)*kraft;   
  x[2]:=x[2]-speed[1];  //und hier fehlt   
  y[2]:=y[2]-speed[2];  //auch das "*kraft"

Welches Timer1.Interval hast du eingestellt? Damit das hier genau stimmt, nicht nur qualitativ, müsstest du schauen, dass das mit deinen "virtuellen Einheiten" hinkommt. Damit meine ich speziell
ausblenden Delphi-Quelltext
1:
speed[2]:=speed[2]+cos(alpha)*kraft;					

und
ausblenden Delphi-Quelltext
1:
x[2]:=x[2]-speed[1];					


Bei dem unteren Beispiel fehlt die Zeit in der Berechnung (also z.b. das Timer1.Interval) und bei der oberen gehe ich auch davon aus, dass du die Beschleunigung = 1 gesetzt hast, denn normalerweise ist auch hier Geschw. != Kraft. Nur so am Rand ... :wink:

_________________
MfG
Johannes ehem. jbmaier
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Fr 30.07.04 07:46 
Btw:
BenBE in deinem Code ist denk ich noch ein Fehler drin, hier:
ausblenden Delphi-Quelltext
1:
F := Grav * pts[1].m * pts[2].m / r;  //Für r = 0 prüfen					

denn für die Gravitationskraft gilt meines Wissens F := gamma * m * M / r² :wink:
Deins wäre wenn ich mich noch richtig erinnere die potentielle Energie in Bezug auf das Unendliche mit falschem Vorzeichen :shock:

_________________
MfG
Johannes ehem. jbmaier
fritierte Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 58



BeitragVerfasst: Fr 30.07.04 13:48 
also:
ich habe 10. klasse realschulmathematik in mir, nix mit vektor- oder matritzenrechnung, von daher sag ich ja dass mein ansatz für mich eigentlich der is, der im bereich des machbaren ist. matürlich geht das eleganter, oder korrekter, aber 2-3 jahre abi-mathe lassen sich nich herbeischnipsen :oops:
DelphiFreund
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 120

Win XP
D7 Enterprise
BeitragVerfasst: Fr 30.07.04 13:52 
Man lernt in der 10. Matritzen- und Vektorrechnung.

Gruß DelphiFreund
newbie44
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 117

Windows XP, Windows ME
D6 Pers, D7 Enterprise
BeitragVerfasst: Fr 30.07.04 13:56 
Ahhh Vektorrechnung, das ist mein Lieblingsgebiet in Mathe gewesen. Betrag des Vektors, Länge des Vektors Schnittpunktberrechnung, das war alles so simpel, hatte ja auch im Abschlusszeugnis ne 3.

Gruß

Sebby :P

_________________
Dumm darf man sein, aber zu helfen muss man sich wissen.
DelphiFreund
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 120

Win XP
D7 Enterprise
BeitragVerfasst: Fr 30.07.04 13:58 
Ich hab mein Abschlusszeugnis erst bekommen. Mathe ist wirklich easy. Hatte nur ne 2. Hab die Prüfung leider verhauen.
newbie44
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 117

Windows XP, Windows ME
D6 Pers, D7 Enterprise
BeitragVerfasst: Fr 30.07.04 14:02 
Auf welche Schule bist du gegangen, Wirtschaftsschule, Realschule, Hauptschule.

Ich freue mich das ich überhaupt eine 3 geschafft habe, ich hab einfach drauf los gerechnet und es war zufällig richtig. Ja die Wirtschaftsschule fehlt mir, vor allem meine Freunde, die ich damals gefunden hatte.

Muss mal wieder an Sie Mailen

Sebby :roll:

_________________
Dumm darf man sein, aber zu helfen muss man sich wissen.
DelphiFreund
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 120

Win XP
D7 Enterprise
BeitragVerfasst: Fr 30.07.04 14:13 
Realschule I-Zweig (Mathematischer)

Gruß DelphiFreund
fritierte Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 58



BeitragVerfasst: Fr 30.07.04 14:39 
DelphiFreund hat folgendes geschrieben:
Man lernt in der 10. Matritzen- und Vektorrechnung.

Gruß DelphiFreund


vielleicht in deinem bundesland, aber in sachsen-anhalt wird auf einer normalen realschule keine matritzen- bzw. vektorrechnung behandelt :evil:
DelphiFreund
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 120

Win XP
D7 Enterprise
BeitragVerfasst: Fr 30.07.04 14:40 
So gar im 3er-Zweig lernt man Vektorrechnung.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 30.07.04 19:15 
Äh, wollt ihr jetzt streiten, wann wie wo Matritzenrechnung behandelt wird oder geht es euch noch um das Problem? Falls es niemenad bemerkt hat, das Programm, was ich verlinkt habe, ist mit Source. :roll:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 30.07.04 23:35 
Peter Lustig hat folgendes geschrieben:
Übrigens fehlt bei Dir die Geschwindigkeit. Oder hast Du die absichtlich weggelassen? :-)


Wieso Vektor-Rechnung??? Geht doch über einfache Dreiecks-Beziehungen (AKA tan, sin und cos. Hat man IMHO in der 7. oder 8. Kl.) ;-)

@Geschwindigkeit: Hat's aus nem anderen Programm übernommen und dort beim übersetzen vergessen. Geht aber relativ einfach zu adeen: Record um zwei felder ergänzen (vx und vy) und die Update-Gleichungen genauso. In meinem Original-Programm hatte ich's mit n Massepunkten programmiert (QBasic ohne OOP) ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.