2014-10-11 20 views
5

tôi có mã này để tạo ra tiếng ồn 1D trong obj-c, nó làm việc hoàn toàn tốt:Perlin máy phát tiếng ồn trong 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); 
} 

Bây giờ tôi đang cố gắng để tái tạo nó trong Swift, nhưng nó luôn luôn thất bại và hiển thị EXEC_BAD_INSTRUCTION khi trở về. Đây là cách nó trông giống như bây giờ, tôi đã phải nhổ biểu thức cuối cùng, nhưng tôi khá chắc chắn đó không phải là vấn đề.

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) 
} 

Tôi đã thử nhiều phôi khác nhau và chia thành các biểu thức phụ nhưng vẫn không thành công. Điều duy nhất tôi đã tìm ra rằng đầu tiên và dòng cuối cùng hoạt động. (Hầu hết các trường hợp thử nghiệm x của tôi được đặt thành 20 và hạt giống thành 10, chỉ để làm cho nó đơn giản)

Cảm ơn sự giúp đỡ!

+0

bạn đã bao giờ nghĩ về việc sửa đổi phương pháp này để chấp nhận một phao, thay vì một Int, như một tham số? – Kat

Trả lời

8

Trường hợp ngoại lệ là do "tràn số học" xảy ra nếu kết quả của một trong các phép tính của bạn không thể được biểu diễn dưới dạng Int.

Không giống như (Objective-) C, thêm và nhân số nguyên trong Swift không "quấn quanh" hoặc "cắt ngắn", nhưng gây ra lỗi nếu kết quả không phù hợp với loại dữ liệu.

Nhưng bạn có thể sử dụng Swift "overflow operators"&*&+ thay vào đó, mà luôn luôn cắt ngắn kết quả:

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

Tuyệt vời! Tôi không biết họ đã tạo ra các toán tử mới cho việc này. Cảm ơn nhiều! – Endanke

+0

@ ha100: Cảm ơn bạn đã cập nhật liên kết! –

+0

sẵn sàng. bạn đã lưu ngày của tôi – ha100

Các vấn đề liên quan