힐버트 커브 그리기


12

힐버트 커브는 일종의 공간 채우기 커브이며 기본적으로 선을 평면에 매핑합니다. 선의 각 점은 평면의 한 점에 해당하고 평면의 각 점은 선의 한 점에 해당합니다. 힐버트 커브의 0에서 4까지의 반복이 표시됩니다.

반복 0-최대 4

이 작업의 목표 : 위에서 정의한대로 Hilbert Curve의 네 번째 반복을 그리는 코드를 작성하십시오. 코드가 완성되어야합니다. 즉, 힐버트 곡선을 그리는 함수를 만들면 코드가 해당 함수를 호출해야합니다. 출력은 화면에 직접 표시되거나 출력을 이미지 파일에 쓸 수 있습니다. 커브가 회전되거나 뒤집힐 수 있지만 선이 직각으로 교차해야하며 출력을 늘릴 수 없습니다. ASCII 예술은 인정되지만 받아 들여지지 않을 것입니다. 바이트 단위의 최단 코드가 승리합니다!


입력 횟수입니까? 아니면 4 이상의 값을 선택할 수 있습니까?
루이스 멘도

ASCII 아트가 그래픽으로 간주됩니까?
가브리엘 베 나미

아니; 죄송합니다. – 다른 질문과 중복 될 수 있습니다.
J. Antonio Perez

@JorgePerez 커브가 다른 방향을 가질 수 있습니까? 예를 들어 수직으로 뒤집거나 90도 회전하는 버전처럼
Luis Mendo

예! 전반적인 모양은 여전히 ​​정사각형이어야하지만
J. Antonio Perez

답변:


7

R, 90 바이트

n=scan();a=1+1i;b=1-1i;z=0;for(k in 1:n)z=c((w<-1i*Conj(z))-a,z-b,z+a,b-w)/2;plot(z,t="s")

@Luis Mendo가 게시 한 링크에 사용 된 알고리즘의 뻔뻔한 R- 포트.

들어 n=5우리 얻을 :

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


7

MATL , 39 38 바이트

O5:"tZjJ*JQ-wJq+t2+&y2j+_v2/]XG25Y01ZG

반복 횟수를 입력으로 사용합니다. 하드 코딩 i하려면 숫자로 바꾸 십시오.

이 프로그램은 여기에 표시된 Jonas Lundgren의 Matlab 코드 포트입니다 .

결과는 아래와 같습니다. MATL Online 에서 사용해 볼 수도 있습니다 ! 출력을 생성하는 데 몇 초가 걸립니다. 이 컴파일러는 실험적입니다. 처음에 작동하지 않으면 페이지를 새로 고치고 "실행"을 다시 눌러야 할 수도 있습니다.

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

설명

O          % Push 0. This is the initial value of "z" in the original code
5:"        % Do 5 times
  t        %   Duplicate
  Zj       %   Complex conjugate
  J*       %   Multiply by 1j (imaginary unit). This is "w" in the original code
  JQ-      %   Subtract 1+1j
  w        %   Swap: brings copy of "z" to top
  Jq+      %   Add 1-1j
  t        %   Duplicate
  2+       %   Add 2
  &y       %   Duplicate the third element from top
  2j+_     %   Add 2j and negate
  v        %   Concatenate the three matrices vertically
  2/       %   Divide by 2
]          % End
XG         % Plot (in complex plane). The numbers are joined by straight lines
25Y0       % Push string 'square'
1ZG        % Make axis square

코드 작동 방식을 설명해 주시겠습니까?
J. Antonio Perez

알고리즘은 링크와 동일합니다. 하지만 설명을 추가합니다
루이스 Mendo

@Jorge 설명 추가
루이스 Mendo

omg, 당신이 기반으로 한 것이 내 것보다 훨씬 쉽습니다. = /
flawr

@flawr Jonas Lundgren에 대한 모든 신용 :-)
Luis Mendo

6

MATLAB, 264 262 161 바이트

