코흐 눈송이의 그래픽 표현


13

코크 눈송이 생성

Koch 눈송이는 각 삼각형의 삼각형이며 n, 각 측면의 중간에 다른 정점이 추가됩니다. http://en.wikipedia.org/wiki/Koch_snowflake#Properties

우리는 이미 Koch Snowflake 도전을 받았습니다 n=4. 새로운 도전은 어떤으로 코흐 눈송이을 그릴 것입니다 n사이 110.

규칙

눈송이는 프로그램이나 파일에서 하드 코딩되지 않을 수 있습니다. 프로그램에서 생성해야합니다.

프로그램은 n1에서 10 사이의 모든 크기 를 지원해야합니다 .

변의 수는 사용자가 표준 입력을 통해 입력해야합니다.

눈송이의 그래픽 표현을 화면에 인쇄해야합니다.

n1, 2, 3 및 4 가 동일한 샘플 Koch Snowflakes (명확성을 위해 녹색 선은 재현하지 않음) :

코흐 눈송이

타이 브레이커가 발생하는 경우, 많은 투표 수를 가진 프로그램이 승리합니다 (팝 콘테스트).


"이 기능을 사용하여 픽셀을 배치 할 위치를 계산해야합니다. 프로그램에이 기능을위한 내장 기능이없는 경우 점수에서 구현 비용을 공제 할 수 있습니다. " 어떤 픽셀?
xnor

@xnor 원래는 픽셀 / 문자 단위로 눈송이를 그리는 방법을 계산하기위한 것이 었습니다 (도전은 ASCII 기술로도 해결되었습니다). 대부분의 사람들은 아마도 라인을 사용할 것이므로 제거 할 것입니다.

눈송이 전체를 채울 수 있습니까?
xnor

물론이야. 이 의견은 더 길어야합니다.

이외에도 n=7컴퓨터 화면의 눈송이에서 새로 추가 된 삼각형을 볼 수 없습니다. 여기에 "최선의 노력"이 있습니까? 픽셀 기반 솔루션에 대한 최소 해상도가 있습니까?
xnor

답변:


7

매스 매 티카 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

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

alephalpha 주셔서 감사합니다.


좋은 작업. 두 명의 캐릭터로 골프를 치면 승리합니다!

@ Hosch250 업데이트, 감사합니다.
chyanog

AnglePathMathematica 10.1에서 사용할 수 있습니다 .
alephalpha

@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha

1
@alephalpha 73 문자 :ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog

15

MATLAB, 119 (115)

이벤트가 비정상적으로 바뀌면서 골프를 타면서이 프로그램이 실제로 더 잘 작동한다는 것을 알았습니다. 첫째, 벡터화로 인해 훨씬 ​​빨라졌습니다. 이제 ~n:~입력 할 수량을 알려주 는 유용한 프롬프트가 표시됩니다 !

개행은 프로그램의 일부가 아닙니다.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9 : n = 9

o같은지 임의의 문자열 [0 2 4 0]모듈 6. 전자 iπ / 3 이 힘으로 상승 복소 평면 정삼각형의 정점을 제공. 첫 번째 kron는 각 포인트가 4 번 복제 된 포인트 목록의 사본을 만드는 데 사용됩니다. ~~o4의 벡터를 얻는 편리한 방법입니다. 두 번째 diff(P)연속 점 쌍 사이의 벡터를 찾습니다. 이 벡터의 배수 (0, 1/3, (1 + e -iπ / 3 ) / 3 및 2/3)가 각각의 이전 포인트에 추가됩니다.


음,이 코드가 어떻게 작동하는지 좀 더 설명해 주시겠습니까? 나는 Matlab을 알고 있다고 생각했지만 이것은 ... 광기입니까? =)
flawr

@flawr 몇 가지 메모를 추가했는데 도움이 되었습니까?
feersum

대단히 감사합니다! 나는 그 문자열 남용 트릭을 명심할 것이다 =)
flawr

9

T-SQL : 686 (포맷 제외)

SQL Server 2012+의 경우

이것이 결코 경쟁자가 될 수는 없지만 T-SQL로 할 수 있는지 확인해야했습니다. 3 개의 초기 모서리로 시작한 다음 각 모서리를 통해 되풀이하여 각 수준에 대해 4 개의 모서리로 교체하는 방식으로 사라졌습니다. 마지막으로 @i에 지정된 레벨의 단일 지오메트리로 통합

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

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


