탄젠트 폴리곤 확장


11

다음과 같은 것을 그립니다.

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

보다 정확한 용어로, 길이가 l 인 균등 한 간격의 접선이 n 인 반경 r의 원을 그립니다. 이 선의 끝을 연결하여 새로운 n면 정규 다각형을 만듭니다.

규칙

r = 원 반경
n = 접선 수-원 주위에 균등 한 간격을 두어야합니다 (n> = 3)
l = 접선의 측면 길이

인수 {r, n, l}를 승인하고 필요한 출력을 그리는 프로그램을 작성하십시오.

단위는 픽셀입니다.

모든 도면이 표시되는 한 도면의 위치에는 제한이 없습니다.

사진은 꽤 설명이 필요합니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 승리합니다!


n이 3보다 크거나 같다고 가정합니다. 최대 값이 있습니까? 접선과 원을 원하십니까?
MickyT

예, n> = 3 (l이 충분하지 않으면 교차로 확인). 원과 접선을 그려야합니다. 최대 출력은 기본적으로 출력이 음영 처리 된 원이라고 생각합니다. 즉, 최대 값은 이와 같은 도면의 실제 최대 값입니다.
스트레칭 미치 광

벡터 그래픽을 만들면 픽셀 단위도 적용됩니까? 이러한 경우 픽셀은 실제로 상당히 정의되지 않기 때문입니다. 또는 우리가 가지고 rasterised 그래픽을 생산하기 위해?
Martin Ender

@ MartinBüttner, 축과 같은 스케일이 있으면 (팬시) 벡터 그래픽으로 픽셀 단위를 무시할 수 있습니다.
스트레칭 미치 광

답변:


5

매쓰, 135 132 131 123 바이트

