이러한 문제의 목적은 애니메이션의 생성하는 체인 드라이브 의 집합으로 구성된 시스템, 스프라켓 기어 a로 함께 연결 체인 .
일반적인 요구 사항
프로그램에는 삼중 항으로 지정된 스프로킷 목록 이 제공 됩니다 (x, y, radius)
. 얻어진 체인 구동 장치는 a로 함께 연결이 스프로킷 구성되는 밀폐 체인 긴장 , 그들 각각을 통해 전달 하기 . 당신의 목표는 시스템을 움직이는 무한 루프 애니메이션 을 만드는 것입니다 . 예를 들어, 입력이 주어지면
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
출력은 다음과 같아야합니다.
.
좌표계 오른쪽 x 축 지점 및 y 축가 가리키는 것이어야한다. 반경이 8보다 크거나 같은 숫자 라고 가정 할 수 있습니다 (나중에 중요한 이유를 볼 것입니다). 두 개 이상의 스프로킷 이 있고 스프로킷이 서로 교차하지 않는다고 가정 할 수도 있습니다 . 단위입력의 너무 중요하지 않습니다. 이 게시물의 모든 예제와 테스트 사례는 픽셀을 입력 단위로 사용하므로 (예를 들어, 앞 그림에서 중간 스프로킷의 반경은 24 픽셀입니다.) 이러한 단위에서 너무 많이 벗어나지 마십시오. 나머지 과제에서 공간 수량은 입력과 동일한 단위로 제공되는 것으로 이해됩니다. 비율을 올바르게 유지하십시오! 출력의 크기는 전체 시스템이 볼 수 있도록 충분히 큰 모든 톱니의 경계 상자보다 약간 더 큰해야한다. 특히, 스프로킷의 절대 위치는 출력에 영향을 미치지 않아야합니다. 상대 위치 만 사용해야합니다 (예를 들어, 위의 예에서 모든 스프라켓을 같은 양만큼 이동하면 출력은 동일하게 유지됩니다).
체인은해야 접선 은 접점의 모든 지점에서 통과 스프라켓, 그리고 바로 다른 곳. 체인은 인접한 체인 세그먼트 (즉, 동일한 스프라켓에서 만나는 두 스프라켓 사이의 체인 부분) 가 서로 교차하지 않도록 스프라켓을 통과해야 합니다.
.
예를 들어, 위 왼쪽 시스템은 유효하지만 왼쪽 아래 스프라켓을 지나는 두 개의 인접한 체인 세그먼트가 교차하기 때문에 가운데 시스템은 유효하지 않습니다. 그러나 두 개의 교차 체인 세그먼트가 인접하지 않기 때문에 올바른 시스템 이 유효합니다 (이 시스템은 다른 두 개의 체인 세그먼트와는 다른 입력으로 생성됩니다).
일을 단순하게하기 위해 (r) 스프라켓 이 두 개의 인접한 스프라켓의 볼록 껍질 또는 각 이웃과 다른 이웃의 볼록 껍질과 교차하지 않는다고 가정 할 수 있습니다. 다시 말해, 아래 다이어그램의 상단 스프로킷은 음영 처리 된 영역과 교차하지 않을 수 있습니다.
체인 세그먼트가 지나가는 스프라켓 (예 : 마지막 테스트 케이스) 이외의 스프라켓과 교차 할 수 있습니다. 이 경우 체인은 항상 스프라켓 앞에 나타나야합니다.
시각적 요구 사항
체인은 폭이 교대 로 연결된 일련의 링크 로 구성되어야합니다 . 좁은 링크 의 너비는 약 2이어야하고 넓은 링크 의 너비는 약 5 여야합니다. 두 유형의 링크 의 길이 는 거의 같아야합니다. 기간체인의 길이, 즉 넓은 / 좁은 링크 쌍의 총 길이는 체인 길이의 정수배에 맞는 4π에 가장 가까운 숫자 여야합니다. 예를 들어, 체인의 길이가 1,000 인 경우주기는 12.5 여야하며 이는 1,000의 정수 횟수 (80)에 맞는 4π (12.566 ...)에 가장 가까운 숫자입니다. 체인이 감싸는 지점에 아티팩트가 없도록주기가 체인 길이에 정수 횟수만큼 맞는 것이 중요합니다.
반경 R 의 스프로킷은 3 개의 동심원으로 구성되어야합니다. 중심 축은 약 3의 반경 원이어야합니다. 스프로킷의 신체 에 대한 반경의 원이어야 축 주위에 R - 4.5; 그리고 몸통 주위 의 스프라켓 림 은 약
R -1.5 반경의 원이어야합니다 . 림에는 스프로킷의 톱니 도 포함 해야하며 너비는 약 4입니다. 톱니의 크기와 간격은 체인 링크의 크기와 일치해야 깔끔하게 맞 물릴 수 있습니다.
스프로킷의 톱니주기, 즉 스프로킷의 원주를 따라 두 개의 연속 톱니 사이의 거리는 체인의주기와 일치해야합니다. 주기가 약 4π이고 스프로킷의 반지름이 고르기 때문에,주기는 스프로킷의 원주에 거의 정수의 횟수로 맞아야하기 때문에 그 지점에 눈에 띄는 인공물이 없어야합니다. 스프로킷의 이빨이 around니다.
체인, 스프라켓의 다른 부분 및 배경을 쉽게 구분할 수있는 한 색상 조합을 사용할 수 있습니다 . 배경이 투명 할 수 있습니다. 이 포스트의 예제 는 체인, 스프로킷의 액슬 및 림 및 스프로킷의 바디에 사용됩니다. #202020
#868481
#646361
애니메이션 요구 사항
입력 목록 의 첫 번째 스프라켓 은 시계 방향으로 회전해야합니다 . 나머지 스프라켓은 그에 따라 회전해야합니다. 체인은 초당 약 16π (약 50) 단위 의 속도 로 움직여야합니다. 프레임 속도는 사용자에게 달려 있지만 애니메이션은 충분히 매끄럽게 보입니다.
애니메이션은 매끄럽게 반복 되어야 합니다 .
적합성
시각적 속성 및 비율 중 일부는 의도적으로 대략적으로 만 지정되므로 정확하게 일치시킬 필요는 없습니다 . 프로그램의 출력은 여기에 주어진 예제의 픽셀 간 복제 일 필요는 없지만 비슷하게 보일 것입니다. 특히, 체인과 스프로킷의 정확한 비율과 체인 링크와 스프로킷의 톱니의 정확한 모양은 유연합니다.
따라야 할 가장 중요한 사항은 다음과 같습니다.
- 체인은 올바른 방향에서 입력 순서대로 스프라켓을 통과해야합니다.
- 체인은 모든 접촉 지점에서 스프라켓에 접해야합니다.
- 체인의 링크와 스프로킷의 톱니는 최소한 정확한 간격과 위상까지 깔끔하게 메워 져야합니다.
- 체인의 링크와 스프로킷의 톱니 사이의 간격은 랩핑 지점에서 눈에 띄는 아티팩트가 없도록해야합니다.
- 스프로킷은 올바른 방향으로 회전해야합니다.
- 애니메이션은 매끄럽게 반복되어야합니다.
마지막으로, 기술적으로,이 도전의 목표는 창의력을 발휘하고보다 정교한 결과물을 생성하고 싶을 때 가장 짧은 코드를 작성하는 것입니다.
도전
위에서 설명한대로 스프로킷 목록을 가져 와서 해당 체인 구동 시스템 애니메이션을 생성 하는 프로그램 또는 함수를 작성하십시오 .
입력과 출력
명령 행 을 통해, STDIN을 통해 , 함수 인수 로 또는 동등한 방법을 사용하여 입력 을 받을 수 있습니다 . 입력에 편리한 형식 을 사용할 수 있지만 게시물에 입력해야합니다.
으로 출력 , 당신은 할 수 있습니다 직접 애니메이션을 표시 , 생산 애니메이션 파일을 (예를 들어, 애니메이션 GIF)를, 또는 생산 프레임 파일의 순서를 (단,이 경우 작은 벌금있다;. 아래 참조) 파일 출력을 사용하는 경우는, 확인 할 프레임 수는 합리적이다 (이 글의 예제는 거의 프레임을 사용) 프레임의 수를 최소화 할 필요가 없습니다,하지만 당신은 너무 많은 불필요한 프레임을 생성해서는 안된다. 일련의 프레임을 출력하는 경우 게시물에 프레임 속도 를 지정하십시오 .
점수
이것은 code-golf 입니다. 짧은 대답은 , 바이트, 승리.
+ 10 % 페널티 프로그램에서 애니메이션을 직접 표시하거나 단일 애니메이션 파일을 생성하는 대신 프레임 시퀀스를 출력으로 생성하는 경우 점수에 10 %를 추가하십시오.
테스트 사례
시험 1
(0, 0, 26), (120, 0, 26)
시험 2
(100, 100, 60), (220, 100, 14)
시험 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
시험 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
시험 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
시험 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)