Nghệ thuật toán học có thể Tweet lại [đóng]


330

Toán học số nguyên có thể tạo ra các mẫu tuyệt vời khi được đặt trên một lưới. Ngay cả các chức năng cơ bản nhất cũng có thể mang lại các thiết kế phức tạp tuyệt đẹp!

Thử thách của bạn

Viết 3 thân hàm có thể Tweetable (nghĩa là 140 ký tự trở xuống) cho các giá trị đỏ, lục và lam cho ảnh 1024x1024.

Đầu vào của các hàm sẽ là hai số nguyên i (số cột cho pixel đã cho) và j (số hàng cho pixel đã cho) và đầu ra sẽ là một dấu ngắn không dấu trong khoảng từ 0 đến 1023, bao gồm số lượng của số đã cho màu hiện diện trong pixel (i, j).

Ví dụ, ba chức năng sau đây tạo ra hình ảnh dưới đây:

/* RED */
    return (unsigned short)sqrt((double)(_sq(i-DIM/2)*_sq(j-DIM/2))*2.0);
/* GREEN */
    return (unsigned short)sqrt((double)(
        (_sq(i-DIM/2)|_sq(j-DIM/2))*
        (_sq(i-DIM/2)&_sq(j-DIM/2))
    )); 
/* BLUE */
    return (unsigned short)sqrt((double)(_sq(i-DIM/2)&_sq(j-DIM/2))*2.0);

Mẫu-1

/* RED */
    return i&&j?(i%j)&(j%i):0;
/* GREEN */
    return i&&j?(i%j)+(j%i):0;
/* BLUE */
    return i&&j?(i%j)|(j%i):0;

Mẫu-2

Những quy định

  • Cho mã C ++ này , thay thế trong các chức năng của bạn. Tôi đã cung cấp một vài macro và đã bao gồm thư viện và bạn có thể bao gồm phức hợp. Bạn có thể sử dụng bất kỳ chức năng nào từ các thư viện này và / hoặc macro của tôi. Xin vui lòng không sử dụng bất kỳ tài nguyên bên ngoài ngoài này.
  • Nếu phiên bản đó không phù hợp với bạn, hãy đảm bảo bạn đang biên dịch với:

    g++ filename.cpp -std=c++11
    

    Nếu điều đó không hiệu quả, vui lòng sử dụng phiên bản thay thế bằng cách sử dụng ký tự không dấu thay vì quần short không dấu.

Michaelangelo đã cung cấp phiên bản đầu ra màu 24 bit hoặc 48 bit được làm sạch .

  • Bạn có thể triển khai phiên bản của riêng mình bằng ngôn ngữ khác, nhưng nó phải hoạt động giống như phiên bản C ++ được cung cấp và chỉ các chức năng từ các bản dựng sẵn của C ++, thư viện hoặc các macro được cung cấp có thể được sử dụng để làm cho nó công bằng.
  • Chỉ đăng ba cơ quan chức năng của bạn - vui lòng không bao gồm mã của tôi trong bài đăng của bạn
  • Vui lòng bao gồm một phiên bản nhỏ hơn hoặc một bản sao nhúng của hình ảnh của bạn. Chúng được tạo thành định dạng ppm và có thể cần phải được chuyển đổi sang định dạng khác để xem đúng trên stackexchange.
  • Các cơ quan chức năng (không bao gồm chữ ký) phải có 140 ký tự trở xuống.
  • Đây là một cuộc thi phổ biến - hầu hết các phiếu bầu đều thắng

3
Đã thêm thẻ C ++ vì bản chất của các quy tắc loại trừ các ngôn ngữ khác. Chúng tôi thường thích những thách thức về ngôn ngữ, trừ khi họ có lý do chính đáng để yêu cầu một bộ cụ thể.
thuật toán

4
Đối với những cử tri thân thiết gọi điều này quá rộng, vui lòng thử viết câu trả lời cho điều này trước. Thật đáng ngạc nhiên là hạn chế ...
trichoplax

8
Đây là điều tôi thích nhất tôi từng thấy ở đây, như thế, bao giờ hết!
David Conrad

4
Tôi thích rằng câu hỏi này cảm thấy giống như một cảnh demo trường học cũ.
mskfisher

23
Loại câu hỏi này khuyến khích sự tham gia vào mã golf . Tôi thường không thích trả lời một câu hỏi golf thẳng vì tôi không tự tin làm tốt. Với loại câu hỏi này, giới hạn byte khiến tôi thử một câu trả lời đơn giản, tìm hiểu các kỹ thuật chơi gôn trên đường đi và sau đó sử dụng chúng để tạo ra các câu trả lời phức tạp hơn. Điều này giống như một bước đệm để trả lời các câu hỏi golf thẳng. Tôi nghĩ rằng nó có thể là chìa khóa trong việc đưa nhiều người vào.
trichoplax

Câu trả lời:


120

Mandelbrot 3 x 133 ký tự

Điều đầu tiên xuất hiện trong tâm trí tôi là "Mandelbrot!".

Vâng, tôi biết đã có một bài nộp mandelbrot. Sau khi xác nhận rằng tôi có thể tự lấy nó dưới 140 ký tự, tôi đã thực hiện các thủ thuật và tối ưu hóa từ giải pháp đó vào tôi (cảm ơn Martin và Todd). Không gian còn lại để chọn một vị trí và thu phóng thú vị, cũng như một chủ đề màu sắc đẹp:

mandelbrot

unsigned char RD(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,3.);
}
unsigned char GR(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.7);
}
unsigned char BL(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.5);
}

Tổng số 132 ký tự

Tôi đã cố gắng giảm xuống còn 140 cho cả 3 kênh. Có một chút nhiễu màu gần rìa và vị trí không thú vị như cái đầu tiên, nhưng: 132 ký tự

mandelbrot giảm

unsigned char RD(int i,int j){
  double a=0,b=0,d,n=0;
  for(;a*a+(d=b*b)<4&&n++<8192;b=2*a*b+j/5e4+.06,a=a*a-d+i/5e4+.34);
  return n/4;
}
unsigned char GR(int i,int j){
  return 2*RD(i,j);
}
unsigned char BL(int i,int j){
  return 4*RD(i,j);
}

8
Những màu sắc tuyệt đẹp!
Martin Ender

Tôi yêu cái này, hình ảnh đẹp nhất chưa!
Roy van Rijn

4
Đây là hình nền của tôi bây giờ.
Mật mã

209

Khăn trải bàn

Bằng phẳng

Tôi bắt đầu đặt một mẫu kẻ sọc / gingham vào phối cảnh giống như một tấm khăn trải bàn vô biên:

unsigned char RD(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}

khăn trải bàn phẳng

Gợn sóng

Sau đó, tôi đã giới thiệu một gợn sóng (phối cảnh không đúng hoàn toàn, nhưng vẫn có 140 ký tự):

unsigned char RD(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}

khăn trải bàn

Màu sắc

Sau đó, tôi tạo ra một số màu sắc mịn hơn để cung cấp chi tiết trên phạm vi tỷ lệ rộng hơn, và để làm cho hình ảnh nhiều màu sắc hơn ...

unsigned char RD(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;
}

khăn trải bàn màu

Trong chuyển động

Việc giảm mã chỉ một chút nữa cho phép xác định pha sóng P với 2 vị trí thập phân, chỉ đủ cho các khung hình đủ gần để hoạt hình mượt mà. Tôi đã giảm biên độ ở giai đoạn này để tránh gây ra bệnh biển và chuyển toàn bộ hình ảnh lên thêm 151 pixel (với chi phí thêm 1 ký tự) để đẩy răng cưa ra khỏi đỉnh hình ảnh. Bí danh hoạt hình là mê hoặc.

unsigned char RD(int i,int j){
#define P 6.03
float s=3./(j+250),y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;}

unsigned char GR(int i,int j){
float s=3./(j+250);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;
return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;}

unsigned char BL(int i,int j){
float s=3./(j+250);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;
return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;}

khăn trải bàn hoạt hình


15
Đây là huyền thoại. (Y) Giữ nó lên. : P
Mohammad Areeb Siddiqui

Nhưng làm thế nào chính xác chuyển động được thực hiện? Trong khung ban đầu không có logic thay đổi khung, phải không?
esteewhy

2
@esteewhy chỉ hình ảnh tĩnh có thể được sản xuất. GIF hiển thị một chuỗi các khung hình tĩnh, mỗi khung được tạo ra bằng cách thay đổi giá trị sau #define P. Nó yêu cầu chơi golf xuống để cho phép các nhân vật bổ sung cho #define P 6.03.
trichoplax

4
DỪNG LẠI! Bạn có thực sự muốn nâng cao câu trả lời hàng đầu? Có một số xa những thú vị hơn nếu bạn di chuyển xuống qua hai trang tiếp theo.
trichoplax

1
Tôi khuyên bạn nên sắp xếp các câu trả lời theo "cũ nhất" và sau đó bạn có thể thấy các cách tiếp cận mới được phát triển như thế nào khi có câu trả lời mới.
trichoplax

192

Họa sĩ ngẫu nhiên

nhập mô tả hình ảnh ở đây

char red_fn(int i,int j){
#define r(n)(rand()%n)
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):red_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}
char green_fn(int i,int j){
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):green_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}
char blue_fn(int i,int j){
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):blue_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}

Đây là một mục dựa trên ngẫu nhiên. Đối với khoảng 0,1% số pixel, nó chọn một màu ngẫu nhiên, đối với các pixel khác, nó sử dụng cùng màu với một pixel liền kề ngẫu nhiên. Lưu ý rằng mỗi màu thực hiện điều này một cách độc lập, vì vậy đây thực sự chỉ là một lớp phủ của một hình ảnh màu xanh lá cây, xanh dương và đỏ ngẫu nhiên. Để có được kết quả khác nhau trên chạy khác nhau, bạn sẽ cần phải thêm srand(time(NULL))vào mainchức năng.

Bây giờ cho một số biến thể.

Bằng cách bỏ qua các pixel chúng ta có thể làm cho nó mờ hơn một chút.

nhập mô tả hình ảnh ở đây

Và sau đó chúng ta có thể từ từ thay đổi màu sắc, trong đó các dòng chảy tràn dẫn đến những thay đổi đột ngột khiến cho nó trông giống như những nét cọ

nhập mô tả hình ảnh ở đây