나는 그러한 마법사가 T-SQL로 달성 될 수 있다는 것을 몰랐다!
Harry Mustoe-Playfair

9

로고 : 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

k단일 레벨 매개 변수로 기능 을 정의합니다 .

편집하다

이 온라인 편집기 http://www.calormen.com/jslogo/k readword 에서 입력에 대한 프롬프트를 사용하도록 추가 할 수 있지만 어떤 이유로이 명령은 표준 약어를 지원하지 않습니다 rw.

아래 102 자 솔루션은 USBLogo에서 질문에 지정된 표준 입력으로 작동합니다. 그러나 UCBLogo에는 이상한 파서가 있으므로 코드를 약간 변경해야했습니다. 그것은 필요 toend전에 별도의 라인과 공간에있을 :필요하지만 다른 한편으로되는 :선택 사항입니다.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

LOGO는 어떻게 운영합니까?
Beta Decay

@BetaDecay 나는이 사용 : logo.twentygototen.org을 하지만이 처음 내가 발견 : calormen.com/jslogo 또한 USBLogo를 설치할 수 있습니다
nutki

8

BBC 베이직, 179

REV 1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

이전과 같지만 흑백으로, 골프화되지 않은 (단순화 된) 골프 버전입니다. 이 방법을 사용하면 n = 1의 특별한 치료가 필요하지 않다는 사실에도 불구하고 승자는 아닙니다.

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

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

REV 0

@xnor에 대한 OP의 답변에 따르면 눈송이로 채워진 것은 괜찮습니다. 이 답변은 xnor의 의견에서 영감을 받았습니다. 색상은 재미를 위해 만들어졌으며 구성 방식을 보여줍니다. 삼각형 (이 경우 자홍색)을 취하고 밑면의 1/3 인 6 개의 삼각형으로 오버 플롯합니다.

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

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


1
7 개가 서로 병합 된 것처럼 보입니다.

@ hosch250 사실, 나는 실루엣이 Koch 눈송이 인 새로운 프랙탈을 "발명"한 것으로 보이며, 자홍색 부분을 삭제하면 6 개의 작은 Koch 눈송이가 남습니다. 골프 버전은 평범한 검은 색 실루엣이지만이 이미지도 그대로 두겠습니다.
Level River St

BBC Basic 또는 BBC BASIC이라고 쓰십니까? 나는 후자를 위해 간다. 그러나 그것이 옳은지 모르겠다.
Beta Decay

2
@BetaDecay BASIC은 초보자의 다목적 표준 / 심볼 명령 코드의 약자입니다. "표준"비트는 변형이 너무 많으므로 논쟁의 여지가 있습니다. en.wikipedia.org/wiki/BASIC . 대부분의 BASIC 변형은 대문자 버전을 선호하지만 Wikipedia 페이지에 따르면 Visual Basic은 소문자를 선호합니다. 선적 된 BBC BASIC은 대문자라고 생각합니다. bbcbasic.co.uk/bbcwin/bbcwin.html 의 버전을 사용하고 있습니다. 그것은 웹 사이트와 IDE에서 대문자이므로 대문자 버전이 더 정확하다고 말하고 싶습니다. 그러나 나는 그것이 중요하지 않다고 생각합니다.
Level River St

알았어, 대문자 버전으로 계속 할게요
Beta Decay

8

수학-177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

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

중간 부분의 각도를 변경하는 보너스 클립

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


6

파이썬 3-139

거북이 그래픽 라이브러리를 사용합니다.

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])

멋있는. 두 줄 이상의 코드로 모양을 찾는 문자열 기반 접근 방식이 마음에 듭니다. 하지만 당신은 확인하지 수 "G">j, "Q"<j및 사용 fd(9/b)3 바이트를 저장? 또한 if예를 들어 ("G">j)인수 9/b와 같은 문장이 곱해지는 것을 피하고 한 줄 뒤에 모두 넣을 수 있습니다 for. 오! 그럼 당신도 결합 할 수 있습니다 rtlt사용120*(...)-60*(...)
팔코

