통치자와 나침의로 n-gon 구성


16

이 작업 은 나침반과 표시되지 않은 눈금자 만 사용하여 n면의 규칙적인 다각형을 그리는 것입니다.

입력 (n)은 3, 4, 5, 6, 8, 10, 12, 15, 16, 17의 10 개 숫자 중 하나입니다.

방법 : 자와 나침반 만 있기 때문에 점, 선 및 원만 그릴 수 있습니다.

선은 그릴 수 있습니다 :

  • 두 개의 기존 포인트를 통해.

원은 그릴 수 있습니다 :

  • 한 점을 중심으로하고 둘레를 두 번째 점을 통과합니다.

점만 그릴 수 있습니다 :

  • 두 선의 교차점에서

  • 선과 원의 교차점에서

  • 두 원의 교차점에서

  • 처음에, 당신은 시작하기 위해 2 점을 그릴 수 있습니다.

이 프로세스를 통해 (이 프로세스를 통해서만) 요청 된 n-gon의 n 라인과 해당 단계에 도달하는 데 필요한 작업을 그려야합니다.

편집 : 교차점의 위치를 ​​계산해야하지만 언어가 제공하는 수단으로 선과 원을 그릴 수 있습니다.

출력 은 작업을 보여주는 n면 정규 다각형의 이미지입니다.

그래픽 으로 이미지 크기, 형식, 선 두께 또는 여기에 언급되지 않은 기타 사항에는 제한이 없습니다. 그러나 뚜렷한 선, 원 및 그 교차점을 시각적으로 구별 할 수 있어야합니다. 또한 :

  • n-gon의 변을 구성하는 n 선은 '작업'과 다른 색 (즉, 점, 원 또는 다른 선)과 다른 색이어야하며 배경과 다시 다른 색이어야합니다.
  • 작업하면 점을 제외하고 그림 영역의 경계를 벗어날 수 있으며 점은 모두 이미지의 보이는 범위 내에 있어야합니다.
  • 원은 완전한 교차 또는 원 호일 수 있습니다 (필요한 교차점을 표시하는 한).
  • 선은 무한하거나 (예 : 그리기 영역을 떠나는) 두 점에서 잘립니다. 편집 : 어떤 길이로 선을 그릴 수 있습니다. 그려진 선이 시각적으로 교차하는 지점 만 만들 수 있습니다.
  • 표시하지 않은 것을 포함하여 원하는대로 점을 그릴 수 있습니다.

채점 은 2 배이며 제출은 지원하는 입력 당 1 점을 얻습니다. 최대 10 점입니다. 드로우의 경우 최단 바이트 수가 이깁니다.

가장 적은 단계로 n-gon을 구성 할 수 있거나 주어진 범위를 벗어난 n-gon을 구성 할 수있는 제출물에 대해서는 인정되지만 점수에 도움이되지는 않습니다.

Wikipedia의 배경 정보


정의 된 지점에서 선을 잘라 내면 관련 교차점이 그려진 선 밖에있을 수 있습니다.
Martin Ender

우리의 언어가 제공하는 경우 단일 선 스트립 ABC를 플로팅하여 두 선 세그먼트 AB와 BC를 플로팅하는 것과 같은 바로 가기를 사용할 수 있습니까?
Martin Ender

1
구성 을 그리는 것으로 충분 합니까, 아니면 프로그램도 계산 해야합니까? 예를 들어, 나는 지점 (300, 400)를 통과하는 원점에 원을 그리려면 내가 (반경이다 아는 500) 수있는 일 CIRCLE 0,0,500또는 내가 어떻게해야합니까 R=SQRT(300^2+400^2): CIRCLE 0,0,R? (BTW 교차로의 위치를 ​​알아내는 것은 아마도 선과 원보다 어렵습니다.)
Level River St

Wikipedia에서 :Carl Friedrich Gauss in 1796 showed that a regular n-sided polygon can be constructed with straightedge and compass if the odd prime factors of n are distinct Fermat primes
Dr. belisarius