Những điều tôi cần tìm hiểu:

  • Vì một số lý do, tôi không thể đặt srandtrong các chức năng đó mà không nhận được segfault.
  • Nếu tôi có thể làm cho các bước ngẫu nhiên giống nhau trên cả ba màu, nó có thể trông có trật tự hơn một chút.

Bạn cũng có thể thực hiện đi bộ đẳng hướng ngẫu nhiên, như

static char c[1024][1024];return!c[i][j]?c[i][j]=r(999)?red_fn((i+r(5)+1022)%1024,(j+r(5)+1022)%1024):r(256):c[i][j];

để cung cấp cho bạn

nhập mô tả hình ảnh ở đây

Nhiều bức tranh ngẫu nhiên

Tôi đã chơi xung quanh với điều này nhiều hơn một chút và tạo ra một số bức tranh ngẫu nhiên khác. Không phải tất cả những điều này đều có thể trong giới hạn của thử thách này, vì vậy tôi không muốn đưa chúng vào đây. Nhưng bạn có thể thấy chúng trong bộ sưu tập imgur này cùng với một số mô tả về cách tôi sản xuất chúng.

Tôi mong muốn phát triển tất cả những khả năng này thành một khung và đưa nó lên GitHub. (Không phải những thứ như thế này không tồn tại, nhưng dù sao nó cũng rất vui!)


12
Tôi yêu những thứ này Tôi đã không nhận ra rằng có thể tính đến các pixel liền kề mà không cần truy cập vào dữ liệu pixel - công việc trơn tru!
trichoplax

1
Nhắc nhở tôi rất nhiều về cuộc thi cũ này, nơi các quy tắc là đặt một pixel của mỗi màu trong hình ảnh.
teh internets được làm bằng catz

2
Ồ Những hình ảnh này là hoàn toàn đẹp!
raptortech97

1
Phòng trưng bày mát mẻ, những người xuyên tâm là gọn gàng.
Teh internets được làm bằng catz

2
Tôi thấy Reptar : hình ảnh cuối cùng trong bài (hình đẳng hướng), góc phần tư phía trên bên phải.
Tim Pederick

162

Một số điều nhọn hoắt

Vâng, tôi biết chính xác những gì để đặt tên cho nó.

Một số điều nhọn hoắt

unsigned short RD(int i,int j){
    return(sqrt(_sq(73.-i)+_sq(609-j))+1)/(sqrt(abs(sin((sqrt(_sq(860.-i)+_sq(162-j)))/115.0)))+1)/200;
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(160.-i)+_sq(60-j))+1)/(sqrt(abs(sin((sqrt(_sq(86.-i)+_sq(860-j)))/115.0)))+1)/200;
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(844.-i)+_sq(200-j))+1)/(sqrt(abs(sin((sqrt(_sq(250.-i)+_sq(20-j)))/115.0)))+1)/200;
}

EDIT: Không còn sử dụng pow. EDIT 2: @PhiNotPi chỉ ra rằng tôi không cần sử dụng abs nhiều.

Bạn có thể thay đổi các điểm tham chiếu khá dễ dàng để có được một hình ảnh khác:

Một số điều thú vị hơn

unsigned short RD(int i,int j){
    return(sqrt(_sq(148.-i)+_sq(1000-j))+1)/(sqrt(abs(sin((sqrt(_sq(500.-i)+_sq(400-j)))/115.0)))+1)/200;
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(610.-i)+_sq(60-j))+1)/(sqrt(abs(sin((sqrt(_sq(864.-i)+_sq(860-j)))/115.0)))+1)/200;
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(180.-i)+_sq(100-j))+1)/(sqrt(abs(sin((sqrt(_sq(503.-i)+_sq(103-j)))/115.0)))+1)/200;
}

@EricTressler chỉ ra rằng hình ảnh của tôi có Batman trong đó.

Người dơi


1
@JayKominek Tôi không biết, lúc đó tôi không có mặt ở đó:
cjfaure


1
@cjfaure ồ! cảm ơn bạn! có vẻ như phiên bản cuối cùng của mô tả là tại: web.archive.org/web/20031205062033/http://www.blorf.com/~mrad/ trộm và mã đã được chuyển đến sourceforge. cập nhật năm ngoái thậm chí! sourceforge.net/projects/libswirlies
Jay Kominek

1
Một trong những sở thích của tôi!
Sở thích của Calvin

1
Cái này rất đẹp - nhưng tôi không thể tái tạo nó cả! Gần nhất tôi có thể nhận được là khi PPM được tạo ra không đúng cách (LSB thay vì MSB) và thậm chí sau đó nó trông giống như một loạt các vòng tròn pha trộn alpha có màu khác nhau.
DreamWar Warrior

123

Tất nhiên, phải có một đệ trình Mandelbrot.

nhập mô tả hình ảnh ở đây

char red_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>31?256:k*8;
}
char green_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>63?256:k*4;
}
char blue_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k;
}

Đang cố gắng cải thiện bảng màu bây giờ. Có phải là gian lận không nếu tôi định nghĩa tính toán là một macro red_fnvà sử dụng macro đó trong hai phần còn lại để tôi có nhiều ký tự hơn cho lựa chọn màu sắc lạ mắt trong màu xanh lá cây và màu xanh lam?

Chỉnh sửa: Thật khó để đưa ra các lược đồ màu tốt với một vài byte còn lại. Đây là một phiên bản khác:

/* RED   */ return log(k)*47;
/* GREEN */ return log(k)*47;
/* BLUE  */ return 128-log(k)*23;

nhập mô tả hình ảnh ở đây

Và theo gợi ý của githubphagocyte và với những cải tiến của Todd Lehman, chúng ta có thể dễ dàng chọn các phần nhỏ hơn:

Ví dụ

char red_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return log(k)/10.15*256;
}
char green_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return log(k)/10.15*256;
}
char blue_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return 128-k/200;
}

cho

nhập mô tả hình ảnh ở đây


12
@tomsmeding Tôi phải thú nhận, đây là lần đầu tiên tôi thực hiện bộ Mandelbrot.
Martin Ender

2
Có tính biểu tượng như bộ Mandelbrot đầy đủ là (+1, nhân tiện!), Có vẻ như bạn đã để mình đủ chỗ để điều chỉnh các thông số và đăng câu trả lời với một số chi tiết xoắn tuyệt vời của zoom sâu.
trichoplax

1
@githubphagocyte Tôi đã nghĩ về điều đó, nhưng chưa thể bận tâm để biên dịch lại và chạy lại và chuyển đổi mỗi lần cho đến khi tôi tìm ra các thông số tốt;). Có thể làm như vậy sau. Đầu tiên tôi phải thử một chức năng hoàn toàn khác. ;)
Martin Ender

2
@githubphagocyte cuối cùng cũng có thêm điều đó. cám ơn vì sự gợi ý!
Martin Ender

2
Cảm ơn @Todd, tôi đã cập nhật hình ảnh cuối cùng với điều đó. Tôi đã sử dụng 25600 lần lặp, quá lâu. ;)
Martin Ender

110

Bộ Julia

Nếu có Mandelbrot, thì cũng nên có một bộ Julia.

nhập mô tả hình ảnh ở đây

Bạn có thể dành hàng giờ để điều chỉnh các tham số và chức năng, vì vậy đây chỉ là một cách nhanh chóng có vẻ tốt.

Lấy cảm hứng từ sự tham gia của Martin.

unsigned short red_fn(int i, int j){
#define D(x) (x-DIM/2.)/(DIM/2.)
float x=D(i),y=D(j),X,Y,n=0;while(n++<200&&(X=x*x)+(Y=y*y)<4){x=X-Y+.36237;y=2*x*y+.32;}return log(n)*256;}

unsigned short green_fn(int i, int j){
float x=D(i),y=D(j),X,Y,n=0;while(n++<200&&(x*x+y*y)<4){X=x;Y=y;x=X*X-Y*Y+-.7;y=2*X*Y+.27015;}return log(n)*128;}

unsigned short blue_fn(int i, int j){
float x=D(i),y=D(j),X,Y,n=0;while(n++<600&&(x*x+y*y)<4){X=x;Y=y;x=X*X-Y*Y+.36237;y=2*X*Y+.32;}return log(n)*128;}

Bạn có muốn một số RNG?

OK, bình luận của Sparr đưa tôi vào đường đua để ngẫu nhiên hóa các thông số của những Julias nhỏ này. Lần đầu tiên tôi đã thử thực hiện hack cấp độ bit với kết quả là time(0)nhưng C ++ không cho phép xả rác điểm thập lục phân vì vậy đây là một ngõ cụt (ít nhất là với kiến ​​thức hạn chế của tôi). Tôi có thể đã sử dụng một số lần truyền tải nặng để đạt được nó, nhưng điều đó sẽ không phù hợp với 140 byte.

Dù sao tôi cũng không còn nhiều chỗ, vì vậy tôi đã phải bỏ Julia đỏ để đặt macro của mình và có RNG thông thường hơn ( timehạt giống và thực rand(), woohoo!).

nhập mô tả hình ảnh ở đây

Rất tiếc, thiếu một cái gì đó. Rõ ràng, các tham số này phải là tĩnh hoặc nếu không bạn có một số kết quả kỳ lạ (nhưng buồn cười, có thể tôi sẽ điều tra một chút sau nếu tôi thấy điều gì đó thú vị).

Vì vậy, ở đây chúng tôi, chỉ có các kênh màu xanh lá cây và màu xanh:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Bây giờ hãy thêm một mẫu màu đỏ đơn giản để lấp đầy khoảng trống. Không thực sự giàu trí tưởng tượng, nhưng tôi không phải là một lập trình viên đồ họa ... chưa :-)

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Và cuối cùng là mã mới với các tham số ngẫu nhiên:

unsigned short red_fn(int i, int j){
static int n=1;if(n){--n;srand(time(0));}
#define R rand()/16384.-1
#define S static float r=R,k=R;float
return _cb(i^j);}

unsigned short green_fn(int i, int j){
#define D(x) (x-DIM/2.)/(DIM/2.),
S x=D(i)y=D(j)X,Y;int n=0;while(n++<200&&(X=x)*x+(Y=y)*y<4){x=X*X-Y*Y+r;y=2*X*Y+k;}return log(n)*512;}

