이 수정 된 원으로 평면 타일


22

원점을 중심으로 한 단위 원을 가져옵니다. 인접한 두 사분면 에서 원의 x와 y 절편을 연결하는 선을 가로 질러 원의 곡선을 대칭시킵니다.

결과 모양으로 평면을 타일링 할 수 있습니다.

원형 테셀레이션

멋진 2D 물리 샌드 박스 Algodoo 로이 이미지를 만들었습니다 !

이 이미지와 비슷한 이미지를 일반적인 무손실 이미지 파일 형식으로 출력하는 프로그램을 작성하십시오. 이미지를 원하는 이름으로 파일로 저장하거나 간단히 표시 할 수 있습니다. 입력이 없어야합니다.

규칙 :

  • 전체 이미지는 두 시각적으로 구분 RGB 색을 사용하여 변형 된 원 - 타일 짜여져해야 수직 가리키는 타일 수평 가리키는 타일 하나씩.

  • 원형 타일의 반경은 32 픽셀 이상이어야합니다. (위 이미지의 반경은 약 110 픽셀입니다.)

  • 이미지는 너비가 최소 4 타일, 높이가 4 타일이어야합니다. 이는 위의 규칙과 결합하여 이미지의 최소 크기는 256 × 256 픽셀 일 수 있습니다. (위의 이미지는 4 타일 x 4 타일입니다.)

  • 테셀레이션은 임의의 양으로 번역 될 수 있습니다. 예를 들어 이미지의 왼쪽 상단이 타일이 만나는 정점이 될 필요는 없습니다. 그러나 테셀레이션은 회전해서는 안됩니다.

  • 원을 그리거나 이미지 등을 출력하는 명령이있는 외부 그래픽 라이브러리를 사용할 수 있습니다.

  • 커브는 대부분의 그래픽 라이브러리가 당신을 위해 할 중간 점 원 알고리즘 으로 할 수 있듯이 원에 근사해야 합니다.

  • 타일 ​​가장자리 주변의 앤티 앨리어싱은 허용되지만 필수는 아닙니다.

바이트 단위의 최단 제출이 이깁니다.

답변:


4

gs2, 49 바이트

50 31 05 0d 1f 2a 48 0a 1e 2e 40 83 2c e8 64 2d
1e 73 ed 1e 33 40 20 30 9a a2 22 e8 e9 40 20 30
9a 30 40 20 30 ee 40 20 30 12 32 e9 12 32 55 e8
2b

PBM 이미지를 생성합니다.

산출

기억술:

# Print header
"P1" space 256 double
2dup new-line

# Make 1/4 circle
64 range dup cartesian-product
square m1 sum sqrt 64 >= m6
64 /

# Make tile
dup reverse + transpose
@2 not m1 m2
dup reverse + transpose
+

# Make quarter of image
dup reverse + z1
dup reverse +

# Loop
2 * m2
2 *

# Format
show-words m1
unlines

36

POV - 레이, 199 (163)

Old version
camera{location -9*z}light_source{-9*z}#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{X*x+x+Y*y,<.001*pow(-1,(X+Y)/2),0,.1>+X*x+x+Y*y,1}#end#end}object{L pigment{color x}}object{L rotate z*90}

Same output, but golfed down further by using default light/camera, so I dont even need to specify them
#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{<X+1,Y,9>,<.001*pow(-1,(X+Y)/2),0,.1>+<X+1,Y,9>,1}#end#end}object{L pigment{color rgb x}rotate z*90}object{L}

여기에 이미지 설명을 입력하십시오
카메라와 광원에 대해 기본 매개 변수를 최대한 많이 사용하고 있으므로 약간 어둡습니다. 먼저 풀다