일반적으로 벨리 사리우스의 인용과 같이 수학 용어에서는 "표시되지 않은 눈금자"를 "직선"이라고합니다.
justhalf

답변:


10

BBC Basic, 8 개 폴리곤 : 3,4,5,6,8,10,12,15면 (60면)

http://www.bbcbasic.co.uk/bbcwin/download.html 에서 에뮬레이터를 다운로드 하십시오.

사전 건축이 다소 복잡해져 16면을 포함하지 않기로 결정했습니다. 2 개 이상의 원과 선이 필요합니다. BTW 17면은 실제로 매우 복잡하며 별도의 프로그램으로 가장 적합 할 것입니다.

펜타곤을 만들기 위해 원래 구조에 2 개의 원을 추가하면 더 많은 수익을 얻었습니다.

  GCOL 7                               :REM light grey
  z=999                                :REM width of display (in positive and negative direction)
  e=1                                  :REM enable automatic drawing of line through intersections of 2 circles
  DIM m(99),c(99),p(99),q(99),r(99)    :REM array dimensioning for lines and points
  REM lines have a gradient m and y-intercept c. Points have coordinates (p,q) and may be associated with a circle of radius r.

  REM PRECONSTRUCTION

  ORIGIN 500,500
  p(60)=0:q(60)=0                      :REM P60=centre of main circle
  p(15)=240:q(15)=70                   :REM P15=intersection main circle & horiz line
  t=FNr(60,15)                         :REM draw main circle, set radius, SQR(240^2+70^2)=250 units (125 pixels)
  t=FNl(1,60,15)                       :REM L1=horizontal through main circle
  t=FNc(15,45,1,60,-1)                 :REM define P45 as other intersection of main cir and horiz line. overwrite P15 with itself.

  t=FNr(15,45):t=FNr(45,15)            :REM draw 2 large circles to prepare to bisect L1
  t=FNc(61,62,2,45,15)                 :REM bisect L1, forming line L2 and two new points
  t=FNc(30,0,2,60,-1)                  :REM define points P0 and P30 on the crossings of L2 and main circle
  t=FNr(30,60):t=FNc(40,20,3,60,30)    :REM draw circles at P30, and line L3 through intersections with main circle, to define 2 more points
  t=FNr(15,60):t=FNc(25,5,4,60,15)     :REM draw circles at P15, and line L4 through intersections with main circle, to define 2 more points
  t=FNx(63,3,4):t=FNl(5,63,60)         :REM draw L5 at 45 degrees
  t=FNc(64,53,5,60,-1)                 :REM define where L5 cuts the main circle

  e=0                                  :REM disable automatic line drawing through intersections of 2 circles
  GCOL 11                              :REM change to light yellow for the 5 sided preconstruction
  t=FNx(65,1,4):t=FNr(65,0)            :REM draw a circle of radius sqrt(5) at intersection of L1 and L4
  t=FNc(66,67,1,65,-1)                 :REM find point of intersection of this circle with L1
  t=FNr(0,67)                          :REM draw a circle centred at point 0 through that intersection
  t=FNc(36,24,6,60,0)                  :REM find the intersections of this circle with the main circle


  REM USER INPUT AND POLYGON DRAWING

  INPUT d
  g=ASC(MID$("  @@XT u X @  T",d))-64  :REM sides,first point: 3,0; 4,0; 5,24; 6,20; 8,53; 10,24; 12,0; 15,20
  IF d=60 THEN g=24                    :REM bonus polygon 60, first point 24
  FORf=0TOd
    GCOL12                             :REM blue
    h=(g+60DIVd)MOD60                  :REM from array index for first point, calculate array index for second point
    t=FNr(h,g)                         :REM draw circle centred on second point through first point
    t=FNc((h+60DIVd)MOD60,99,99,60,h)  :REM calculate the position of the other intersection of circle with main circle. Assign to new point.
    GCOL9                              :REM red
    LINEp(g),q(g),p(h),q(h)            :REM draw the side
    g=h                                :REM advance through the array
  NEXT

  END

  REM FUNCTIONS

  REM line through a and b
  DEFFNl(n,a,b)
  m(n)=(q(a)-q(b))/(p(a)-p(b))
  c(n)=q(a)-m(n)*p(a)
  LINE -z,c(n)-m(n)*z,z,c(n)+m(n)*z
  =n

  REM radius of circle at point a passing through point b
  DEFFNr(a,b)
  r(a)=SQR((p(a)-p(b))^2+(q(a)-q(b))^2)
  CIRCLEp(a),q(a),r(a)
  =a

  REM intersection of 2 lines: ma*x+ca=mb*x+cb so (ma-mb)x=cb-ca
  DEFFNx(n,a,b)
  p(n)=(c(b)-c(a))/(m(a)-m(b))
  q(n)=m(a)*p(n)+c(a)
  =n

  REM intersection of 2 circles a&b (if b>-1.) The first step is calculating the line through the intersections
  REM if b < 0 the first part of the function is ignored, and the function moves directly to calculating intersection of circle and line.
  REM inspiration from http://math.stackexchange.com/a/256123/137034

  DEFFNc(i,j,n,a,b)
  IF b>-1 c(n)=((r(a)^2-r(b)^2)-(p(a)^2-p(b)^2)-(q(a)^2-q(b)^2))/2/(q(b)-q(a)):m(n)=(p(a)-p(b))/(q(b)-q(a)):IF e LINE -z,c(n)-m(n)*z,z,c(n)+m(n)*z

  REM intersection of circle and line
  REM (mx+ c-q)^2+(x-p)^2=r^2
  REM (m^2+1)x^2 + 2*(m*(c-q)-p)x + (c-q)^2+p^2-r^2=0
  REM quadratic formula for ux^2+vx+w=0 is x=-v/2u +/- SQR(v^2-4*u*w)/2u or x= v/2u +/- SQR((v/2u)^2 - w/u)

  u=m(n)^2+1
  v=-(m(n)*(c(n)-q(a))-p(a))/u               :REM here v corresponds to v/2u in the formula above
  w=SQR(v^2-((c(n)-q(a))^2+p(a)^2-r(a)^2)/u)


  s=SGN(c(n)+m(n)*v-q(a)):IF s=0 THEN s=1    :REM sign of s depends whether midpoint between 2 points to be found is above centre of circle a
  p(i)=v+s*w:q(i)=m(n)*p(i)+c(n)             :REM find point that is clockwise respect to a
  p(j)=v-s*w:q(j)=m(n)*p(j)+c(n)             :REM find point that is anticlockwise respect to a
  =n