unsigned short blue_fn(int i, int j){
S x=D(i)y=D(j)X,Y;int n=0;while(n++<200&&(X=x)*x+(Y=y)*y<4){x=X*X-Y*Y+r;y=2*X*Y+k;}return log(n)*512;}

Vẫn còn chỗ trống ...


Bạn có chỗ để chọn ngẫu nhiên các tham số mỗi lần chạy với srand (time (0) và rand () không hay chỉ là thời gian (0)?
Sparr

2
Đó là cái cuối cùng đang đi trên tường của tôi.
cjfaure

@Sparr cập nhật với đề xuất của bạn. Có một số niềm vui :-).
Teh internets được làm bằng catz

4
Tôi không thể nói điều gì giống nhất: câu trả lời của bạn hoặc tên người dùng của bạn
William Barbosa

107

Điều này rất thú vị vì nó hoàn toàn không sử dụng tham số i, j. Thay vào đó, nó nhớ trạng thái trong một biến tĩnh.

unsigned char RD(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char GR(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char BL(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}

Đầy màu sắc


Sẽ rất thú vị khi xem kết quả của mã này trên các nền tảng / trình biên dịch khác nhau. Giá trị của RAND_MAX rất khác nhau và có thể cho hình ảnh hoàn toàn khác nhau ...
trichoplax

5
Nó không nên thay đổi nhiều. (gấp đôi) rand () / RAND_MAX phải luôn nằm trong phạm vi [0,0, 1,0].
Manuel Kasten

2
Đây là một trong những điều ưa thích của tôi!
Sở thích của Calvin

2
Nó không chỉ thú vị - nó đẹp!
Martin Thoma

104

Hình ảnh, tưởng tượng

/* RED */
    int a=(j?i%j:i)*4;int b=i-32;int c=j-32;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((b+c)/2))^_cb((b-c)*2);
/* GREEN */
    int a=(j?i%j:i)*4;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((i+j)/2))^_cb((i-j)*2);
/* BLUE */
    int a=(j?i%j:i)*4;int b=i+32;int c=j+32;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((b+c)/2))^_cb((b-c)*2);

3
Điều đó thực sự rất đẹp, +1.
Milo

3
Đây là yêu thích của tôi. Nó trông giống như một mảnh chuyên nghiệp của thiết kế đồ họa. : D
cjfaure

4
Nó trông giống như một wafer của bộ vi xử lý. macrophotographer.net/images/ss_rvsi_5.jpg
s0rce

Nó trông giống như một hình nền tối giản .
AL

1
Nó trông giống như logo cầu vồng của Apple .
LegionMammal978

82

Buddhaabrot (+ Antibuddhabrot)

Chỉnh sửa: Bây giờ là một tượng phật thích hợp!

Chỉnh sửa: Tôi đã quản lý để giới hạn cường độ màu trong giới hạn byte, do đó không còn các pixel đen giả do tràn.

Tôi thực sự muốn dừng lại sau bốn ... nhưng ...

nhập mô tả hình ảnh ở đây

Điều này sẽ bị nén một chút trong quá trình tải lên (và được thu nhỏ lại khi nhúng) vì vậy nếu bạn muốn chiêm ngưỡng tất cả các chi tiết, đây là 512x512 thú vị được cắt ra (không bị nén và được hiển thị ở kích thước đầy đủ):

nhập mô tả hình ảnh ở đây

Cảm ơn githubphagocyte cho ý tưởng. Điều này đòi hỏi một số lạm dụng khá phức tạp của cả ba chức năng màu:

unsigned short RD(int i,int j){
    #define f(a,b)for(a=0;++a<b;)
    #define D float x=0,y=0
    static int z,m,n;if(!z){z=1;f(m,4096)f(n,4096)BL(m-4096,n-4096);};return GR(i,j);
}
unsigned short GR(int i,int j){
    #define R a=x*x-y*y+i/1024.+2;y=2*x*y+j/1024.+2
    static float c[DIM][DIM],p;if(i>=0)return(p=c[i][j])>DM1?DM1:p;c[j+DIM][i/2+DIM]+=i%2*2+1;
}
unsigned short BL(int i,int j){
    D,a,k,p=0;if(i<0)f(k,5e5){R;x=a;if(x*x>4||y*y>4)break;GR(int((x-2)*256)*2-p,(y-2)*256);if(!p&&k==5e5-1){x=y=k=0;p=1;}}else{return GR(i,j);}
}

Có một số byte còn lại để phối màu tốt hơn, nhưng cho đến nay tôi vẫn chưa tìm thấy bất cứ thứ gì đánh bại hình ảnh tỷ lệ xám.

Mã được đưa ra sử dụng 4096x4096 điểm bắt đầu và thực hiện tối đa 500.000 lần lặp trên mỗi điểm để xác định xem quỹ đạo có thoát hay không. Điều đó mất từ ​​6 đến 7 giờ trên máy của tôi. Bạn có thể nhận được kết quả tốt với lưới 2k x 2k và lặp 10k, mất hai phút và thậm chí chỉ là lưới 1k x 1k với số lần lặp 1k trông khá đẹp (mất 3 giây). Nếu bạn muốn tìm hiểu thêm về các tham số đó, có một vài nơi cần thay đổi:

  • Để thay đổi độ sâu đệ quy Mandelbrot, hãy điều chỉnh cả hai trường hợp 5e5trong BLsố lần lặp của bạn.
  • Để thay đổi độ phân giải lưới, thay đổi tất cả bốn 4096RDđộ phân giải mong muốn của bạn và 1024.trong GRbởi các yếu tố tương tự để duy trì tỉ lệ chính xác.
  • Có lẽ bạn cũng cần phải mở rộng các return c[i][j]trong GRvì đó chỉ chứa các số tuyệt đối các chuyến thăm của mỗi điểm ảnh. Màu tối đa dường như không phụ thuộc nhiều vào số lần lặp và chia tỷ lệ tuyến tính với tổng số điểm bắt đầu. Vì vậy, nếu bạn muốn sử dụng lưới 1k x 1k, bạn có thể muốn return c[i][j]*16;hoặc tương tự, nhưng yếu tố đó đôi khi cần một số khó khăn.

Đối với những người không quen thuộc với tượng phật (như bản thân tôi vài ngày trước), nó dựa trên tính toán của Mandelbrot, nhưng cường độ của mỗi pixel là tần suất mà pixel đó được truy cập trong các lần lặp của các quỹ đạo thoát. Nếu chúng ta đang đếm số lượt truy cập trong các quỹ đạo không thoát, thì đó là Antibuddhabrot. Có một phiên bản thậm chí tinh vi hơn gọi là Nebulabrot nơi bạn sử dụng độ sâu đệ quy khác nhau cho mỗi kênh màu. Nhưng tôi sẽ để điều đó cho người khác. Để biết thêm thông tin, như mọi khi, Wikipedia .

Ban đầu, tôi không phân biệt quỹ đạo thoát và không thoát. Điều đó đã tạo ra một âm mưu là sự kết hợp của một con phật thủ và một con Antibuddhabrot (như được chỉ ra bởi githubphagocyte).

unsigned short RD(int i,int j){
    #define f(a)for(a=0;++a<DIM;)
    static int z;float x=0,y=0,m,n,k;if(!z){z=1;f(m)f(n)GR(m-DIM,n-DIM);};return BL(i,j);
}
unsigned short GR(int i,int j){
    float x=0,y=0,a,k;if(i<0)f(k){a=x*x-y*y+(i+256.0)/512;y=2*x*y+(j+512.0)/512;x=a;if(x*x+y*y>4)break;BL((x-.6)*512,(y-1)*512);}return BL(i,j);
}
unsigned short BL(int i,int j){
    static float c[DIM][DIM];if(i<0&&i>-DIM-1&&j<0&&j>-DIM-1)c[j+DIM][i+DIM]++;else if(i>0&&i<DIM&&j>0&&j<DIM)return log(c[i][j])*110;
}

nhập mô tả hình ảnh ở đây

Bức ảnh này trông hơi giống một bức ảnh mờ ... Tôi thích điều đó.


8
Tôi sẽ làm điều này thành một chiếc mũ.
cjfaure

6
Tôi thực sự ngạc nhiên khi bạn nhận được điều này xuống tới 3 rất nhiều 140 byte. Hình ảnh phật mới là đẹp.
trichoplax

4
Điều này thực sự ấn tượng.
copumpkin

Cái đầu tiên thực sự rất nghệ thuật. Nhắc tôi về sứa. +1
Igby Largeeman

1
Đây là trình yêu thích của tôi. Công việc tốt đẹp!
thomallen

76

Lầu năm góc Sierpinki

Bạn có thể đã thấy phương pháp trò chơi hỗn loạn xấp xỉ Tam giác Sierpinki bằng cách vẽ các điểm ở nửa đường tới một đỉnh được chọn ngẫu nhiên. Ở đây tôi đã thực hiện cùng một cách tiếp cận bằng cách sử dụng 5 đỉnh. Mã ngắn nhất tôi có thể giải quyết bao gồm mã hóa cứng 5 đỉnh, và không có cách nào tôi có thể ghép nó thành 140 ký tự. Vì vậy, tôi đã ủy thác thành phần màu đỏ cho một phông nền đơn giản và đã sử dụng không gian dự phòng trong chức năng màu đỏ để xác định một macro để mang cả hai chức năng khác dưới 140. Vì vậy, mọi thứ đều hợp lệ với chi phí không có thành phần màu đỏ trong hình ngũ giác.

unsigned char RD(int i,int j){
#define A int x=0,y=0,p[10]={512,9,0,381,196,981,827,981,DM1,381}
auto s=99./(j+99);return GR(i,j)?0:abs(53-int((3e3-i)*s+j*s)%107);}

unsigned char GR(int i,int j){static int c[DIM][DIM];if(i+j<1){A;for(int n=0;n<2e7;n++){int v=(rand()%11+1)%5*2;x+=p[v];x/=2;y+=p[v+1];y/=2;c[x][y]++;}}return c[i][j];}

unsigned char BL(int i,int j){static int c[DIM][DIM];if(i+j<1){A;for(int n=0;n<3e7;n++){int v=(rand()%11+4)%5*2;x+=p[v];x/=2;y+=p[v+1];y/=2;c[x][y]++;}}return c[i][j];}