이것은 Koch 눈송이 입력 + 1을 렌더링하는 것으로 보입니다. 1의 입력은 위의 그림과 같이 삼각형이어야합니다.

@Falko 모든 도움을 주셔서 감사합니다!
Beta Decay

@ hosch250 수정
베타 부패

이제 아무것도 그릴 수 없으며 1을 입력하면 0으로 나누기 오류가 발생합니다.

4

파이썬 3, 117 바이트

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

방법:

  • 이 솔루션은 Python의 거북이 그래픽을 사용합니다.
  • n 이다 input - 1
  • 문자열에서 시작 0000하여 모든 문자를 eval 트릭으로101 n 반복적으로 반복합니다 (@xnor 덕분에).
  • 마지막 문자열의 모든 문자에 대해 문자 값 ( 1또는 0)을 기준으로 60도 오른쪽 또는 120도 왼쪽으로 돌리고 모든 길이 99/3^n와 비슷한 크기를 보장하는 길이 ( )를 앞으로 이동합니다 n.
  • 0문자열 의 마지막 은 쓸모가 없지만 첫 번째 0그리는 것과 같은 줄을 다시 그립니다.

의 출력 예 input = 3:

코흐


2

R : 240 (175)

R 주위에 머리를 갖기 위해 다른 버전이 있습니다. 이 작업을 수행하는 더 좋은 방법이있을 가능성이 높으며 포인터를 받아 드리겠습니다. 내가 한 일은 매우 복잡해 보입니다.

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

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


2

현명한 fwom youw gwave ...

나는 TURT를 사용하여 Befunge-98에서 이것을 구현하려고한다는 것을 알고 있었지만 어떻게 해야하는지 알 수 없었고 몇 달 동안 앉았습니다. 이제는 최근에야 자체 수정을 사용하지 않고 할 수있는 방법을 찾았습니다. 그리고 ...

TURT 지문을 사용한 Befunge-98, 103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

먼저 구현 세부 정보를 얻자.

  • CCTU 2.1을 사용하여 이것을 테스트 했는데 , TURT (터틀 그래픽 지문)를 구현 I하면 이미지를 SVG 파일로 "인쇄"합니다. command-argument없이 CCBI에서 이것을 실행하면 --turt-line=PATH기본적으로 CCBI_TURT.svg라는 파일로 나타납니다. 이것은 내가 찾을 수있는 Funge 통역사와 함께 "스크린에 눈송이의 그래픽 표현을 인쇄" 할 수있는 가장 가까운 것 입니다. 어쩌면 언젠가 거북이를위한 그래픽 디스플레이가있는 더 나은 통역사가있을 것입니다.
  • CCBI가 중단없이 실행하려면 줄 바꿈이 있어야합니다 (문자 수에 포함됨). 알아요?

기본적으로 이것은 스택을 일종의 임시 L 시스템으로 사용하고 즉시 확장하여 작동합니다. 각 패스에서 스택의 최상위 번호가 다음과 같은 경우

  • -2 다음에 인쇄 및 중지합니다.
  • -1, 거북이는 반 시계 방향으로 60도 회전합니다.
  • 0, 시계 방향으로 120도 회전합니다.
  • 1, 앞으로 이동합니다 (여기에서는 15 픽셀 씩이지만 f마지막 줄에서 수정하여 변경할 수 있음 ).
  • 숫자 n 이 2 이상인 경우 스택에서로 확장됩니다 n-1, -1, n-1, 0, n-1, -1, n-1.

n = 10경우이 프로세스는 시간이 오래 걸리며 (시스템에서 몇 분), 결과 SVG는 크기가 ~ 10MB이고 브라우저에서 볼 때 TURT를 사용하여 브러시의 크기를 조정할 수 없기 때문에 보이지 않습니다. 올바른 플러그인이 있으면 IrfanView가 제대로 작동하는 것 같습니다. SVG에 익숙하지 않으므로 파일을 보는 데 선호되는 방법이 무엇인지 (특히 파일이 큰 경우) 알 수 없습니다.

이봐, 적어도 그것은 작동합니다 -Befunge를 고려할 때, 스스로 감사해야 할 것입니다.


1

파이썬 2, 127 바이트

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)

1
여기에 50,000 번째 글을 올리게 된 것에 대해 감사드립니다.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.