Autor Beitrag
kuhlthomas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Sa 19.04.03 21:32 
in meinem programm gibt es ca. 100 verschiedene punkte deren position sich ständig ändert und es ist sehr wichtig mitzukriegen wenn zwei beliebige punkte miteinander kollidieren. da ich aber nicht bei jedem einzelnen punkt abfragen will ob er nun mit punkt 1 oder 2 oder 3 etc. kollidiert will ich hier nach einer einfacheren lösung suchen
Haegar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 19.04.03 21:47 
arbeitest nicht mit DelphiX oder?

gruss haegar
kuhlthomas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Sa 19.04.03 21:50 
nein, ich habe delphi7 EE
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 19.04.03 21:51 
Es wäre gut zu wissen, wie die Position dieser Punkte hinterlegt ist.

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



BeitragVerfasst: Sa 19.04.03 21:54 
ich habe den type TBoid erstellt unter TBoid.x bzw TBoid.y wird die position jedes einzelnen punktes gespeichert
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 19.04.03 22:39 
Ich weiß nicht, wie Du die Punkte bisher gespeichert hast, aber ich würde es folgendermaßen machen:

Du machst Dir zwei Arrays. In einem speicherst Du die Punkte sortiert nach den x-Werten und in dem anderen sortiert nach den y-Werten. Die ändern sich natürlich jedes Mal, aber nur ein bisschen. Du musst sie nicht jedes Mal von neuem sortieren, sondern nur die Punkte, bei denen sich die Koordinaten ändern, an den richtigen Stellen einsetzen.
Wenn Du nun wissen willst, ob ein Punkt mit einem anderen kollidiert, musst Du nur die Punkte prüfen, die in beiden Arrays direkt vor oder direkt nach dem Punkt, für den Du prüfst kommen. Alle Punkte, die nicht in beiden Arrays vor oder nach betreffendem Punkt kommen, brauchst Du nicht prüfen.

Ich weiß nicht, ob das was bringt. Kann auch Schwachsinn aufgrund später Stunde sein. Aber ich könnte mir vorstellen, dass es klappen könnte. *ist ganz vorsichtig*

MfG,
Peter

P.S.: Du musst natürlich nur in einem der beiden Arrays den Konstruktor eines Punktes aufrufen. In dem anderen speicherst Du nur die Referenz.

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



BeitragVerfasst: Sa 19.04.03 22:58 
da bräuchte ich ein quelltextbeispiel, denn ich habe noch nie mit arrays gearbeitet und daher auch das mit der position innerhalb von dem array nicht so verstanden
Haegar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 19.04.03 23:19 
also ich denke das dir nix anderes übrig bleibt, als alle punkte zu überprüfen....die sache mit dem array, da bin ich auch net dahinter gestiegen.....formulier es nochmal neu :D vielleicht wirds dann einleuchtender für mich

gruss haegar
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 19.04.03 23:37 
@kuhlthomas: wenn Du noch nie mit Arrays gearbeitet hast, wie speicherst Du denn momentan die 100 Punkte? Naja, in den Tutorials gibt es auch ein Tutorial zu den Grundlagen von Arrays.

Okay. Nochmal neu. Nehmen wir an, wir haben Punkte p1 bis p100, deren x- und y-Position wir mit p.x und p.y ansprechen. Ganz am Anfang, wenn die Punkte erstellt werden, speicherst Du sie in zwei Arrays. (Nur in einem Array den Konstruktor aufrufen, im anderen nur Referenzen speichern.)
In dem einen Array sortierst Du die Punkte nach den x-Koordinaten. Punkte mit kleinen x-Koordinaten am Anfang, Punkte mit großen x-Koordinaten am Ende. In dem anderen Array machst Du das Gleiche mit den y-Koordinaten.

Ein Beispiel:
wir haben folgende Punkte: p1 = (1,1); p2 = (1,4); p3 = (3,2); p4 = (3,3) p5 = (4,1)
dann sind sie in dem ersten Array so sortiert: p1 p2 p3 p4 p5
und in dem zweiten Array: p1 p5 p3 p4 p2

Wenn Du jetzt wissen willst, mit welchen Punkt p4 kollidiert, musst Du nur die Punkte prüfen, die in beiden Arrays in der unmittelbaren Umgebung von p4 sind. Es gibt nur einen Punkt, der dieses Kritierium erfüllt: p3. Du musst also nur prüfen, ob p4 mit p3 kollidiert.

Wenn sich nun die Position eines Punktes ändert, dann musst Du die Arrays nicht völlig neu sortieren (das wäre zu langsam), sondern den betreffenden Punkt in beiden Arrays nur ein bisschen verschieben, was recht schnell gehen sollte.

Ich hoffe, es ist jetzt klarer geworden, was ich meine.

MfG,
Peter

//edit: p5 von (4,4) auf (4,1) korrigiert.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".


Zuletzt bearbeitet von Christian S. am So 20.04.03 14:14, insgesamt 1-mal bearbeitet
kuhlthomas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: So 20.04.03 13:32 
das höhrt sich jetzt doch einleuchtend an... aber da ich wirklich nichts über arrays weiss (ich habe für jeden punkt eine variable deklariert) muss ich jetzt noch frage wie ich den einzelne punkte aus einem array herausfische bzw. überhaupt ein array erstelle

aber trotzdem danke für die hife bis jetzt
kuhlthomas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: So 20.04.03 13:36 
jetzt bin ich doch verwirrt. wieso kommt den im 2ten array nach p1 p5 und nicht p3 oder steh ich jetzt total auf dem schlauch?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 20.04.03 14:13 
Oh, ich habe mich vertippt. p5 ist (4,1) und nicht (4,4)!

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



BeitragVerfasst: So 20.04.03 18:29 
jetzt hab ich das sogar verstanden, hört sich sogar an als ob das klappen könnte :roll:

gruss haegar