Cảm ơn Martin Büttner về ý tưởng được đề cập trong các nhận xét của câu hỏi về việc xác định macro trong một chức năng để sau đó sử dụng chức năng khác và cũng sử dụng tính phân biệt để điền vào các pixel theo thứ tự tùy ý thay vì bị giới hạn theo thứ tự raster của chức năng chính .

ngũ giác

Hình ảnh có dung lượng trên 500KB nên nó được tự động chuyển thành jpg bằng cách trao đổi ngăn xếp. Điều này làm mờ một số chi tiết tốt hơn, vì vậy tôi cũng chỉ bao gồm quý trên cùng bên phải dưới dạng png để hiển thị giao diện ban đầu:

trên cùng bên phải


73

Bản nhạc

Nhạc Sierpinki. : D Những người trong cuộc trò chuyện nói rằng nó trông giống như tờ giấy đục lỗ cho các hộp nhạc.

Bản nhạc

unsigned short RD(int i,int j){
    return ((int)(100*sin((i+400)*(j+100)/11115)))&i;
}
unsigned short GR(int i,int j){
    return RD(i,j);
}
unsigned short BL(int i,int j){
    return RD(i,j);
}

Một số chi tiết về cách thức hoạt động của nó ... ừm, nó thực sự chỉ là một phóng to trên một kết xuất của một số hình tam giác Sierpinki lượn sóng. Giao diện bản nhạc (và cả tính khối) là kết quả của việc cắt số nguyên. Nếu tôi thay đổi chức năng màu đỏ thành, nói,

return ((int)(100*sin((i+400)*(j+100)/11115.0)));

cắt ngắn được loại bỏ và chúng tôi nhận được kết xuất độ phân giải đầy đủ:

Bản nhạc không chặn

Vì vậy, yeah, đó là thú vị.


1
Nó giống như Squarepizer được phiên âm thành neumes
ossifrage squeamish

1
@squeamishossifrage Tôi vừa xem gì ...?
cjfaure

:-) video Chris Cunningham một chút kỳ lạ, không phải là họ?
squossish ossifrage

14
cái thứ hai trông giống như nó đang di chuyển khi tôi cuộn trang
user13267

5
Khi cuộn xuống trang web, cái cuối cùng thực sự dường như đang di chuyển. Ảo ảnh quang học đẹp.
Kyle Kanos

61

Máy tạo sơ đồ Voronoi ngẫu nhiên có ai không?

OK, điều này đã cho tôi một thời gian khó khăn. Tôi nghĩ rằng nó khá đẹp tuy nhiên, ngay cả khi kết quả không quá arty như một số người khác. Đó là thỏa thuận với sự ngẫu nhiên. Có thể một số hình ảnh trung gian trông tốt hơn, nhưng tôi thực sự muốn có một thuật toán hoạt động hoàn toàn với sơ đồ voronoi.

nhập mô tả hình ảnh ở đây

Biên tập:

nhập mô tả hình ảnh ở đây

Đây là một ví dụ về thuật toán cuối cùng. Hình ảnh về cơ bản là sự chồng chất của ba sơ đồ voronoi, một cho mỗi thành phần màu (đỏ, xanh lá cây, xanh dương).

không có ý kiến, phiên bản nhận xét ở cuối

unsigned short red_fn(int i, int j){
int t[64],k=0,l,e,d=2e7;srand(time(0));while(k<64){t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

unsigned short green_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

unsigned short blue_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

Tôi đã mất rất nhiều nỗ lực, vì vậy tôi cảm thấy muốn chia sẻ kết quả ở các giai đoạn khác nhau và có những kết quả tốt (không chính xác) để hiển thị.

Bước đầu tiên: có một số điểm được đặt ngẫu nhiên, với x=y

nhập mô tả hình ảnh ở đây

Tôi đã chuyển đổi nó thành jpeg vì png ban đầu quá nặng để tải lên ( >2MB), tôi cá rằng đó là cách hơn 50 sắc thái của màu xám!

Thứ hai: có tọa độ y tốt hơn

Tôi không đủ khả năng để có một bảng tọa độ khác được tạo ngẫu nhiên cho ytrục, vì vậy tôi cần một cách đơn giản để có được các tọa độ " ngẫu nhiên " trong càng ít ký tự càng tốt. Tôi đã sử dụng xtọa độ của một điểm khác trong bảng, bằng cách thực hiện một chút ANDtheo chỉ số của điểm.

nhập mô tả hình ảnh ở đây

Thứ 3: Tôi không nhớ nhưng nó đang trở nên tốt đẹp

Nhưng tại thời điểm này, tôi đã vượt quá 140 ký tự, vì vậy tôi cần phải đánh nó xuống một chút.

nhập mô tả hình ảnh ở đây

Thứ 4: đường quét

Đùa thôi, đây không phải là muốn nhưng loại methinks thú vị.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Vẫn đang làm việc để giảm kích thước của thuật toán, tôi tự hào trình bày:

Phiên bản StarFox

nhập mô tả hình ảnh ở đây

Instagram inston

nhập mô tả hình ảnh ở đây

Thứ 5: tăng số điểm

Bây giờ tôi có một đoạn mã đang hoạt động, vì vậy hãy đi từ 25 đến 60 điểm. nhập mô tả hình ảnh ở đây

Điều đó thật khó để nhìn thấy chỉ từ một hình ảnh, nhưng các điểm gần như nằm trong cùng một yphạm vi. Tất nhiên, tôi đã không thay đổi thao tác bitwise, &42tốt hơn nhiều:

nhập mô tả hình ảnh ở đây

Và chúng ta ở đây, cùng một điểm với hình ảnh đầu tiên từ bài đăng này. Bây giờ chúng ta hãy giải thích mã cho những người hiếm hoi sẽ quan tâm.

Mã bị giải thích và giải thích

unsigned short red_fn(int i, int j)
{
    int t[64],          // table of 64 points's x coordinate
        k = 0,          // used for loops
        l,              // retains the index of the nearest point
        e,              // for intermediary results
        d = 2e7;        // d is the minimum distance to the (i,j) pixel encoutnered so far
        // it is initially set to 2e7=2'000'000 to be greater than the maximum distance 1024²

    srand(time(0));     // seed for random based on time of run
    // if the run overlaps two seconds, a split will be observed on the red diagram but that is
    // the better compromise I found

    while(k < 64)       // for every point
    {
        t[k] = rand() % DIM;        // assign it a random x coordinate in [0, 1023] range
        // this is done at each call unfortunately because static keyword and srand(...)
        // were mutually exclusive, lenght-wise

        if (
            (e=                         // assign the distance between pixel (i,j) and point of index k
                _sq(i - t[k])           // first part of the euclidian distance
                +
                _sq(j - t[42 & k++])    // second part, but this is the trick to have "" random "" y coordinates
                // instead of having another table to generate and look at, this uses the x coordinate of another point
                // 42 is 101010 in binary, which is a better pattern to apply a & on; it doesn't use all the table
                // I could have used 42^k to have a bijection k <-> 42^k but this creates a very visible pattern splitting the image at the diagonal
                // this also post-increments k for the while loop
            ) < d                       // chekcs if the distance we just calculated is lower than the minimal one we knew
        )
        // {                            // if that is the case
            d=e,                        // update the minimal distance
            l=k;                        // retain the index of the point for this distance
            // the comma ',' here is a trick to have multiple expressions in a single statement
            // and therefore avoiding the curly braces for the if
        // }
    }

    return t[l];        // finally, return the x coordinate of the nearest point
    // wait, what ? well, the different areas around points need to have a
    // "" random "" color too, and this does the trick without adding any variables
}

// The general idea is the same so I will only comment the differences from green_fn
unsigned short green_fn(int i, int j)
{
    static int t[64];       // we don't need to bother a srand() call, so we can have these points
    // static and generate their coordinates only once without adding too much characters
    // in C++, objects with static storage are initialized to 0
    // the table is therefore filled with 60 zeros
    // see http://stackoverflow.com/a/201116/1119972

    int k = 0, l, e, d = 2e7;

    while(k<64)
    {
        if( !t[k] )                 // this checks if the value at index k is equal to 0 or not
        // the negation of 0 will cast to true, and any other number to false
            t[k] = rand() % DIM;    // assign it a random x coordinate

        // the following is identical to red_fn
        if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)
            d=e,l=k;
    }

    return t[l];
}

Cảm ơn đã đọc cho đến nay.


1
Tôi yêu sơ đồ Voronoi. +1 để phù hợp với nó trong 3 tweet!
Martin Ender

1
Đây là một trong những mục yêu thích cá nhân của tôi. Các biến thể dòng quét rất thẩm mỹ.
Fraxtil

1
Yêu cách bạn giải thích mã
Andrea

Làm một cuộn thùng!
Starson Hochschild

pic thứ hai trong 4th: scanlines là đẹp.
Khaled.K

57

Lyapunov Fractal

Lyapunov Fractal

Chuỗi được sử dụng để tạo này là AABAB và không gian tham số là [2,4] x [2,4]. ( giải thích về không gian chuỗi và tham số ở đây )

Với không gian mã hạn chế, tôi nghĩ màu này khá tuyệt.

    //RED
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return abs(s);
    //GREEN
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return s>0?s:0;
    //BLUE
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return abs(s*x);

Tôi cũng đã thực hiện một biến thể của bộ Mandelbrot. Nó sử dụng bản đồ tương tự như bản đồ thiết lập Mandelbrot. Nói M (x, y) là bản đồ Mandelbrot. Thì M (sin (x), cos (y)) là bản đồ tôi sử dụng và thay vì kiểm tra các giá trị thoát tôi sử dụng x và y vì chúng luôn bị chặn.

//RED
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 2.5*(x*x+y*y);
//GREEN
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 15*fabs(x);
//BLUE
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 15*fabs(y);

nhập mô tả hình ảnh ở đây

BIÊN TẬP

Sau nhiều đau đớn, cuối cùng tôi cũng tìm được cách tạo ra một hình ảnh thứ hai. Đây là:

Giờ tiệc


11
Đẹp ảo giác tìm kiếm thứ hai.
Teh internets được làm bằng catz

4
Đây là điên rồ ! +1
cjfaure

10
Fractal đáng sợ là đáng sợ ༼ ༎ ຶ ෴ ༎ ຶ
Tobia

1
Holy shit thứ hai là đáng sợ. Amaximg bạn có thể nhận được bao nhiêu từ z = z ^ 2 + c đơn giản.
tomsmeding

4
Nếu Edward Munch sử dụng để vẽ fractals, thì đây sẽ là thứ mà The Scream trông giống như vậy.
teh internets được làm bằng catz

55

Vì kỳ lân.

Vì kỳ lân

Tôi không thể có phiên bản OP có unsigned shortvà giá trị màu lên tới 1023 hoạt động, vì vậy cho đến khi nó được sửa, đây là phiên bản sử dụng charvà giá trị màu tối đa là 255.

char red_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);
}
char green_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);
}
char blue_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}

