2010-12-06 6 views
6

Ich mache einige 3D-Grafiken und ich habe einen offenen Ozean. Für diesen Ozean habe ich eine Matrix, die den Seegang (d. H. Wellenhöhen) für einen bestimmten rechteckigen Teil des Meeres darstellt. Der Rest des Ozeans ist flach. Mein Problem ist, dass mein kontrolliertes Meer, wo es Wellen gibt, in der Mitte des offenen flachen Meeres positioniert ist, und die Diskontinuität an den Rändern meines Gitters verursacht einige schlechte Artefakte. Der Grund, warum ich nur Wellen für einen Teilabschnitt und nicht das ganze Meer erzeuge, ist, dass meine Rauschfunktion auf dem gesamten Meer unerschwinglich ist (und ich weiß, dass die einfachste Lösung eine billigere Rauschfunktion wie Simplex-Rauschen ist), aber das ist es nicht eine Option).gibt es eine Funktion in C oder C++ zu tun "Sättigung" auf einer ganzen Zahl

Nachdem gesagt, dass meine Frage wirklich ziemlich einfach ist. Wenn ich sage, dass ich ein Raster (alias Matrix aka 2d Array) der Größe 100x40 habe, und ich den Wert für Position 120x33 finden möchte, möchte ich einfach den nächsten Nachbarn nehmen, der 100x33 wäre. Für irgendeine Zahl, die außerhalb eines gegebenen Bereichs liegt, möchte ich, dass diese Zahl gesättigt wird, um innerhalb des gegebenen Bereichs zu liegen. Gibt es eine Funktion in C oder C++, die das tut?

Edit: die Positionsparameter sind vom Typ float

Ich weiß, dass ich dies, wenn Aussagen mit einigen einfachen tun können, aber es scheint nur, wie etwas, das die Standard-Bibliotheken umfassen würden.

+0

Es gibt SSE-Anweisungen, die Sättigung unterstützt. – ruslik

+0

bedeutet dies Codierung in der Montage? Kann ich auch den Bereich angeben oder wird nur der Bereich der primitiven Datentypen gesättigt? – lms

+0

Ich denke, jede moderne Maschine sollte in der Lage sein, ein ganzes Meer ohne Probleme zu schaffen. Meine Software (http://www.orcina.com/SoftwareProducts/OrcaFlex) tut dies, obwohl sie etwas anders ist, weil sie versucht, die Physik realistisch zu modellieren. –

Antwort

10
template<typename T> 
T saturate(T val, T min, T max) { 
    return std::min(std::max(val, min), max); 
} 
+10

Funktioniert nicht, wenn Val unter/Überlauf des grundlegenden Typs T bereits gelitten hat. – Clifford

1

Min und Max Nein?

x = std::min(100,x); 
y = std::min(40,y); 
+0

Das ist in Bezug auf, wenn der bedingte Operator standardmäßig implementiert. –

+0

Das ist leicht zu ändern. – OrangeDog

3

ISO/IEC JTC1 SC22 WG14 N1169 (Programmiersprachen - C - Erweiterungen eingebettete Prozessoren zu unterstützen) für sättigende Datentypen gibt einen _Sat Qualifier. Ich habe nie versucht, es in einem Compiler zu verwenden, aber es ist in der GCC 4.x documentation enthalten.

VC++ 2003 unterstützt MMX intrinsics, die sättigende Arithmetik ermöglichen.

+0

MMX intrinsics Verbindung ist tot –

+1

@EricJohnson: Das sollte keine Überraschung sein, da die Post> 6 Jahre alt ist. Ich bin nicht im Stande, Verbindungen in mehr als 2000 geposteten Antworten aufrechtzuerhalten! Die für die Suche nach MSDN oder Google erforderlichen Schlüsselbegriffe wurden bereitgestellt. Archivierte Dokumentation für VS2010 [hier] (https://msdn.microsoft.com/en-us/library/8cs7e4zs (v = vs.100) .aspx) und für VS2015 [hier] (https://msdn.microsoft .com/de-us/library/hh977023.aspx) - obwohl nicht mehr gut kategorisiert. Ich stelle mir das auch 2017 vor. – Clifford

0

Oder wenn Sie komplizierte definiert mögen!

#define DERIVE_MAX (100) 

//Saturate X at +/-DERIVE_MAX 
#define SAT(x) (((x) > DERIVE_MAX) ? DERIVE_MAX : ((-(x) > DERIVE_MAX) ? (-DERIVE_MAX) : (x))) 
0

Und jetzt gibt es, in Form von std::clamp. Und ich bin kaum sieben Jahre zu spät :)

Verwandte Themen