camera{location 9*z look_at 0}
light_source{9*z color 1} 
#declare L=union{
    #for(X,-9,9,2)
        #for(Y,-9,9,2)
            cylinder{<1+X,Y,0>,                                 //central axis, start
                     <1+X,Y,0> + <.001*pow(-1,(X+Y)/2), 0, .1>, //central axis, end
                      1}                                        //radius
        #end         
    #end
}                         
object{L pigment{color x}} // x is the <1,0,0> vector, here interpreted as RGB
object{L rotate<0,0,90>}

실린더 축의 오프셋을 늘리고 원근을 변경하면 무슨 일이 일어나고 있는지 분명합니다.

여기에 이미지 설명을 입력하십시오


1
3D 원근법으로 인해 가장자리가 약간 왜곡되지 않습니까?
orlp

6
디스크 의 높이 0.1와 오프셋이 0.001$ \ phi = \ arctan (0.01) = 0.57 ° $만큼 기울어지면 맨 위에서 보면 디스크가 $ \ cos (\ phi) = 0.99995 $로 압착 된 것처럼 보입니다. 픽셀보다 훨씬 적습니다.
DenDenDo

@DenDenDo pov-ray는 카메라를 무한대에 넣을 수 없습니까?
Random832

@ Random832로 할 수 있습니다 camera{orthographic location -9z}. 그러나 장면은 기본적으로 2D이므로 차이가 없으므로 angle 170결과에서 어안 왜곡없이 보기로 렌더링 할 수도 있습니다.
DenDenDo

11

그누 플롯, 182

나는 세포 사이의 경계가 매우 정현파로 보임에 따라 매우 간단한 핵심 방정식으로 분석 솔루션을 찾았습니다.
여기에 이미지 설명을 입력하십시오

set view map
set isosamples 900
f(x,y)=.3*sin(x*3.14)+y
splot(ceil(f(x,y))+ceil(f(y,x)))%2?1:NaN   #can only modulo integers

여기에 이미지 설명을 입력하십시오
모양이 비슷하지만 원이 너무 정사각형입니다. 같은 개념으로, I 대체 sin연접 quartercircle-호에서 만든 곡선과 교체하여 45 ° 그 회전 xy함께 x+yx-y

set view map
set samples 800
set isosamples 800
d=.5**.5
c(x,k)=(-1)**k*sqrt(1-(x-d*(1+2*k))**2)-(-1)**k*d  # k-th circle arc
# s(x)=c(x,floor(x/d/2))                           # circlified sinus
# f(x,y)=d*s(x/d)+y
f(x,y)=d*c(x/d,floor(x))+y                         # combined commented functions
splot(ceil(f(x+y,x-y))+ceil(f(x-y,x+y)))%2?1:NaN

여기에 이미지 설명을 입력하십시오


9

컨텍스트 프리, 99 바이트

startshape d CF::Tile=[s 4]CF::Symmetry=CF::pmg,0,1,0path d{ARCTO(-1,1,1)ARCTO(1,1,-1)ARCTO(0,0,1)}

Context Free Gallery 에서 결과를 볼 수 있습니다 .


좋은 것은 Context Free의 놀라운 사용법입니다. :)
Martin Ender

7

HTML + 자바 스크립트, 277

<canvas id=C></canvas><script>r=50,C.width=C.height=9*r,T=C.getContext('2d');
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)x=2*r*(i%8-2),y=2*r*(i>>3),T.moveTo(x,y+f*r),
T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),T.arc(x,y,r,0,P,f>0),T.arc(x-r,y+f*r,r,-f*P/2,0,f<0);
T.fill()</script>

테스트하려면 html 파일로 저장하고 브라우저에서여십시오. 그렇지 않으면 스 니펫을 실행하십시오.

r=50,C.width=C.height=9*r,T=C.getContext('2d')
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)
  x=2*r*(i%8-2),y=2*r*(i>>3),
  T.moveTo(x,y+f*r),
  T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),
  T.arc(x,y,r,0,P,f>0),
  T.arc(x-r,y+f*r,r,-f*P/2,0,f<0)
