Allereerst, bedankt allemaal voor de reacties
Allereerst naar aanleiding van jullie vragen een (hopelijk) wat betere uitleg van het probleem
Ik heb 2 soorten objecten, laten we ze even class A en B noemen. Per cycle moet ik voor elk object uit A weten welke objecten uit A en uit B er zich binnen een afstand r bevinden. Objecten uit A kunnen bewegen, objecten uit B niet. De beweging die ze uitvoeren is, hoewel op het niveau van de individuele objecten doelgericht, op macroniveau min of meer random, en een object kan maximaal een afstand r
max bewegen per tick. De wereld is bij benadering 1000r
maxx1000r
max groot, en er zitten bij benadering 100.000 objecten in. Overigens kan r varieren per object uit A, van r
min tot r
max, waarbij er tussen die 2 ongeveer een factor 5 zit. Er zijn ruwweg 10000 objecten A, en 100000 objecten B.
Als je simulatie tick-based is, en de objecten bewegen langzaam genoeg, dan is er natuurlijk geen probleem. Objecten die eerst een afstand d hebben, hebben op de volgende tick een afstand [d-2v,d+2v]. Dat is maar een kleine verandering.
Helaas is de beweging van de objecten in de orde van grootte van r per tick.
Verder kun je ook je objecten in een rastermet resolutie r*r indelen. In dat geval hoef je alleen punten te vergelijken uit de directe omgeving (9 rastercellen). Indien je puntenwolk veel groter is dan r, dan is dat een vrij grote besparing. Het is bovendien vrij triviaal om te bepalen of een punt of een grens schuift.
Dit is inderdaad een idee. Het enige probleem dat ik hiermee zie is dat ik hiervoor een vrij grote array nodig zal hebben, aangezien de wereld toch zeker 1000rx1000r zal zijn qua omvang, en ik de mogelijkheid van meerdere objecten per cel open moet houden. Maar dit geeft inderdaad wel een grote besparing, aangezien er nooit meer dan enkele objecten per cel zullen zijn.
Er zijn twee datastructuren die in mij op komen, een quadtree en een simpel grid. De quadtree heeft O(log n) insertion- en searchtime, voor het grid is dat respectivelijk O(1) en O(n) maar laat je door deze theoretische hoeveelheden niet van de wijs brengen

.
Met een quadtree deel je je wereld recursief op in 4 gelijke delen (vierkanten dus, je hebt overigens ook een adaptive quadtree die je niet in gelijke delen deelt), en je insert de objecten in de bladeren van de boom. Op het moment dan x objecten in een bepaald blad zitten deel je dat blad weer op en insert je de objecten die in het blad zaten een niveau dieper. Zoeken gaat ongeveer hetzelfde: je begint bij de root node en je kijkt of de quadtree cell je object snijdt. Zo ja dan ga je verder met z'n 4 kinderen, en dat zo totdat je aan een blad bent en dan controleer je de objecten die daarin zitten.
Een grid is simpelweg een verdeling van je hele wereld in x bij y vaste cellen. Het nadeel hiervan is dat het in principe meer geheugen kan kosten dan een quadtree, maar het voordeel is dat je in constante tijd kunt bepalen in welke cel een object zit. Die O(n) zoektijd komt simpelweg van de aanname dat in elke cel gemiddeld n/(x*y) objecten zitten, in de praktijk valt dat bij een goed gekozen x en y dus erg mee, vooropgesteld dat je objecten in de wereld een beetje uniform verdeeld zijn.
Ik verwacht dat mijn simulatie een soort klontenpap van objecten gaat geven: Ze zullen samenclusteren in kleine regionale groepen van ten hoogste 10 tot enkele objecten, die na verloop van tijd echter weer uit elkaar vallen, waarna er elders nieuwe groepen zullen ontstaan. De ruimte tussen de groepen zal echter niet leeg zijn, maar sporadisch enkele objecten bevatten.
Het lijkt me na jouw beschrijving en die van MSalters dat ik het best af ben met een simpel grid, omdat ik niet verwacht dat een quadtree heel veel minder geheugen gaat gebruiken gezien de vrij homogene verdeling die ik heb.