Reelle Zahlen einpacken
Posted: 03 Jan 2025, 08:04
Eine periodische Grenze ist der Ort, an dem Partikel, die sich außerhalb der Simulationsbox bewegen, von der gegenüberliegenden Seite wieder eintreten und so ein unendliches System nachahmen.
Wenn L = periodische Länge, dann
Beispiele für positive Koordinaten mit L=10 und Die umschlossenen Werte müssen zwischen [0, 10) (linke Seite einschließlich und rechte Seite) bleiben exklusiv):
Nur positives Wrapping-Beispiel (L=10):
Diese Routine funktioniert unter allen gegebenen Bedingungen gut.
Beispiele für gemischte negativ-positive Koordinaten mit L=10 und die umschlossenen Werte muss zwischen [-5, 5] (beide Seiten einschließlich) bleiben:
Diese Routine ist erfolgreich, mit Ausnahme von Nr. 6, die nach dem Umschließen (-5.0, -5.0, -5.0) ergibt.
Wie kann ich Korrekturen daran vornehmen? zweite Routine?
Hinweis: Ich darf if-else oder ?: (Bedingungsoperator) nur aus Leistungsgründen nicht verwenden. Wenn ich mit Tausenden von Partikeln arbeite, reduziert die Prüfung jeder Koordinate für jede Achse die Leistung erheblich.
Wenn L = periodische Länge, dann
- Nur bei positiven Achsen müssen umschlossene Koordinatenwerte zwischen [0, L) (rechtsexklusiv, d. h. die Werte werden bei L umgebrochen).
- Bei gemischten negativ-positiven Achsen müssen umschlossene Koordinatenwerte zwischen [-L/2, L/2] (beide inklusive).
Beispiele für positive Koordinaten mit L=10 und Die umschlossenen Werte müssen zwischen [0, 10) (linke Seite einschließlich und rechte Seite) bleiben exklusiv):
Nur positives Wrapping-Beispiel (L=10):
- WrapPositive(10 , 3.0) → 3.0
- WrapPositive(10, 12.0) → 2.0
- WrapPositive(10, -1.0) → 9.0
- WrapPositive(10, 0.0) → 0.0
- WrapPositive(10, 10.0) → 0.0
- WrapPositive(10, 0.001) → 0,001
Code: Select all
double WrapPositive(double periodicDistance, double position)
{
return (position % periodicDistance + periodicDistance) % periodicDistance ;
}
Beispiele für gemischte negativ-positive Koordinaten mit L=10 und die umschlossenen Werte muss zwischen [-5, 5] (beide Seiten einschließlich) bleiben:
- WrapNegativePositive(10, 3.0) → 3.0
- WrapNegativePositive(10, 6.0) → -4.0
- WrapNegativePositive(10, -6.0) → 4.0
- WrapNegativePositive(10, 0.0 ) → 0.0
- WrapNegativePositive(10, -5.0) → -5.0
- WrapNegativePositive(10, 5.0) → 5.0
- WrapNegativePositive(10, 4.999999999) → 4.999999999
- WrapNegativePositive(10, -5.000000001) → -4,999999999
Code: Select all
double WrapNegativePositive(double periodicDistance, double position)
{
return ((position + periodicDistance / 2) % periodicDistance + periodicDistance) % periodicDistance - periodicDistance / 2;
}
Wie kann ich Korrekturen daran vornehmen? zweite Routine?
Hinweis: Ich darf if-else oder ?: (Bedingungsoperator) nur aus Leistungsgründen nicht verwenden. Wenn ich mit Tausenden von Partikeln arbeite, reduziert die Prüfung jeder Koordinate für jede Achse die Leistung erheblich.