Tôi muốn xem các kênh màu riêng lẻ. Điều đó sẽ rất tuyệt.
vỗ tay vào

52

Đồi hậu cần

nhập mô tả hình ảnh ở đây

Chức năng

unsigned char RD(int i,int j){    
    #define A float a=0,b,k,r,x
    #define B int e,o
    #define C(x) x>255?255:x
    #define R return
    #define D DIM
    R BL(i,j)*(D-i)/D;
}
unsigned char GR(int i,int j){      
    #define E DM1
    #define F static float
    #define G for(
    #define H r=a*1.6/D+2.4;x=1.0001*b/D
    R BL(i,j)*(D-j/2)/D;
}
unsigned char BL(int i,int j){
    F c[D][D];if(i+j<1){A;B;G;a<D;a+=0.1){G b=0;b<D;b++){H;G k=0;k<D;k++){x=r*x*(1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D;
}

Ung dung

Tất cả các #defines là để phù hợp với BL dưới 140 ký tự. Đây là phiên bản chưa được chỉnh sửa của thuật toán màu xanh, được sửa đổi một chút:

for(double a=0;a<DIM;a+=0.1){       // Incrementing a by 1 will miss points
    for(int b=0;b<DIM;b++){         // 1024 here is arbitrary, but convenient
        double r = a*(1.6/DIM)+2.4; // This is the r in the logistic bifurcation diagram (x axis)
        double x = 1.0001*b/DIM;    // This is x in the logistic bifurcation diagram (y axis). The 1.0001 is because nice fractions can lead to pathological behavior.
        for(int k=0;k<DIM;k++){
            x = r*x*(1-x);          // Apply the logistic map to x
            // We do this DIM/2 times without recording anything, just to get x out of unstable values
            if(k>DIM/2){
                if(c[(int)a][(int)(DM1*x)]<255){
                    c[(int)a][(int)(DM1*x)]+=0.01; // x makes a mark in c[][]
                } // In the golfed code, I just always add 0.01 here, and clip c to 255
            }
        }            
    }    
}

Trong đó các giá trị của x giảm thường xuyên nhất cho một r (giá trị j) nhất định, âm mưu trở nên nhẹ hơn (thường được mô tả là tối hơn).


3
Aww, tôi đã suy nghĩ về cách làm điều này ngày hôm qua. +1 để tìm ra nó. Tôi thực sự điều bảng màu là thực sự tốt đẹp như nó là! :)
Martin Ender

2
Tôi đã đánh cắp các mánh khóe bẩn thỉu từ bạn và githubphagocyte, mặc dù tôi phải chịu trách nhiệm cho #defines xấu xí. Đặc biệt là "#define G for (".
Eric Tressler

1
trông giống như một trình hiển thị khung giải đấu
Kevin L

3
Không được hình ở trên cùng: người chiến thắng chết
Eric Tressler

1
Tôi có thể có được một bản in cỡ poster này không? Với 3 tweet mờ dần trong nền. :-)
Andrew Cheong

50

Tổng hợp giới hạn khuếch tán

Tôi luôn bị cuốn hút bởi sự tổng hợp giới hạn khuếch tán và số lượng các cách khác nhau xuất hiện trong thế giới thực.

Tôi thấy thật khó để viết điều này chỉ với 140 ký tự cho mỗi hàm vì vậy tôi đã phải làm cho mã trở nên khủng khiếp (hoặc đẹp, nếu bạn thích những thứ như ++d%=4for(n=1;n;n++)). Ba hàm màu gọi nhau và xác định các macro cho nhau sử dụng, vì vậy nó không đọc tốt, nhưng mỗi hàm chỉ dưới 140 ký tự.

unsigned char RD(int i,int j){
#define D DIM
#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#define R rand()%D
#define B m[x][y]
return(i+j)?256-(BL(i,j))/2:0;}

unsigned char GR(int i,int j){
#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1
return RD(i,j);}

unsigned char BL(int i,int j){A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];}

tập hợp hạn chế khuếch tán

Để hình dung làm thế nào các hạt dần dần tổng hợp, tôi tạo ra các ảnh chụp nhanh đều đặn. Mỗi khung hình được tạo ra bằng cách thay thế 1 in for(n=1;n;n++)bằng 0, -1 << 29, -2 << 29, -3 << 29, 4 << 29, 3 << 29, 2 << 29, 1 << 29, 1. Điều này giữ cho nó chỉ dưới giới hạn 140 ký tự cho mỗi lần chạy.

tập hợp hoạt hình

Bạn có thể thấy rằng các tập hợp phát triển gần nhau sẽ tước đi các hạt và phát triển chậm hơn.


Bằng cách thực hiện một thay đổi nhỏ đối với mã, bạn có thể thấy các hạt còn lại chưa được gắn vào tập hợp. Điều này cho thấy các khu vực dày đặc hơn, nơi tăng trưởng sẽ diễn ra nhanh hơn và các khu vực rất thưa thớt giữa các tập hợp nơi không thể tăng trưởng nhiều hơn do tất cả các hạt đã được sử dụng hết.

unsigned char RD(int i,int j){
#define D DIM
#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#define R rand()%D
#define B m[x][y]
return(i+j)?256-BL(i,j):0;}

unsigned char GR(int i,int j){
#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1
return RD(i,j);}

unsigned char BL(int i,int j){A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];}

DLA với các hạt nhìn thấy được

Điều này có thể được hoạt hình theo cách tương tự như trước đây:

tập hợp hoạt hình với các hạt



50

Xoắn ốc (chính xác là 140)

sản phẩm cuối cùng

Đây chính xác là 140 ký tự nếu bạn không bao gồm các tiêu đề và dấu ngoặc hàm. Đó là sự phức tạp xoắn ốc nhiều như tôi có thể phù hợp với giới hạn nhân vật.

unsigned char RD(int i,int j){
    return DIM-BL(2*i,2*j);
}
unsigned char GR(int i,int j){
    return BL(j,i)+128;
}
unsigned char BL(int i,int j){
    i-=512;j-=512;int d=sqrt(i*i+j*j);return d+atan2(j,i)*82+sin(_cr(d*d))*32+sin(atan2(j,i)*10)*64;
}

Tôi dần dần xây dựng trên một hình xoắn ốc đơn giản, thêm các mẫu vào các cạnh xoắn ốc và thử nghiệm làm thế nào các hình xoắn ốc khác nhau có thể được kết hợp để trông thật ngầu. Đây là một phiên bản không có ý kiến ​​với các bình luận giải thích những gì từng phần. Lộn xộn với các tham số có thể tạo ra một số kết quả thú vị.

unsigned char RD(int i,int j){
    // *2 expand the spiral
    // DIM- reverse the gradient
    return DIM - BL(2*i, 2*j);
}
unsigned char GR(int i,int j){
    // notice swapped parameters
    // 128 changes phase of the spiral
    return BL(j,i)+128;
}
unsigned char BL(int i,int j){
    // center it
    i -= DIM / 2;
    j -= DIM / 2;

    double theta = atan2(j,i); //angle that point is from center
    double prc = theta / 3.14f / 2.0f; // percent around the circle

    int dist = sqrt(i*i + j*j); // distance from center

    // EDIT: if you change this to something like "prc * n * 256" where n
    //   is an integer, the spirals will line up for any arbitrarily sized
    //   DIM value, or if you make separate DIMX and DIMY values!
    int makeSpiral = prc * DIM / 2;

    // makes pattern on edge of the spiral
    int waves = sin(_cr(dist * dist)) * 32 + sin(theta * 10) * 64;

    return dist + makeSpiral + waves;
}

Lộn xộn với các tham số:

Ở đây, các hình xoắn ốc được xếp thành hàng nhưng có các mẫu cạnh khác nhau. Thay vì các cạnh khối trong ví dụ chính, nó có các cạnh hoàn toàn bao gồm các sóng tội lỗi.

các cạnh

Ở đây, gradient đã bị xóa:

không có độ dốc

Một hình ảnh động ( vì lý do nào đó dường như không lặp lại sau khi tôi tải nó lên, xin lỗi. Ngoài ra, tôi phải thu nhỏ nó. Chỉ cần mở nó trong một tab mới nếu bạn bỏ lỡ hình ảnh động ):

hoạt hình

Và, đây là album imgur với tất cả hình ảnh trong đó. Tôi muốn xem liệu có ai có thể tìm thấy các mô hình xoắn ốc thú vị khác không. Ngoài ra, tôi phải nói rằng, đây là một trong những thử thách thú vị nhất ở đây tôi từng thấy. Thưởng thức!

EDIT: Dưới đây là một số hình nền được tạo từ các hình xoắn ốc với các thông số thay đổi.

Ngoài ra, bằng cách kết hợp các mẫu cạnh xoắn ốc của tôi với một số hình chữ nhật mà tôi đã thấy ở đây thông qua việc sử dụng xor / và / hoặc các thao tác, đây là một hình xoắn ốc cuối cùng:

xoắn ốc fractal


2
Đây là những tuyệt vời! Nếu bạn nhìn xung quanh các câu trả lời khác, bạn có thể tìm thấy ý tưởng để đánh gôn này hơn nữa nếu bạn muốn có nhiều phòng hơn. Một số câu trả lời sử dụng #define trong một hàm để xác định macro mà cả 3 có thể sử dụng, do đó bạn có thể giảm tải phần lớn phép tính vào các hàm màu khác. Martin Büttner đã giới thiệu cho tôi thủ thuật đó.
trichoplax

Cảm ơn bạn! Trong trường hợp của tôi, theo như tôi có thể tìm thấy, mã của tôi thiếu loại mô hình logic trùng lặp sẽ có lợi từ định nghĩa bảng Anh. Tuy nhiên, nếu bạn thấy bất kỳ, tôi sẽ đánh giá cao nếu bạn xác định chúng cho tôi, đặc biệt là khi tôi không sử dụng C / C ++ trong nhiều năm.
xleviator