이것은 기본적으로 힐버트 커브의 "유도"를 계산 한 다음 "cumsum"을 통해 "통합"한다는 점을 제외하고는 여전히 거의 동일하게 작동합니다. 이것은 꽤 많은 바이트로 코드 크기를 줄입니다.

function c;plot(cumsum([0,h(1,1+i,4)]));axis equal;end function v=h(f,d,l);v=d*[i*f,1,-i*f];if l;l=l-1;D=i*d*f;w=h(f,d,l);x=h(-f,D,l);v=[x,D,w,d,w,-D,-x];end;end

구 버전

이것은 단순한 재귀 접근 방식입니다. 단순성을 위해 벡터 정보를 저장하기 위해 복소수를 사용했습니다. 파트에서 커브를 변경할 수 있습니다 h(0,1,1+i,4). 첫 번째 인수 p=0는 초기 위치이고 두 번째 인수 f는 방향 ( +1또는 -1)에 대한 플래그 이며, 세 번째 인수 d는 곡선을 그려야하는 방향 / 회전이며 네 번째 인수 는 l재귀 깊이입니다.

function c;hold on;h(0,1,1+i,4);axis equal;end function p=h(p,f,d,l);q=@plot;if l;l=l-1;d=i*d*f;p=h(p,-f,d,l);q(p+[0,d]);p=p+d;d=-i*d*f;p=h(p,f,d,l);q(p+[0,d]);p=p+d;p=h(p,f,d,l);d=-i*d*f;q(p+[0,d]);p=p+d;p=h(p,-f,d,l);else;q(p + d*[0,i*f,1+i*f,1]);p=p+d;end;end

이전 버전에서는 다음과 같습니다.

이것은 2015b에서 보이는 모습입니다.

->

1
matlab에 R2015b에서 그것은 색상 플롯 <3
루이스 Mendo

Haha so cool :)
flawr

@LuisMendo 나는 이제 cumsum화려한 아이디어 로 골프를 조금 할 수있었습니다 !
flawr

3

MATLAB / 옥타브, 202 바이트

나는 눈치 @LuisMendo 링크 된 버전 IS는 이전보다 훨씬 짧았다 "수제"솔루션을 하지만 전혀 다른 접근 방식을 사용합니다. 골프 버전을 CW로 게시하고 있습니다.

이 버전은 Lindenmayer 시스템 접근 방식을 기반으로합니다.

A=zeros(0,2);B=A;C=A;D=A;n=[0,1];e=[1,0];for k=1:4;a=[B;n;A;e;A;-n;C];b=[A;e;B;n;B;-e;D];c=[D;-e;C;-n;C;e;A];D=[C;-n;D;-e;D;n;B];A=a;B=b;C=c;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

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


3

자바 스크립트 (ES6), 266 ... 233 232 바이트

힐버트 커브의 SVG 렌더링.

document.write('<svg><path fill=none stroke=red d="M8 8'+(f=(i,s='2',d=x=y=8)=>i?f(i-1,s.replace(/./g,c=>[32410401423,,10432423401][+c]||c)):s.replace(/./g,c=>c-4?(d+=c&1&&c-2,''):`L${x+=4-'4840'[d&=3]} ${y+=4-'0484'[d]}`))(5)+'">')

Neil 덕분에 1 바이트 절약


1
시도fill=none
Neil

2

파이썬 3, 177 175 171 바이트

Hilbert 곡선을위한 Lindenmayer 시스템의 간단한 구현. 골프 제안을 환영합니다!

편집 : Kade 덕분에 -2 바이트. 힐버트 커브의 구축 방식을 재구성 한 후 -3 바이트. ETHproduction 덕분에 -1 바이트.

from turtle import*;s="a";exec('t=""\nfor c in s:t+=c>"F"and"+-abFF-+baFFba-+FFab+-"[c<"b"::2]or c\ns=t;'*5)
for c in s:
 if"-">c:rt(90)
 elif"F">c:lt(90)
 elif"a">c:fd(9)

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