T.fill()
<canvas id=C></canvas>

대중적인 수요로 인해 여기에 출력 이미지가 있습니다. 결국 그렇게 흥분되지는 않습니다 ...

타일


1
누군가가 출력을보고 싶을 때마다 코드를 실행할 필요가 없도록 이미지를 게시 할 수 있습니다.
캘빈의 취미

@ Calvin'sHobbies 아 잘 빠르며 모든 최신 브라우저에서 실행됩니다. 대신 이미지를 더 크게 만들 것입니다
edc65

사실입니다. 나는 그것이 =>당신의 많은 게시물처럼 사용 되었고 Firefox에서만 작동 한다고 생각했습니다 . 그러나 걱정하지 마십시오.
캘빈의 취미

1
이미지를 게시
해야하는

6

IDL 8.3, 201 193 183 바이트

이미지가 IDL 그래픽 창으로 출력됩니다. 아래 스크린 샷을 찍었습니다.

편집 : @ AlexA 덕분에. 바이트를 면도하는 데 도움이되는 @ Sp3000

p=!pi/99*[0:99]
q=p[49:0:-1]
o=p[99:50:-1]
window,xs=(ys=400)
for i=0,24 do cgpolygon,i mod 5*100+50*[cos(p),cos(q)-1,cos(o)+1],i/5*100+(-1)^i*50*[sin(p),sin(q)-1,sin(o)-1],/d,/fi
end

여기에 이미지 설명을 입력하십시오


6

Mathematica : 86 바이트 (또는 82 바이트)

영리한 배열 기반 방법을위한 무한한 @alephalpha 덕분에 :