Tìm các phần trùng lặp thực sự sẽ giúp nhiều hơn, nhưng ngay cả khi không có bất kỳ sự trùng lặp nào, bạn có thể chỉ cần di chuyển mã từ BL sang RD hoặc GN bằng cách xác định nó là một macro trong RD hoặc GN và sau đó sử dụng nó trong BL. Điều đó sẽ cung cấp cho bạn gấp đôi số phòng để thêm mã.
trichoplax

Ah! Tôi hiểu rồi. Tôi thậm chí không nhận ra rằng mỗi cơ thể chức năng có giới hạn 140 ký tự. Tôi cho rằng lần sau tôi nên đọc lời nhắc cẩn thận hơn. Cảm ơn bạn đã chỉ ra rằng!
xleviator

1
Như đã được thảo luận trong cuộc trò chuyện , GIF không lặp của bạn sẽ dễ dàng được sửa chữa. Tôi nghĩ rằng nó đáng để làm vì một chút hoạt hình ngắn mà nó hiện đang trông rất tuyệt.
trichoplax

47

Cống hiến cho một cổ điển

V1 : Lấy cảm hứng từ "Hãy hạnh phúc" của DreamWar Warrior, bài nộp đơn giản này nhúng một hình ảnh nghệ thuật pixel nhỏ vào mỗi kênh màu. Tôi thậm chí không phải đánh gôn!
V2 : bây giờ với mã ngắn hơn đáng kể và viền đen dày chỉ cách ly "màn hình trò chơi".
V3 : tàu vũ trụ, viên đạn, người ngoài hành tinh bị hư hại và đường viền màu xanh, oh my! Cố gắng để nhắm đến điều này , đại khái.

// RED
#define g(I,S,W,M)j/128%8==I&W>>(j/32%4*16+i/64)%M&S[abs(i/4%16-8)-(I%2&i%64<32)]>>j/4%8&1
return g(1,"_\xB6\\\x98\0\0\0",255L<<36,64)?j:0;

// GREEN
#define S g(6,"\xFF\xFE\xF8\xF8\xF8\xF8\xF0\x0",1L<<22,64)|i/4==104&j/24==30
return g(2,"<\xBC\xB6}\30p\0\0",4080,32)|S?j:0;

// BLUE
return g(3,"_7\xB6\xFE\x5E\34\0",0x70000000FD0,64)|S|abs(i/4-128)==80&abs(j/4-128)<96|abs(j/4-128)==96&abs(i/4-128)<80?j:0;

Kẻ xâm lược không gian


Tôi tình cờ vấp phải một bản chỉnh sửa của Umber Ferrule có hình đại diện đã truyền cảm hứng cho tôi để thêm một mục dựa trên nghệ thuật pixel. Vì ý tưởng cốt lõi của mã phần lớn tương tự như Kẻ xâm lược không gian, nên tôi thêm nó vào mục này, mặc dù cả hai chắc chắn có những điểm thách thức khác nhau. Đối với điều này, việc có được màu hồng đúng (với chi phí là màu trắng) và thực tế rằng đó là một sprite khá lớn đã chứng minh những thách thức tốt đẹp. Các thoát thập lục phân ( \xFFvv) trong kênh màu đỏ biểu thị các ký tự tương ứng của chúng trong tệp nguồn (nghĩa là kênh màu đỏ trong tệp nguồn chứa dữ liệu nhị phân), trong khi các thoát bát phân là bằng chữ (nghĩa là có trong tệp nguồn).

// RED
#define g(S)(S[i/29%18*2+j/29/8%2]>>j/29%8&1)*DM1*(abs(i-512)<247&abs(j-464)<232)
return g("\xF3\xF2\xF2\x10\xF4\0\xF2\x10\xE1\xE0\x81\0\x80\0\x80\0\0\0\0\0@\0! \x03d8,=\x2C\x99\x84\xC3\x82\xE1\xE3");

// GREEN
return g(";\376z\34\377\374\372\30k\360\3\200\0\0\0\0\0\0\200\0\300\0\341 \373d\307\354\303\374e\374;\376;\377")? DM1 : BL(i,j)? DM1/2 : 0;

// BLUE
return g("\363\360\362\20\364\0\362\20\341\340\200\0\200\0\200\0\0\0\0\0\0\0\0\0\0\08\0<\0\230\0\300\0\341\340") / 2;

Bong bóng (Bong bóng Bobble)


3
Tôi thích điều này. Rất nhiều phòng để thêm các tính năng bổ sung nữa ...
trichoplax

1
Yup, có rất nhiều thủ thuật để giảm kích thước. Tôi có thể đưa ra một mở rộng vào ngày mai.
FireFly

Điều này là vô cùng ngắn bây giờ. Bạn có thể ghép một trong các mẫu bit này vào kết cấu trong câu trả lời của bạn không?
trichoplax

@ MartinBüttner rất tiếc, bạn đã đúng. Tôi đã sửa nó và thực hiện một bản cập nhật khác cho các chức năng.
FireFly

Gọn gàng, tôi thích cách bạn lấy nghệ thuật pixel 8 x 8 và "thay đổi kích thước" nó một cách nhanh chóng. Tuy nhiên, tôi đã phải thực hiện một vài thay đổi và tôi vẫn không nhận được chính xác hình ảnh của bạn. Tôi đã thay đổi 1L và 255L thành 1LL và 255LL. Vì điều đó làm cho nó tốt hơn, tôi cho rằng có lẽ bạn đang biên dịch ở chế độ 64 bit và có một số vấn đề về độ rộng bit khiến phần còn lại của hình ảnh của tôi bị sai. Nhưng, vẫn, công việc tốt đẹp!
DreamWar Warrior

44

Tranh hành động

Tôi muốn thử tái tạo một cái gì đó tương tự như tác phẩm của Jackson Pollock - nhỏ giọt và đổ sơn lên một tấm vải ngang. Mặc dù tôi thích kết quả, mã quá dài để gửi câu hỏi này và những nỗ lực tốt nhất của tôi vẫn chỉ giảm xuống còn khoảng 600 byte. Vì vậy, mã được đăng ở đây (có chức năng 139 byte, 140 byte và 140 byte tương ứng) đã được tạo ra với một lượng trợ giúp khổng lồ từ một số thiên tài trong trò chuyện . Rất cảm ơn:

cho một buổi chơi golf nhóm không ngừng.

unsigned char RD(int i,int j){
#define E(q)return i+j?T-((T-BL(i,j))*q):T;
#define T 255
#define R .1*(rand()%11)
#define M(v)(v>0&v<DIM)*int(v)
#define J [j]*250;
E(21)}

unsigned char GR(int i,int j){
#define S DIM][DIM],n=1e3,r,a,s,c,x,y,d=.1,e,f;for(;i+j<1&&n--;x=R*DM1,y=R*DM1,s=R*R*R*R,a=R*7,r=s*T)for(c=R;r>1;x+=s*cos(a),y+=s*sin
E(21)}

unsigned char BL(int i,int j){static float m[S(a),d=rand()%39?d:-d,a+=d*R,s*=1+R/99,r*=.998)for(e=-r;e++<r;)for(f=-r;f++<r;)m[M(x+e)*(e*e+f*f<r)][M(y+f)]=c;return T-m[i]J}

tranh hành động 21, 21

Macro E (q) được sử dụng trong các hàm RD và GR. Thay đổi giá trị của đối số sẽ thay đổi cách các thành phần màu đỏ và màu xanh lá cây thay đổi. Macro J kết thúc bằng một số được sử dụng để xác định mức độ thay đổi của thành phần màu xanh lam, điều này ảnh hưởng đến các thành phần màu đỏ và màu xanh lá cây vì chúng được tính toán từ nó. Tôi đã bao gồm một số hình ảnh với các đối số màu đỏ và màu xanh lá cây của E được thay đổi để hiển thị sự kết hợp màu sắc đa dạng có thể. Di chuột qua các hình ảnh cho các giá trị màu đỏ và màu xanh lá cây nếu bạn muốn tự chạy chúng.

tranh hành động 14, 14

tranh hành động 63, 49

tranh hành động 56, 42

hành động vẽ 0, 49

Tất cả những hình ảnh này có thể được xem ở kích thước đầy đủ nếu bạn tải chúng. Kích thước tệp nhỏ vì màu phẳng phù hợp với thuật toán nén PNG, do đó không yêu cầu nén mất dữ liệu để tải lên trang web.

Nếu bạn muốn xem hình ảnh từ các giai đoạn khác nhau trong quy trình chơi gôn khi chúng tôi thử những thứ khác nhau, bạn có thể xem trong trò chuyện vẽ tranh hành động .


7
Tôi đã theo dõi câu hỏi này và tất cả các câu trả lời trong một vài tuần nay, và tôi phải nói rằng, đây là câu hỏi đầu tiên khiến hàm của tôi thực sự giảm xuống. HẠNH PHÚC. Ý tôi là, tất cả các câu trả lời ở đây đều tuyệt vời - nhưng đây là điều mà tôi không bao giờ có thể mong đợi là có thể.
Todd Lehman

1
@ToddLehman cảm ơn bạn! Đây chắc chắn không phải là thứ tôi có thể ở một mình - tôi biết vì tôi đã thử ...
trichoplax

2
TUYỆT VỜI! Một trong những câu hỏi hay nhất trong câu hỏi này và đối với tôi là người duy nhất (có thể ngoại trừ người chiến thắng) trông giống như được vẽ bởi con người :)
cyriel

1
@cyriel cảm ơn rất nhiều. Bạn có thể nói cái này được vẽ bởi 5 người ...
trichoplax

43

Hình tôi sẽ chơi với các tham số của mã này ... Tất cả tín dụng được chuyển đến @Manuel Kasten. Đây là những thứ tuyệt vời đến nỗi tôi không thể cưỡng lại việc đăng bài. Nóng lạnh

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 1000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);

BubbleGumRupture http://i57.tinypic.com/3150eqa.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 40*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 10*pow((n)/800,.5);

SeussZoom http://i59.tinypic.com/am3ypi.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 2000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 1000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 4000*pow((n)/800,.5);

SeussEternalForest http://i61.tinypic.com/35akv91.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 2000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 1000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 4000*pow((n)/800,.5);