프로그램은 사용자 입력을 요청하기 전에 사전 구성을 수행합니다. 이것은 3,4,5,6,8,10,12,15 또는 60 면도의 인접한 정점에 해당하는 주 원에 적어도 2 개의 점을 정의하기에 충분합니다. 점은 99 요소 배열 세트에 저장되며 원주 주위에 동일한 간격의 점을 위해 요소 0-59가 따로 설정됩니다. 이것은 명확성을 위해 주로 팔각형이 60 포인트에 완벽하게 맞지 않기 때문에 약간의 유연성이 필요합니다 (포함 된 경우 16-gon). 이미지는 흰색과 회색으로 아래 이미지와 같습니다. 노란색으로 표시된 두 개의 원은 5 개의 배수로 된 도형에만 사용됩니다. http://en.wikipedia.org/wiki/Pentagon#mediaviewer/File:Regular_Pentagon_Inscribed_in_a_Circle_240px.gif를 참조하십시오 .내가 선호하는 오각형 그리기 방법. 프로그램이 무한한 그라디언트를 처리 할 수 ​​없기 때문에 거친 각도는 수직선을 피하는 것입니다.

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

사용자는 d필요한면 수에 대한 숫자 를 입력 합니다. 프로그램은 배열에서 두 지점 중 첫 번째 지점의 색인을 찾습니다 (다음 지점은 시계 방향으로 60 / d 떨어져 있습니다).

