2014-10-11 13 views
5

Ho questo codice per la generazione di rumore 1D in obj-c, che sta funzionando benissimo:Perlin generatore di rumore a Swift

- (float)makeNoise1D:(int)x { 
    x = (x >> 13)^x; 
    x = (x * (x * x * (int)_seed + 19990303) + 1376312589) & RAND_MAX; 
    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & RAND_MAX)/1073741824.0); 
} 

ora sto cercando di riprodurlo in Swift, ma sempre esito negativo e spettacoli EXEC_BAD_INSTRUCTION al ritorno. Ecco come sembra ora, ho dovuto sputare l'espressione finale, ma sono abbastanza sicuro che non è questo il problema.

func makeNoise1D(var x : Int) -> Float{ 
    x = (x >> 13)^x; 
    x = (x * (x * x * seed! + 19990303) + 1376312589) & 0x7fffffff 
    var inner = (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff 
    return (1.0 - (Float(inner))/1073741824.0) 
} 

Ho già provato molti cast diversi e suddivido in sotto espressioni, ma ancora non funziona. L'unica cosa che ho capito è che la prima e l'ultima linea funzionano. (La maggior parte dei miei casi di test x era impostata su 20 e seed su 10, solo per renderla semplice)

Grazie per l'aiuto!

+0

Avete pensato su come modificare questo metodo per accettare un Float, invece di un Int, come parametro? – Kat

risposta

8

L'eccezione è causata da un "overflow aritmetico" che si verifica se il risultato di uno dei calcoli non può essere rappresentato come Int.

A differenza di (Objective-) C, l'aggiunta e la moltiplicazione degli interi in Swift non "avvolge" o "tronca", ma causa un errore se il risultato non si adatta al tipo di dati.

Ma è possibile utilizzare la Swift "overflow operators"&* e &+ invece, che tronca sempre il risultato:

func makeNoise1D(x : Int) -> Float{ 
    var x = x 
    x = (x >> 13)^x; 
    x = (x &* (x &* x &* seed! &+ 19990303) &+ 1376312589) & 0x7fffffff 
    let inner = (x &* (x &* x &* 15731 &+ 789221) &+ 1376312589) & 0x7fffffff 
    return (1.0 - (Float(inner))/1073741824.0) 
} 
+0

Ottimo! Non avevo idea di aver creato nuovi operatori per questo. Grazie molto! – Endanke

+0

@ ha100: Grazie per aver aggiornato i collegamenti! –

+0

volentieri. hai comunque salvato la mia giornata – ha100