언 골핑

import turtle

hilbert_seq = "a"

for _ in range(5):
    new_seq = ""
    for char in hilbert_seq:
        if char == "a":
            new_seq += "-bF+aFa+Fb-"
        elif char == "b":
            new_seq += "+aF-bFb-Fa+"
        else:
            new_seq += char
    hilbert_seq = new_seq

for char in hilbert_seq:
    if char == "F":
        turtle.forward(9)
    elif char == "+":
        turtle.right(90)
    elif char == "-":
        turtle.left(90)

양식을 변경 t하면 2 바이트를 절약 할 수 있습니다 t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]. 두 패턴의 패턴이 거의 동일하기 때문에이를 사용할 수있는 방법이 있는지 궁금합니다.
Kade

아마도 변경 if c>"E":하는 if"E"<c:바이트를 저장?
ETHproductions

1

MSWLogo (버전 6.5b), 136 바이트

최종 힐버트 곡선 프로그램을 바탕으로 여기에 .

to h :n :a :l
if :n=0[stop]
rt :a
h :n-1(-:a):l
fd :l
lt :a
h :n-1 :a :l
fd :l
h :n-1 :a :l
lt :a
fd :l
h :n-1(-:a):l
rt :a
end
h 5 90 9

h반복 횟수 :n(1 기반), angle :a, length 를 취하는 함수 가 정의됩니다 :l. :a방향이 올바른지 확인하기 위해 두 인스턴스에서 부정 된 각도로 더 낮은 반복을 호출하는 것이 재귀 적 입니다.

  • rt :a, lt :a오른쪽, 왼쪽 거북이 (그 경로 추적된다 삼각형 꼬) 회전 :a도.
  • fd :l거북이를 :l단계별로 앞으로 움직 입니다.

마지막으로 함수는 다음과 같습니다 h 5 90 9. 거북이는 2 바이트를 더 숨길 수 있습니다 ht.

(5-1) 번째 반복


왼쪽 상단에서 무슨 일이 일어나고 있습니까?
flawr

@flawr 거북이야. 를 추가하여 숨길 수 있습니다 ht.
Monica

1

Mathematica 128 바이트

Graphics[Line@AnglePath[Total/@Split[Cases[Nest[#/.{-2->(s=##&@@#&)[l={-1,2,0,1,-2,0,-2,1,0,2,-1}],2->s@-l}&,{-2},4],-1|1|0],#!=0&][[;;-2,;;-2]]*Pi/2]]

원하는 경우 위의 4를 다른 반복 횟수로 바꾸십시오.

문자열 시퀀스가 ​​아닌 정수 시퀀스를 사용하여 Lindenmayer 시스템으로 수행되었으므로 두 번째 생산 규칙은 첫 번째 규칙의 부정입니다. 이 버전은 151 바이트입니다.

Jonas Lundgren의 MATLAB 코드 포트는 128 바이트입니다.

z=0;Graphics[Line[{Re[#],Im[#]}&/@Flatten[Table[w=I*Conjugate[z];z={w-(a=1+I),z-(b=1-I),z+a,b-w}/2,{k,5}][[5]]]],AspectRatio->1]

나는 Mathematica의 향후 버전에서 다음과 같이 실제로 짧아 질 수 있음을 알았습니다.

Graphics@HilbertCurve[n]

http://mathworld.wolfram.com/HilbertCurve.html


1

LindenMASM , 63 바이트

LindenMASM 답변이 또 다른 질문이 있습니까? 대박!

STT
AXI A
INC 5
SET F 0
RPL A -BF+AFA+FB-
RPL B +AF-BFB-FA+
END

다시 한 번 파이썬의 일부 그리기 버그로 인해 turtle때로는이 작업을 실행할 때 전체 그림이 없습니다. 그러나 실제로 작동하는 것을 볼 수 있습니다.

4 번째 반복

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.