그런 다음 프로그램은 첫 번째 경로를 통과하는 두 번째 점을 중심으로 원을 그리는 프로세스를 반복하고 주 교차로를 따라 새 교차로를 계산합니다. 구성 원은 파란색으로 그려지고 필요한 다각형은 빨간색으로 그려집니다. 최종 이미지는 다음과 같습니다.

나는 그들에게 매우 기쁘게 생각합니다. BBC Basic은 계산을 정확하게 수행합니다. 그러나 BBC Basic은 반경보다 약간 작은 반경으로 원을 그리는 경향이 있습니다 (특히 15 및 60면).

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


1
이것으로 놓친 한 가지 트릭은 45도 선이 24 개의 원호와 40 개의 원호를 구성하는 데 사용할 수있는 두 개의 원 바로 옆에서 주 원을 자르는 것입니다. 30) 누락, 국방부의 누락 된 두 모서리를 정의하고 1 / 5-1 / 6 = 1 / 30과 1 / 5-1 / 4 = 1 / 20의 차이를주기 위해 사전 구성에서 하나 이상의 원이 필요합니다. . 그러나 나는 지금 내 대답을 업데이트 할 것이라고 생각하지 않습니다. BTW, 보너스 @Martin에 감사드립니다!
Level River St

16

매스 매 티카, 2 3 4 다각형, 759 바이트