{r,n,l}=Input[];Graphics[{{0,0}~Circle~r,Line[Join@@Array[{b=(a=r{c=Cos[t=2Pi#/n],s=Sin@t})-l{s,-c},a,b}&,n+1]]},Axes->1>0]

이 코드는 질문에 지정된대로 프롬프트를 통해 입력을 예상합니다. 예 : {100, 6, 150}. 벡터 그래픽을 생성하므로 OP의 주석에 지정된대로 축을 포함시킵니다.

접선과 다각형은 실제로 "다각형 코너, 접선 포인트, 다각형 코너, 다음 다각형 코너, 접선 포인트, 다각형 코너 ..."를 순회하여 단일 선 스트립입니다.

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

축이 아닌 경우 107 바이 트로이 작업을 수행 할 수도 있습니다.

{r,n,l}=Input[];Graphics@{Circle[],Line[Join@@Array[{b=(a={c=Cos[t=2Pi#/n],s=Sin@t})-l/r{s,-c},a,b}&,n+1]]}

을 (를 Axes->1>0) 제외하고 추가 절약 은 이제 모든 것을 스케일링 할 수 있다는 사실에서 비롯됩니다 . 이렇게하면 단위 원 rCircle생성 하라는 호출이 간단 해 집니다.


{0,0}~Circle~r
DavidC

@DavidCarraher heh, 실제로 135 바이트로 이미 수행했지만 노트북으로 다시 복사하는 것을 잊어 버렸습니다. 그래서 유니 코드를 변경했을 때 되돌 렸습니다. 감사!
Martin Ender

8

파이썬, 133 바이트

지금까지 "단위는 픽셀입니다"규칙을 준수하는 유일한 대답은 ...

from turtle import*
c=circle
r,n,l=input()
lt(90)
exec'c(r,360/n);fd(l);bk(l);'*n
fd(l)
lt(towards(-r,0)-180)
c(distance(-r,0),360,n)

exitonclick()창을 즉시 닫지 않으려면 끝에 추가 하십시오.

산출:

python tangentpoly.py <<< "20, 6, 30":

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

python tangentpoly.py <<< "100, 8, 200":

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


1
for i in n*[0]:c(r,360/n);fd(l);bk(l)->exec'c(r,360/n);fd(l);bk(l)'*n;
isaacg


7

T-SQL 440 483

이것으로 어떤 상도 이길 수는 없지만 그림을 그리는 것이 좋습니다 :)

Expletive를 편집하십시오 ! 원을 그리면서 다각형을 엉망으로 만들었습니다. 비용으로 고정되었습니다.

SELECT Geometry::UnionAggregate(Geometry::Point(0,0,0).STBuffer(@r).STExteriorRing().STUnion(Geometry::STGeomFromText(CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0))).STUnion(Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing())p FROM(SELECT RADIANS(360./@*N)a,RADIANS((360./@*N)-90)b FROM(SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N FROM sys.types a,sys.types b)t)r

다음 변수로 실행

declare @r float = 1.0
declare @ int = 10
declare @l float = 3.0

Sql Server Management Studio 2012 이상에서 실행하면 공간 결과 탭에 다음이 반환됩니다. 여기에 이미지 설명을 입력하십시오

declare @r float = 1.0
declare @ int = 360
declare @l float = 3.0

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

declare @r float = 10.0
declare @ int = 3
declare @l float = 10.0

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

확장

SELECT Geometry::UnionAggregate(    --group together lines
    Geometry::Point(0,0,0)          --Set origin
    .STBuffer(@r)                   --Buffer to @r
    .STExteriorRing()               --Make it a line
    .STUnion(                       --Join to the floowing tangent
        Geometry::STGeomFromText(   --Create a tangent line
            CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0)
        )
    ).STUnion( --Generate polygon around exterior points
    Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing()
    )
    p
FROM(
    SELECT RADIANS(360./@*N)a,      --calclate bearings
        RADIANS((360./@*N)-90)b
    FROM(                           --make enough rows to draw tangents
        SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N 
        FROM sys.types a,sys.types b
        )t
    )r 

5

MATLAB-233 바이트

function C(n,r,l),t=2*pi/n;c=cos(t);s=sin(t);M=[c,s;-s,c];F=@(y)cell2mat(arrayfun(@(x){M^x*y},1:n));P=F([0;r]);Q=F([l;r]);v='k';t=1e3;t=2*pi/t*(0:t);R=[1:n 1];q=Q(1,R);s=Q(2,R);plot(r*cos(t),r*sin(t),v,[P(1,R);q],[P(2,R);s],v,q,s,v);

에 대한 샘플 기능 출력 n = 8, r = 4, l = 6(단위 길이를 나타 내기 위해 포함 된 축) : 서커스 출력

에 대한 샘플 함수 출력 n = 1024, r = 4, l = 2: 서커스 출력


나는 따기입니다,하지만 단위는 픽셀입니다
Digital Trauma

3
@DigitalTrauma : 아. 눈치 채지 못했습니다. MATLAB 수치에는 고정 단위가 없습니다. 그들은 창으로 확장됩니다. 어쨌든 그것은 요점입니다. 파이썬 기반의 LOGO 기반 솔루션은 탄탄합니다. 오늘 전에 나는 누군가가 로고를 파이썬으로 포팅 할 것이라고 생각하지 않았지만 거기에 있습니다. 내가 따라 가면서 배우고 있습니다. : P
COTO

어쨌든 +1 :)
Digital Trauma

이미지는 거의 조리개의 로고입니다.
자랑스런 Haskeller

4

HTML + 자바 스크립트 (E6) 298

테스트하려면 html 파일로 저장하고 FireFox로여십시오. 매개 변수 r, n, l을 입력 필드에 쉼표로 구분하여 삽입 한 다음 탭 아웃하십시오.

또는 jsfiddle을 사용해보십시오

<input onblur="
[r,n,l]=this.value.split(','),
z=r-~l,t=D.getContext('2d'),w='lineTo',
D.width=D.height=z*2,
t.arc(z,z,r,0,7);
for(C=1,S=i=0;i++<n;)
  t[w](x=z+r*C,y=z+r*S),
  t[w](x-l*S,y+l*C),
  C=Math.cos(a=6.283*i/n),
  S=Math.sin(a),
  t[w](z+r*C-l*S,z+r*S+l*C);
t.stroke()">
<canvas id=D>

샘플 출력

50,20,140

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