챌린지 아이디어를 올바른 방향으로 방해 해준 Calvin 's Hobbies의 공로입니다.
우리는 sites 라고 부르는 평면의 점들을 고려하고 각 사이트와 색상을 연관시킵니다. 이제 가장 가까운 사이트의 색상으로 각 점을 색칠하여 전체 평면을 페인트 할 수 있습니다. 이것을 Voronoi 맵 (또는 Voronoi diagram )이라고합니다. 원칙적으로 Voronoi 맵은 모든 거리 메트릭에 대해 정의 할 수 있지만 일반적인 유클리드 거리를 사용합니다 r = √(x² + y²)
. ( 참고 : 이 과제에 참여하기 위해 이들 중 하나를 계산하고 렌더링하는 방법을 반드시 알아야 할 필요는 없습니다.)
다음은 100 개의 사이트가있는 예입니다.
셀을 보면 해당 셀 내의 모든 지점이 다른 사이트보다 해당 사이트에 더 가깝습니다.
당신의 임무는 그러한 보로 노이지도로 주어진 이미지를 근사화하는 것입니다. 편리한 N 래스터 그래픽 형식과 정수 N 으로 이미지가 제공됩니다 . 그런 다음 이 사이트를 기반으로하는 Voronoi 맵이 입력 이미지와 최대한 비슷 하도록 최대 N 개의 사이트와 각 사이트의 색상 을 생성해야 합니다.
이 과제의 맨 아래에있는 스택 스 니펫을 사용하여 출력에서 Voronoi 맵을 렌더링하거나 원하는 경우 직접 렌더링 할 수 있습니다.
당신은 할 수있다 (필요하면) 사이트 집합에서 보로 노이 맵을 계산하기 위해 내장 또는 타사 기능을 사용합니다.
이것은 인기 경연 대회이므로 가장 많은 순 투표 수를 얻은 답이 이깁니다. 유권자들은 다음과 같이 답변을 판단하도록 권장됩니다
- 원본 이미지와 색상의 근사치
- 알고리즘이 다른 종류의 이미지에서 얼마나 잘 작동하는지
- 얼마나 잘 알고리즘은 작은 작동 N .
- 알고리즘이 더 자세하게 필요한 이미지 영역의 포인트를 적응 적으로 클러스터링하는지 여부
테스트 이미지
다음은 알고리즘을 테스트 할 몇 가지 이미지입니다 (일부 일반적인 용의자, 일부 새로운 용의자). 더 큰 버전의 사진을 클릭하십시오.
첫 번째 줄의 해변은 Olivia Bell에 의해 그려졌으며 그녀의 허락을 받았습니다.
추가 도전을 원한다면 흰색 배경으로 Yoshi를 시도 하고 배꼽을 올바르게 잡으십시오.
이 테스트 이미지 는이 이미지 갤러리 에서 모두 zip 파일로 다운로드 할 수 있습니다. 이 앨범에는 다른 테스트로 임의의 보로 노이 다이어그램이 포함되어 있습니다. 참고로 여기에 생성 된 데이터가 있습니다 .
100, 300, 1000, 3000 (및 해당 셀 사양 중 일부에 대한 pastebin) 과 같은 다양한 이미지 및 N에 대한 예제 다이어그램을 포함하십시오 . 적합하다고 생각되면 셀 사이에 검은 색 가장자리를 사용하거나 생략 할 수 있습니다 (일부 이미지에서는 다른 것보다 더 잘 보일 수 있습니다). 사이트를 포함시키지 마십시오 (물론 예를 들어 사이트 배치 방식을 설명하려는 경우는 별도의 예를 제외하고).
많은 수의 결과를 표시하려면 imgur.com 에서 갤러리를 작성 하여 답변의 크기를 합리적으로 유지할 수 있습니다 . 또는 게시물에 미리보기 이미지를 넣고 참조 답변에서 했던 것처럼 더 큰 이미지로 연결되도록하십시오 . s
imgur.com 링크 (예 : I3XrT.png
-> I3XrTs.png
) 에서 파일 이름 을 추가하여 작은 축소판을 얻을 수 있습니다 . 또한 멋진 것을 발견하면 다른 테스트 이미지를 자유롭게 사용하십시오.
렌더러
결과를 다음 스택 스 니펫에 붙여 넣어 결과를 렌더링하십시오. 각 셀은 순서대로 5 개 부동 소수점 숫자로 지정되는대로 정확한 목록 형식은 상관이 x y r g b
어디 x
와 y
세포의 위치의 좌표는, 및 r g b
범위의 적색, 녹색, 청색의 색상 채널이 0 ≤ r, g, b ≤ 1
.
스 니펫은 셀 가장자리의 선 너비 및 셀 사이트 표시 여부 (후자는 주로 디버깅 목적으로)를 지정하는 옵션을 제공합니다. 그러나 셀 스펙이 변경 될 때만 출력이 다시 렌더링되므로 다른 옵션 중 일부를 수정하는 경우 셀 또는 기타 공간에 공백을 추가하십시오.
이 정말 멋진 JS Voronoi 라이브러리 를 작성해 주신 Raymond Hill에게 많은 공로를 주셨습니다 .