S=Solve;n=Norm;A=Circle;L=Line;c={#,Norm[#-#2]}&{a_,b_List}~p~{c_,d_List}:=a+l*b/.#&@@S[a+l*b==c+m*d,{l,m}]{a_,b_List}~p~{c_,r_}:=a+l*b/.S[n[c-a-l*b]==r,l]{c_,r_}~p~{d_,q_}:={l,m}/.S[n[c-{l,m}]==r&&n[d-{l,m}]==q,{l,m}]q={0,0};r={1,0};a=q~c~r;b=r~c~q;Graphics@Switch[Input[],3,{s=#&@@p[a,b];A@@@{a,b},Red,L@{q,r,s,q}},4,{k={q,r};{d,e}=a~p~b;j={d,e-d};d=k~p~j~c~q;{e,f}=j~p~d;A@@@{a,b,d},L/@Accumulate/@{k,j},Red,L@{q,e,r,f,q}},6,{d={q,r};e=#&@@d~p~a;f=e~c~q;{g,h}=a~p~f;{i,j}=a~p~b;A@@@{a,b,f},L@{#-2#2,#+2#2}&@@d,Red,L@{r,i,g,e,h,j,r}},8,{k={q,r};{d,e}=a~p~b;j={d,e-d};d=k~p~j~c~q;{e,f}=j~p~d;g=e~c~q;h=q~c~e;i=r~c~e;{o,s}=g~p~h;{t,u}=g~p~i;o={o,2s-2o};s={t,2u-2t};{t,u}=o~p~d;{v,w}=s~p~d;A@@@{a,b,d,g,h,i},L/@Accumulate/@{k,j,o,s},Red,L@{q,t,e,v,r,u,f,w,q}}]

임의의 글 머리 기호 :

  • 프롬프트를 통해 입력이 제공됩니다.
  • 현재 입력 3 , 4 , 6 , 8을 지원하고 있습니다.
  • 귀하의 옵션에서 다음과 같은 플로팅 스타일을 선택했습니다.
    • 전체 서클.
    • 관련 교차점이 외부에 있지 않는 한 끝점에서 끝점까지의 선입니다.이 경우 범위를 하드 코딩합니다.
    • 포인트가 없습니다.
    • 작업은 검은 색이고 다각형은 빨간색입니다. 미학적 인 것이 아니라 골프의 이유입니다.
  • 다각형 사이에 심각한 코드 복제가 있습니다. 어떤 시점에서는 모든 선과 점과 원을 열거하고 모든 선에 대해 단일 구성을 수행 한 다음 Switch각 구성에 대해 관련 원과 선을 선택하도록 줄입니다. 그렇게하면 그들 사이에 많은 기본 요소를 재사용 할 수 있습니다.
  • 코드에는 모든 관련 교차점을 결정하고 두 점에서 원을 만드는 많은 상용구 함수가 포함되어 있습니다.
  • 이를 통해 앞으로 더 많은 다각형을 추가 할 예정입니다.

ungolfed 코드는 다음과 같습니다.

S = Solve;
n = Norm;
A = Circle;
L = Line;
c = {#, Norm[# - #2]} &
{a_, b_List}~p~{c_, d_List} := 
 a + l*b /. # & @@ S[a + l*b == c + m*d, {l, m}]
{a_, b_List}~p~{c_, r_} := a + l*b /. S[n[c - a - l*b] == r, l]
{c_, r_}~p~{d_, q_} := {l, m} /. 
  S[n[c - {l, m}] == r && n[d - {l, m}] == q, {l, m}]
q = {0, 0};
r = {1, 0};
a = q~c~r;
b = r~c~q;
Graphics@Switch[Input[],
  3,
  {
   s = # & @@ p[a, b];
   A @@@ {a, b},
   Red,
   L@{q, r, s, q}
   },
  4,
  {
   k = {q, r};
   {d, e} = a~p~b;
   j = {d, e - d};
   d = k~p~j~c~q;
   {e, f} = j~p~d;
   A @@@ {a, b, d},
   L /@ Accumulate /@ {k, j},
   Red,
   L@{q, e, r, f, q}
   },
  6,
  {
   d = {q, r};
   e = # & @@ d~p~a;
   f = e~c~q;
   {g, h} = a~p~f;
   {i, j} = a~p~b;
   A @@@ {a, b, f},
   L@{# - 2 #2, # + 2 #2} & @@ d,
   Red,
   L@{r, i, g, e, h, j, r}
   },
  8,
  {
   k = {q, r};
   {d, e} = a~p~b;
   j = {d, e - d};
   d = k~p~j~c~q;
   {e, f} = j~p~d;
   g = e~c~q;
   h = q~c~e;
   i = r~c~e;
   {o, s} = g~p~h;
   {t, u} = g~p~i;
   o = {o, 2 s - 2 o};
   s = {t, 2 u - 2 t};
   {t, u} = o~p~d;
   {v, w} = s~p~d;
   A @@@ {a, b, d, g, h, i},
   L /@ Accumulate /@ {k, j, o, s},
   Red,
   L@{q, t, e, v, r, u, f, w, q}
   }
  ]

출력은 다음과 같습니다.

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


각 입력 유형에 대해 빨간색과 검은 색 선과 원을 하드 코딩하는 것이 더 짧은 지 궁금합니다.
Optimizer

@Optimizer 점에 대한 더 큰 n 개의 정확한 표현이 아마도 꽤 길어질 것이라고 생각합니다. 더 많은 다각형을 추가하면 어느 시점에서 하나의 단일 구성을 만든 다음 모든 관련 원과 선을 선택하는 것이 Switch좋습니다. 아마도 더 많은 원 선과 점을 재사용 할 수 있습니다.
Martin Ender

나는 이것으로 팔각형을 만드는 더 짧은 방법이 있지만, 어떻게 그것을 보여줄지 잘 모르겠습니다 ...
자부심 haskeller

@proudhaskeller 구조의 처음 5 개 줄이 실제로 사각형에서 코드를 재사용하여 도랑 될 수 있고 n-gon에서 2n-gon을 구성하도록 일반화 할 수 있다고 생각하면 여전히 짧습니까? ? (둘 다, 나는 이것을 개선하기 위해 염두에 두어야한다.) 그렇다면 ... 음 .. 이것 .
Martin Ender

@proudhaskeller 현상금이 만료되기 전에 직접 게시 할 수 있습니다. ;)
Martin Ender
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.