Reelle Zahlen einpackenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Reelle Zahlen einpacken

Post by Guest »

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
  • 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 ;
}
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:
  • 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;
}
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post