3
Hình như Tiến sĩ Seuss với tôi. Rất tuyệt!
DLosc

3
Haha, tôi thực sự đã đặt tên cho hai tập tin dưới cùng là Seuss1 và Sueuss2
Kyle McCormick

42

Chỉnh sửa: Đây là một câu trả lời hợp lệ, nhờ các tuyên bố chuyển tiếp GRBL.

Hãy vui vẻ với trình tự Q của Hofstadter! Nếu chúng ta đang sử dụng khoảng cách xuyên tâm từ một số điểm làm đầu vào và đầu ra là màu nghịch đảo, chúng ta sẽ có được thứ gì đó trông giống như nhựa vinyl màu.

nhập mô tả hình ảnh ở đây

Chuỗi này rất giống với chuỗi Fibonacci, nhưng thay vì quay lại 1 và 2 bước trong chuỗi, bạn lấy hai giá trị trước đó để xác định khoảng cách quay trở lại trước khi lấy tổng. Nó phát triển gần như tuyến tính, nhưng cứ thỉnh thoảng lại có một sự hỗn loạn (cứ tăng dần) sau đó lại lắng xuống một chuỗi gần như tuyến tính một lần nữa trước khi vụ nổ tiếp theo:

nhập mô tả hình ảnh ở đây

Bạn có thể thấy những gợn sóng này trong ảnh sau các vùng trông rất "phẳng".

Tất nhiên, chỉ sử dụng một màu là nhàm chán.

nhập mô tả hình ảnh ở đây

Bây giờ cho mã. Tôi cần hàm đệ quy để tính toán chuỗi. Để làm điều đó tôi sử dụng RDbất cứ khi nào jlà tiêu cực. Thật không may, điều đó không để lại đủ các ký tự để tự tính toán giá trị kênh màu đỏ, do đó, RDlần lượt các cuộc gọi GRvới phần bù để tạo ra kênh màu đỏ.

unsigned short RD(int i,int j){
    static int h[1000];return j<0?h[i]?h[i]:h[i]=i<2?1:RD(i-RD(i-1,j),j)+RD(i-RD(i-2,j),j):GR(i+256,j+512);
}
unsigned short GR(int i,int j){
    return DIM-4*RD(sqrt((i-512)*(i-512)+(j-768)*(j-768))/2.9,-1);
}
unsigned short BL(int i,int j){
    return DIM-4*RD(sqrt((i-768)*(i-768)+(j-256)*(j-256))/2.9,-1);
}

Tất nhiên, đây là cách sử dụng đơn giản nhất có thể của chuỗi và có vô số ký tự còn lại. Hãy mượn nó và làm những điều điên rồ khác với nó!

Đây là một phiên bản khác trong đó ranh giới và màu sắc được xác định bởi chuỗi Q. Trong trường hợp này, có đủ chỗ RDđể tôi thậm chí không cần khai báo về phía trước:

unsigned short RD(int i,int j){
    static int h[1024];return j<0?h[i]?h[i]:h[i]=i<2?1:RD(i-RD(i-1,j),j)+RD(i-RD(i-2,j),j):RD(2*RD(i,-1)-i+512>1023-j?i:1023-i,-1)/0.6;
}
unsigned short GR(int i,int j){
    return RD(i, j);
}
unsigned short BL(int i,int j){
    return RD(i, j);
}

nhập mô tả hình ảnh ở đây


1
Đó là hình ảnh màu xám thứ hai là tuyệt đẹp!
tomsmeding

Bạn có thể rút gọn điều này đủ để sử dụng các hàm r / g / b theo cách đệ quy, với tọa độ không hợp lệ cho các cuộc gọi đệ quy không?
Sparr

Tôi yêu hình ảnh nhiều màu. Câu trả lời tốt đẹp!
Alex

41

Điều này tính toán biến đổi Joukowsky của một tập hợp các vòng tròn đồng tâm tập trung vào một điểm hơi lệch so với điểm gốc. Tôi sửa đổi một chút cường độ trong kênh màu xanh để cho một chút biến đổi màu sắc.

unsigned short RD(int i,int j){
    double r=i/256.-2,s=j/256.-2,q=r*r+s*s,n=hypot(r+(.866-r/2)/q,s+(r*.866+s/2)/q),
    d=.5/log(n);if(d<0||d>1)d=1;return d*(sin(n*10)*511+512);
}
unsigned short GR(int i,int j){
    return 0;
}
unsigned short BL(int i,int j){
    double r=i/256.-2,s=j/256.-2,q=r*r+s*s;return RD(i,j)*sqrt(q/40);
}

nhập mô tả hình ảnh ở đây


39

Mục tiêu-C

Viết lại mã C ++ trong Objective-C vì tôi không thể biên dịch nó ... Nó cho kết quả giống như câu trả lời khác khi chạy trên iPad của tôi, vì vậy tất cả đều tốt.

Đây là bài dự thi của tôi:

Tam giác Galore

Mã đằng sau nó khá đơn giản:

unsigned short red_fn(int i,int j)
{
    return j^j-i^i;
}
unsigned short green_fn(int i,int j)
{
    return (i-DIM)^2+(j-DIM)^2;
}
unsigned short blue_fn(int i,int j)
{
    return i^i-j^j;
}

Bạn có thể phóng to các ô vuông bằng cách nhân ijtheo 0.5, 0.25v.v. trước khi chúng được xử lý.


Bạn có chắc chắn đó là cùng một mã bạn đã sử dụng? ^ Trông có vẻ kỳ quặc, bởi vì (i ^ i) luôn là 0 (XOR) và ^ 2 trông giống hình vuông hơn là một bit XOR.
Manuel Ferreria

1
@ManuelFerreria Với XOR, mã thực sự được biên dịch như thế này: x^(x-y)^y(điều này cũng đã ném tôi lần đầu tiên). Nếu bạn có khả năng của iOS, đây là mã của tôi: gist.github.com/Jugale/28df46f87037d81d2a8f
Max Chuquimia

38

Sierpinki sơn Splash

Tôi muốn chơi nhiều hơn với màu sắc vì vậy tôi tiếp tục thay đổi câu trả lời khác của mình (câu trả lời xoáy) và cuối cùng kết thúc với điều này.

Sierpinki sơn Splash

unsigned short RD(int i,int j){
    return(sqrt(_sq(abs(73.-i))+_sq(abs(609.-j)))+1.)/abs(sin((sqrt(_sq(abs(860.-i))+_sq(abs(162.-j))))/115.)+2)/(115^i&j);
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(abs(160.-i))+_sq(abs(60.-j)))+1.)/abs(sin((sqrt(_sq(abs(73.-i))+_sq(abs(609.-j))))/115.)+2)/(115^i&j);
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(abs(600.-i))+_sq(abs(259.-j)))+1.)/abs(sin((sqrt(_sq(abs(250.-i))+_sq(abs(20.-j))))/115.)+2)/(115^i&j);
}

Bây giờ là avatar của tôi. : P


4
Làm tốt lắm. Thưa ông, công việc tốt.
EaterOfCode

37

Tôi cảm thấy bắt buộc phải gửi mục này mà tôi sẽ gọi là "hành vi không xác định", điều này sẽ minh họa những gì trình biên dịch của bạn làm với các hàm được cho là trả về một giá trị nhưng không:

unsigned short red_fn(int i,int j){}
unsigned short green_fn(int i,int j){}
unsigned short blue_fn(int i,int j){}

Tất cả các pixel đen:

tất cả các pixel đen

Các pixel giả ngẫu nhiên:

pixel giả ngẫu nhiên

Và, tất nhiên, một loạt các kết quả có thể khác tùy thuộc vào trình biên dịch, máy tính, trình quản lý bộ nhớ, v.v.


3
Mà bạn đã nhận được?
tomsmeding

3
Tôi có màu đen và màu đặc thay đổi giữa các lần chạy khác nhau của chương trình, với các trình biên dịch khác nhau.
Sparr

8
Trình biên dịch của tôi chỉ báo lỗi và la mắng tôi vì không trả về giá trị.
Pharap

3
@Pharap đó không phải là một điều xấu :)
Sparr

Tôi nghi ngờ bạn sẽ có được sự ngẫu nhiên tốt đẹp như bức ảnh thứ hai của bạn gợi ý. Một giá trị không đổi, chỉ số của vòng lặp, v.v ... có nhiều khả năng hơn (bất cứ thứ gì được lưu trữ bên trong EAX khi hàm được gọi).
ví dụ

37

hấp dẫn

Groovy.png

Chỉ cần một số lượng giác và thủ thuật vĩ mô kỳ lạ.

RD:

#define I (i-512)
#define J (j-512)
#define A (sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

GR:

#undef A
#define A (M_PI/3+sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

BL:

#undef A
#define A (2*M_PI/3+sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

EDIT: nếu M_PIkhông được phép do chỉ hiện diện trên các hệ thống tương thích POSIX, nó có thể được thay thế bằng nghĩa đen 3.14.


1
Tôi đã có nhân vật phụ tùng, acos(-1)là một thay thế tốt cho M_PI.
Martin Ender

33

Tôi không giỏi toán. Tôi luôn là học sinh nghèo ở lớp toán. Vì vậy, tôi đã làm một đơn giản.

mathpic1.png

Tôi đã sử dụng mã Javascript của user1455003 đã sửa đổi . Và đây là mã đầy đủ của tôi .

function red(x, y) {
    return (x + y) & y;
}

function green(x, y) {
    return (255 + x - y) & x;
}

function blue(x, y) {
    // looks like blue channel is useless
    return Math.pow(x, y) & y;
}

Nó rất ngắn nên cả ba chức năng đều khớp trong một tweet.


mathpic2.png

function red(x, y) {
    return Math.cos(x & y) << 16;
}

function green(x, y) {
    return red(DIM - x, DIM - y);
}

function blue(x, y) {
    return Math.tan(x ^ y) << 8;
}

Một chức năng rất ngắn. Tôi tìm thấy mẫu sierpinki này (và một số mẫu tiếp tuyến) trong khi làm rối tung các hàm toán học khác nhau. Đây là mã đầy đủ


Chỉ cần i&jlàm cho tam giác Sierpinki thực sự. Đó là tuyệt vời .
cjfaure

Đó là cuối cùng là hình ảnh hồ sơ xứng đáng.
mbomb007