Image@ArrayFlatten@Array[DiskMatrix@32~RotateLeft~32/.a_/;OddQ@+##:>1-Thread@a&,{5,5}]

배열 내부에는 익명 함수가 있습니다.이 함수는 영리한 트릭을 사용하여 인수를 추가합니다 (+## ) 합계가 홀수인지 여부를 결정합니다. 이 부울은 전체 '흰색'타일을 변환 된 '블랙'타일로 대체하는 패턴의 조건으로 사용됩니다. 거기 ArrayFlatten에서 타일을 결합하여 Image표시합니다.

더 짧은 사용에 유의하십시오 Thread 것을 하여 교체하십시오 Transpose. 대신 transpose 기호를 사용하여 4 바이트를 절약 할 수 있습니다.

이전 : 97 바이트 (또는 90 바이트)

Image@ArrayFlatten@Partition[
 Join@@Table[{#,1-Transpose@#}&@RotateLeft[DiskMatrix@32,32],{13}],5]

Transpose@#위첨자 -t 기호 (코드 포인트 U + F3C7, 바로 가기 ESCtrESC) 로 대체 하여 바이트 수를 줄일 수 있습니다 . UTF-8 에서 88 자에90 바이트 를 가져옵니다 .

여기에 이미지 설명을 입력하십시오

DiskMatrix이진 행렬을 생성하는로 시작합니다 .

DiskMatrix@32 // Image

여기에 이미지 설명을 입력하십시오

그런 다음 행렬의 행을 순환 이동하여 타일링에 대한 단위 셀을 생성합니다.

RotateLeft[DiskMatrix@32, 32] // Image

여기에 이미지 설명을 입력하십시오

비행기가 체스 판 인 경우 '흰색'사각형입니다. '검은 색'사각형의 경우 색상을 반전시키고 90도 회전해야합니다. 우리는 1 ( 1 - 1 -> 01 - 0 -> 1) 에서 빼서 뒤집을 수 있고 , 전치 (transpose)를 취함으로써 회전 할 수 있습니다 :

Image /@ {#, 1 - Transpose@#} &@RotateLeft[DiskMatrix@32, 32]

여기에 이미지 설명을 입력하십시오

이미지의 크기가 고르지 않은 경우 (최소 크기, 4) 오른쪽 가장자리의 타일은 왼쪽 가장자리의 다음 타일과 같습니다. 그러나 홀수 크기 (5)를 얻기 위해 하나의 타일을 추가 한 다음 행을 연결하면 규칙적인 패턴이 만들어집니다.

이것은 한 줄의 대체 타일을로 바꿈으로써 전체 이미지를 얻을 수 있음을 나타냅니다 Partition. 우리 Table13흑백 타일 쌍 의 목록을 만들고 Join26 개의 타일 목록으로 쌍의 목록을 평평하게하는 데 사용합니다. 그럼 Partition(A) 내로 목록 55타일의 매트릭스 ( Partition폐기가 26 후행 번째 타일)

Map[Image] /@ 
  Partition[
   Join @@ Table[{#, 1 - #\[Transpose]} &@
      RotateLeft[DiskMatrix@32, 32], {13}], 5] // MatrixForm

여기에 이미지 설명을 입력하십시오

마지막 ArrayFlatten으로 타일 행렬의 행렬을 플랫 행렬로 바꾸고 Image결과를 표시합니다.

이전 : 111 바이트

Image[ArrayFlatten[{{#, #}, {#, #}}] &[
  Join[#, Reverse@#, 2] &[
   Join[1 - Transpose@#, #] &@RotateLeft[DiskMatrix[32], 32]]]]

여기에 이미지 설명을 입력하십시오


Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
alephalpha

4

자바 550 540 508 504 바이트

이것은 자바 애플릿입니다.

import java.awt.*;public class T extends java.applet.Applet{int a=98,b=49,x,y;public void paint(Graphics g){for(x=0;x<5;x++)for(y=0;y<5;y++)a(g.create(x*a,y*a,a,a),x%2^y%2);}void a(Graphics g,int c){if(c>0){g.translate(a,0);((Graphics2D)g).scale(-1,1);}g.setColor(Color.red);g.fillRect(0,0,b,b);g.fillRect(b,b,b,b);g.setColor(Color.blue);g.fillRect(b,0,b,b);g.fillRect(0,b,b,b);g.fillArc(0,-b,a,a,180,90);g.fillArc(0,b,a,a,0,90);g.setColor(Color.red);g.fillArc(-b,0,a,a,0,-90);g.fillArc(b,0,a,a,90,90);}}

상용구로 확장 :

import java.awt.*;
public class T extends java.applet.Applet{
    int a = 98, b = 49, x, y; //Make these larger for better quality pictures. a = b * 2
    public void paint(Graphics g) {
        for (x=0; x < 5; x++)      //Make these larger for more tiles.
            for (y=0; y < 5; y++)  //
                a(g.create(x * a, y * a, a, a), x % 2 ^ y % 2);
    }

    void a(Graphics g, int c) {
        if (c > 0) {
            g.translate(a, 0);
            ((Graphics2D) g).scale(-1, 1);
        }
        g.setColor(Color.red);            //Change colors for nicer looking colors.
        g.fillRect(0, 0, b, b);
        g.fillRect(b, b, b, b);
        g.setColor(Color.blue);
        g.fillRect(b, 0, b, b);
        g.fillRect(0, b, b, b);
        g.fillArc(0, -b, a, a, 180, 90);
        g.fillArc(0, b, a, a, 0, 90);
        g.setColor(Color.red);
        g.fillArc(-b, 0, a, a, 0, -90);
        g.fillArc(b, 0, a, a, 90, 90);
    }
}

애플릿 : 다른 응용 프로그램에서 작업하는 동안 사용할 수있는 작은 응용 프로그램입니다.

이미지 예 :

여기에 이미지 설명을 입력하십시오

설명:

이것은 각 타일을 인쇄하는 방법을 사용하여 작동합니다. 메소드가 작성되기 전에 각 타일의 왼쪽 상단 모서리를 중심으로 좌표계를 사용하는 그래픽스 객체가 제공됩니다.

타일을 만들려면 다음 방법을 사용하십시오.

void a(Graphics g, int c) {
    g.setColor(Color.red);
    g.fillRect(0, 0, b, b);
    g.fillRect(b, b, b, b);
    g.setColor(Color.blue);
    g.fillRect(b, 0, b, b);
    g.fillRect(0, b, b, b);
    g.fillArc(0, -b, a, a, 180, 90);
    g.fillArc(0, b, a, a, 0, 90);
    g.setColor(Color.red);
    g.fillArc(-b, 0, a, a, 270, 90);
    g.fillArc(b, 0, a, a, 90, 90);
}

그러나 올바른 이미지를 생성하려면 다른 모든 타일을 가로로 반사해야합니다.

타일을 반영하기 위해 제공된 graphics코드를 다음 코드로 수정하면됩니다 .

g.translate(a, 0);
((Graphics2D) g).scale(-1, 1);

4 바이트의 @CoolGuy에게 감사합니다.


1
당신은 선언 x하고 y클래스의 필드로 더 골프 수 있습니다 :int a = 98, b = 49,x,y;
Spikatrix

4

매스 매 티카 299 (256)

Wordy 그러나 알아내는 것이 좋았습니다.

기본 타일은 r (아래 참조)이며 RegionPlot에 의해 표시되는 영역입니다. 타일의 왼쪽 오른쪽 반사가 만들어지고 r과 결합됩니다. 그런 다음 2 개의 타일 조립 된 그림이 반복되어 공간을 타일링합니다.

아르 자형

a_~f~b_ := (x + a)^2 + (y + b)^2 <= 1;
a = ImageAssemble;
r = RegionPlot[(0~f~0 && y <= 0 && ! f[-1, 1]) \[Or] (0~f~2 && 
      y >= -2 && ! f[1, 1]), {x, -1, 1}, {y, -2, 0}, Frame -> False,
    BoundaryStyle -> None];
s = ImageCrop@Rasterize@r;
t = s~ImageReflect~Right;
i = a@{s, t};
j = a@{t, s};
a@{k = {i, i, i, i}, m = {j, j, j, j}, k, m, k, m}

타일


1

C, 237 (209) 180 바이트

180 바이트 이 버전은 의견에 edc65가 제안한 변경 사항을 포함합니다. clang 및 기본 옵션으로 Mac에서 빌드 할 때 9 개의 컴파일러 경고가 표시됩니다.

a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}

209 바이트, Martin의 의견 제안. clang을 사용하여 경고없이 컴파일 :

#include <stdio.h>
int a,b,c,d,x,y;int main(){puts("P1 256 256");for(;b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c<256;++c)putchar(48+(x*x+y*y<962^b==d));puts("");}}

원본 버전, 237 바이트 :

#include <stdio.h>
int main(){puts("P1 256 256");for(int a=0;a<256;++a){int b=a+32&64;for(int c=0;c<256;++c){int d=c+32&64;int x=(a&64)-d?31-a&31:a&31;int y=(c&64)-b?c&31:31-c&31;putchar(48+(x*x+y*y<962^b==d));}puts("");}}

결과 (256x256) :

여기에 이미지 설명을 입력하십시오

가독성을 높이기 위해 공백이있는 원본 코드 :

#include <stdio.h>
int main()
{
    puts("P1 256 256");
    for (int a = 0; a < 256; ++a)
    {
        int b = a + 32 & 64;
        for (int c = 0; c < 256; ++c)
        {
            int d = c + 32 & 64;
            int x = (a & 64) - d ? 31 - a & 31 : a & 31;
            int y = (c & 64) - b ? c & 31 : 31 - c & 31;
            putchar(48 + (x * x + y * y < 962 ^ b == d));
        }
        puts("");
    }
}

이것은 그래픽 라이브러리를 사용하지 않으며 렌더링은 코드에 완전히 포함됩니다.

기본 아이디어는 모든 256x256 픽셀을 단순히 반복하고 이들이 32x32 하위 정사각형의 원호 내부 / 외부에 있는지 확인하는 것입니다. 전체 픽셀 좌표의 맨 아래 5 비트는 내부의 픽셀의 상대 좌표를 정의합니다. 하위 사각형. 그러면 (x, y)반지름 r으로 호 내부에있는 내부 / 외부 테스트가 표준입니다.

x * x + y * y < r * r

대부분의 논리는 호의 중심을 하위 정사각형의 올바른 모서리에 배치하고 내부 / 외부 색상을 결정하는 것입니다.

솔루션에 대한 의견 :

  • 코드는 이미지를 PBM ASCII 형식으로 생성합니다. 결과를 김프에로드하고 여기에 게시 한 실제 파일을 생성하기 위해 페인트에 복사 및 붙여 넣기를 수행했습니다. 따라서 형식이 변환되었지만 내용은 원래 출력과 동일합니다.
  • 자세히 보면 품질이 좋지 않다는 것을 알 수 있습니다. 이는 픽셀 중심 대신 픽셀의 모서리에 대해 내부 / 외부 계산이 수행되어 전체가 1/2 픽셀 떨어져 있기 때문입니다. 나는 더 잘하는 것이 매우 어렵다고 생각하지 않지만 코드를 다소 길게 만듭니다. 그리고 특정 품질 요구 사항이 없었기 때문에 이것으로 충분하다고 생각합니다.
  • 코드는 Mac에서 clang을 사용하여 컴파일되었습니다. 최신 버전은 경고를 제공하지만 초기 버전은 그렇지 않습니다.
  • 이것은 내가 이것들 중 하나를 처음 시도한 것이므로 아마도 마지막 바이트를 저장하는 몇 가지 트릭을 놓쳤을 것입니다.

3
PPCG에 오신 것을 환영합니다! 나는 큰 C 골퍼는 아니지만 몇 가지 개선 사항을 볼 수 있다고 생각합니다. 선언을 다음과 같이 그룹화하십시오 int a,b,c,d,x,y;... main(a,b,c,d,x,y)기본 유형이 int 인 것을 기억할 수도 있습니다 . 일단 제거하면 할당을 d, x 및 y로 내부 for의 증가 명령문으로 d=c+32&64,...,++c이동할 수 있습니다 (아마도 ++언급 한 다른 곳으로 옮길 수도 있음 c). 내부 for. 잘 했어, btw! :)
Martin Ender

감사! 팁 목록에 유형이없는 인수를 선언하는 트릭을 보았지만 너무 더러워서 거기에 갈 수 없었습니다. ;) 나는 비표준 인수 main()가 표준을 준수 한다고 생각하지 않습니다 . 나는 분명히 선언을 그룹화해야한다. 증분을 이동하면 몇 바이트도 절약됩니다. puts()줄 바꿈에 대한 내가 괄호를 제거 얻을 수 있다면 그래서 잘 모르겠어요, 외부 루프입니다.
Reto Koradi

우리는 보통 일반적인 컴파일러에서 컴파일하는 한 일반적으로 괜찮습니다 (따라서 표준 C 일 필요는 없습니다). 또한 네, 바깥 괄호를 제거 할 수는 없지만 내부 괄호를 제거 할 수 있다고 생각합니다.
마틴 엔더

210 바이트로 줄였습니다. 아이디어 주셔서 감사합니다.
Reto Koradi

1
힌트 : stdio필요하지 않습니다. 기본 함수 선언을 사용하십시오. int전역에 대한 기본값이며 생략 할 수 있습니다 (변수 및 기본). 먼저 puts안으로 들어갈 수 있습니다. 내부 루프 내부에서는 c var가 사용되지 않으므로 상태가 증가합니다. 180 : a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}(많은 경고로 컴파일되지만 실행 됨)
edc65 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.