32

JavaScript

var can = document.createElement('canvas');
can.width=1024;
can.height=1024;
can.style.position='fixed';
can.style.left='0px';
can.style.top='0px';
can.onclick=function(){
  document.body.removeChild(can);
};

document.body.appendChild(can);

var ctx = can.getContext('2d');
var imageData = ctx.getImageData(0,0,1024,1024);
var data = imageData.data;
var x = 0, y = 0;
for (var i = 0, len = data.length; i < len;) {
    data[i++] = red(x, y) >> 2;
    data[i++] = green(x, y) >> 2;
    data[i++] = blue(x, y) >> 2;
    data[i++] = 255;
    if (++x === 1024) x=0, y++;
}
ctx.putImageData(imageData,0,0);

function red(x,y){
if(x>600||y>560) return 1024
x+=35,y+=41
return y%124<20&&x%108<20?1024:(y+62)%124<20&&(x+54)%108<20?1024:0
}

function green(x,y){
if(x>600||y>560) return y%160<80?0:1024
x+=35,y+=41
return y%124<20&&x%108<20?1024:(y+62)%124<20&&(x+54)%108<20?1024:0
}

function blue(x,y) {
return ((x>600||y>560)&&y%160<80)?0:1024;
}

Hoa Kỳ

Phiên bản khác. cơ quan chức năng là tweet.

function red(x,y){
c=x*y%1024
if(x>600||y>560) return c
x+=35,y+=41
return y%124<20&&x%108<20?c:(y+62)%124<20&&(x+54)%108<20?c:0
}

function green(x,y){
c=x*y%1024
if(x>600||y>560) return y%160<80?0:c
x+=35,y+=41
return y%124<20&&x%108<20?c:(y+62)%124<20&&(x+54)%108<20?c:0
}

function blue(x,y) {
return ((x>600||y>560)&&y%160<80)?0:x*y%1024;
}

nhập mô tả hình ảnh ở đây

Sửa đổi chức năng kết xuất hình ảnh. vẽ (rgbFifts, setCloseEvent);

function draw(F,e){
    var D=document
    var c,id,d,x,y,i,L,s=1024,b=D.getElementsByTagName('body')[0]
    c=D.createElement('canvas').getContext('2d')
    if(e)c.canvas.onclick=function(){b.removeChild(c.canvas)}
    b.appendChild(c.canvas)
    c.canvas.width=c.canvas.height=s
    G=c.getImageData(0,0,s,s)
    d=G.data
    x=y=i=0;
    for (L=d.length;i<L;){
        d[i++]=F.r(x,y)>>2
        d[i++]=F.g(x,y)>>2
        d[i++]=F.b(x,y)>>2
        d[i++]=255;
        if(++x===s)x=0,y++
    }
    c.putImageData(G,0,0)
}

Màu tím

var purple = {
    r: function(i,j) {
        if (j < 512) j=1024-j
        return (i % j) | i
    },
    g: function(i,j){
        if (j < 512) j = 1024 -j
        return (1024-i ^ (i %j)) % j
    },
    b: function(i,j){
        if (j < 512) j = 1024 -j
        return 1024-i | i+j %512
    }
};

draw(purple,true);

nhập mô tả hình ảnh ở đây


GIÁ RẺ! GIÁ RẺ! ; D (đó là một câu trả lời hợp lệ, quá thông minh: P Nice one!)
tomsmeding

1
Hahah .. vâng tôi biết vì vậy tôi đã gửi một câu hỏi nhiều hơn theo tinh thần của câu hỏi. Tôi thực sự đã cố gắng để tạo ra các mô hình và nghĩ rằng tôi tự hỏi nếu thực sự có thể vẽ một cái gì đó.
wolfhammer

Bạn có thể làm cho hình ảnh màu nông trông phong phú hơn một chút bằng cách thêm một số nhiễu hạt phim ở các bit thấp hơn bằng cách áp dụng "| Math.random () * 256" vào cuối chúng. Làm cho các màu tối hơn bị nhiễu ngẫu nhiên hơn mà không thay đổi các điểm nổi bật. (và tăng số lượng tùy thuộc vào ngưỡng bóng tối)
Kent Fredric

rgb ngẫu nhiên @ [10.728.728] i.imgur.com/ms4Cuzo.png
Kent Fredric

31

Họa sĩ hành tinh

//red
static int r[DIM];int p=rand()%9-4;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;
//green
static int r[DIM];int p=rand()%7-3;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;
//blue
static int r[DIM];int p=rand()%15-7;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;

Lấy cảm hứng từ mục nhập rõ ràng tuyệt vời của Martin , đây là một cách khác nhau về nó. Thay vì gieo ngẫu nhiên một phần pixel, tôi bắt đầu với góc trên cùng bên trái là RGB (512,512,512) và đi bộ ngẫu nhiên trên mỗi màu từ đó. Kết quả trông giống như một cái gì đó từ kính viễn vọng (imo).

Mỗi pixel lấy trung bình của các pixel ở trên / bên trái của nó và thêm một chút ngẫu nhiên. Bạn có thể chơi với độ biến thiên bằng cách thay đổi pbiến, nhưng tôi nghĩ những gì tôi đang sử dụng là một sự cân bằng tốt (chủ yếu vì tôi thích màu xanh, do đó biến động mờ hơn cho kết quả tốt).

Có một độ lệch âm nhỏ từ phép chia số nguyên khi tính trung bình. Tôi nghĩ rằng nó hoạt động ra, mặc dù, và cho một hiệu ứng làm tối tốt đẹp cho góc dưới cùng.

Tất nhiên, để có được nhiều hơn chỉ một kết quả, bạn sẽ cần thêm một srand()dòng vào chức năng chính của mình.

ban nhạc


2
Nếu hình ảnh lớn hơn một chút, nó sẽ trông giống như những tia sáng. o:
cjfaure

1
@cjfaure nếu bạn xem kích thước hình ảnh đầy đủ (tải xuống / nhấp chuột phải và xem hình ảnh / bất cứ thứ gì hoạt động trên hệ thống của bạn) thì nó trông còn đẹp hơn với chi tiết bổ sung.
trichoplax

biến nó thành một vòng tròn được bao quanh bởi màu đen và điều đó sẽ biến nó thành một hành tinh!
Khaled.K

1
Tôi đã cố gắng bọc cái này quanh một quả cầu trong máy xay, và tôi đã tạo ra một hình ảnh động. Xem ti tại đây: gfycat.com/SameAnotherDinosaur
starbeamrainbowlabs

30

Sóng phản xạ

unsigned char RD(int i,int j){
#define A static double w=8000,l,k,r,d,p,q,a,b,x,y;x=i;y=j;for(a=8;a+9;a--){for(b=8;b+9;b--){l=i-a*DIM-(int(a)%2?227:796);
return 0;}

unsigned char GR(int i,int j){
#define B k=j-b*DIM-(int(b)%2?417:606);r=sqrt(l*l+k*k);d=16*cos((r-w)/7)*exp(-_sq(r-w)/120);p=d*l/r;q=d*k/r;x-=p;y-=q;}}
return 0;}

unsigned char BL(int i,int j){AB
return (int(x/64)+int(y/64))%2*255;}

Một mô hình bàn cờ cơ bản bị biến dạng theo vị trí của sóng mở rộng từ một điểm giống như một hòn đá rơi xuống ao (rất xa so với độ chính xác vật lý!). Biến wlà số pixel từ điểm mà sóng đã di chuyển. Nếu wđủ lớn, sóng phản xạ từ các cạnh của hình ảnh.

w = 225

sóng có w = 225

w = 360

sóng có w = 360

w = 5390

sóng có w = 5390

Dưới đây là một GIF hiển thị một loạt các hình ảnh khi sóng mở rộng. Tôi đã cung cấp một số kích thước khác nhau, mỗi kích thước hiển thị nhiều khung hình như giới hạn kích thước tệp 500KB sẽ cho phép.

sóng GIF lớn

sóng nhỏ GIF sóng trung GIF


Nếu tôi có thể tìm ra cách lắp nó vào, lý tưởng nhất là tôi muốn mô hình giao thoa sóng để sóng trông thật hơn khi chúng giao nhau. Tôi hài lòng với sự phản ánh mặc dù.

Lưu ý rằng tôi chưa thực sự mô hình hóa phản xạ sóng trong 3 lô 140 byte. Thực sự không có bất kỳ sự phản ánh nào đang diễn ra, nó chỉ xảy ra giống như vậy. Tôi đã ẩn lời giải thích trong trường hợp bất cứ ai muốn đoán trước:

Sóng phản xạ đầu tiên giống hệt với sóng bắt nguồn từ phía bên kia của cạnh hình ảnh, cùng khoảng cách với điểm ban đầu. Vì vậy, mã tính toán vị trí chính xác cho 4 điểm cần thiết để đưa ra hiệu ứng phản xạ từ mỗi 4 cạnh. Các mức sóng phản xạ xa hơn đều giống hệt với sóng bắt nguồn từ một ô xa hơn, nếu bạn tưởng tượng hình ảnh là một ô trong một mặt phẳng. Mã này tạo ảo giác cho 8 cấp độ phản chiếu bằng cách hiển thị 189 vòng tròn mở rộng riêng biệt, mỗi vòng được đặt ở điểm chính xác trong lưới 17 x 17, để chúng đi qua ô vuông trung tâm của lưới (nghĩa là hình vuông hình ảnh) tại chỉ đúng thời điểm để tạo ấn tượng về mức độ phản ánh hiện tại cần thiết. Đây là mã đơn giản (và ngắn!), Nhưng chạy khá chậm ...


3
Yêu các GIF và lời giải thích.
DLosc

Không! Nhưng bạn ơi, những mục như thế này khiến tôi nghĩ rằng tôi cần một máy tính nhanh hơn (hoặc kiên nhẫn hơn, lol). Máy tính của bạn nhanh hơn rất nhiều hoặc tôi không muốn nghĩ bạn mất bao lâu để tạo ra tất cả các khung GIF đó.
DreamWar Warrior

3
@DreamWar Warrior Không phải tôi là bệnh nhân. Đó là máy tính xách tay của tôi không bận tâm chạy qua đêm trong khi tôi ngủ ...
trichoplax

2
Tôi thấy Pacman trong hình ảnh thứ hai.
AL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.