직선 그리기


15

직선이 포함 된 간단한 ASCII 아트 이미지를 그립니다. 이것 과 비슷 하지만 사양 다릅니다.

입력

이 입력 형식을 코드에 맞게 수정할 수 있습니다.

  • 정수 width
  • 정수 height
  • 정수 x0
  • 정수 y0
  • 정수 x1
  • 정수 y1

산출

pixel에서 pixel (x0, y0)까지 의 선을 포함하는 지정된 너비와 높이의 채워진 ASCII 아트 이미지입니다 (x1, y1).

표준 형식의 텍스트 출력은 허용되지만 내장 선 그리기 기능을 사용하지 마십시오.

세부

선은 인쇄 가능한 단일 문자 (예 :)를 사용하여 그려야 #하지만 배경은 다른 문자 (예 :)로 채워집니다 .. 이미지 크기가 정확하도록 필요한 후행 문자를 인쇄해야합니다.

픽셀 좌표는 0 인덱스 또는 1 인덱스 일 수 있으며 이미지의 어느 구석에서나 시작할 수 있습니다. 시작 픽셀과 끝 픽셀의 중심을 연결하는 0 너비의 서브 픽셀 라인을 상상하여 선을 그려야합니다. 선이 들어가는 모든 픽셀을 채워야합니다.

승리

일반적인 코드 골프 규칙. 가장 짧은 코드가 승리합니다.

IN: width, height, x0, y0, x1, y1

IN: 7, 6, 0, 0, 6, 5
OUT:
.....##
....##.
...##..
..##...
.##....
##.....

IN: 3, 3, 1, 1, 1, 1
OUT:
...
.#.
...

IN: 3, 3, 0, 2, 2, 0
OUT:
#..
.#.
..#

IN: 6, 3, 0, 0, 5, 2
OUT:
....##
.####.
##....

IN: 4, 4, -1, -1, 0, 3
OUT:
#...
#...
#...
....

4
"PPCG에 오신 것을 환영합니다"라고 말하지만 거의 나만큼 여기에 등록되어 있습니다. :-) 멋진 첫 도전!
AdmBorkBork

공백 대신 실제 도트를 출력 할 수 있습니까? 공백이 아닌 다른 문자? (후행 <문자>를 여전히 포함한다고 가정)
Rɪᴋᴇʀ

확실한! 내가 편집하겠습니다
Curtis Bechtel

1
@AlbertRenshaw 실제로, Wikipedia 에서 Curve를 볼 때, " 수학에서 곡선 ( 이전 텍스트 에서는 곡선 이라고도 함 )은 일반적으로 선과 비슷 하지만 직선 일 필요는없는 물체 입니다. "; )
Kevin Cruijssen

1
@KevinCruijssen 이 똑바로 필요 하다는 것을 암시 합니까? ;)
Albert Renshaw

답변:


2

Mathematica, 166137 바이트

l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]

더 읽기 쉬운 버전 :

l := {i, j}; s = Sign; 
f[p_, q_, h_, w_] := 
 Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
     Abs@Mean[
        s@Det@{p - l + #, p - q} & /@ 
         Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]

라는 함수를 정의합니다 f. 입력 및 출력 사양을 상당히 자유롭게 해석했습니다. 이 함수 f는 형식으로 입력을 f[{x0, y0}, {x1, y1}, height, width]받으며 그리드는 왼쪽 상단부터 시작하여 1- 색인입니다. 출력은 다음과 같습니다

샘플 출력

선이 1s로 표시되고 배경이 0s 로 표시됩니다 (여기에 f[{2, 6}, {4, 2}, 5, 7]표시됨). 의 매스 매 티카 매트릭스 바꾸는 작업 1들과 0의 문자열로들 #s와는 .그냥 표준 방법을 사용할 수 있도록, 이전에 다른 많은 도전에 golfed 된 S,하지만 난 그 아무것도 흥미를 추가 생각하지 않습니다.

설명:

일반적으로 선이 일부 픽셀을 통과하는 경우 픽셀의 네 모서리 중 하나 이상이 선 위에 있고 하나 이상이 아래에 있습니다. 모서리 위 또는 (벡터 사이의 각도를 검사하여 행 아래에 있다면 우리는 확인 {x0,y0}코너) 및 ( {x0,y0}{x1,y1}이 각도가 긍정적 인 경우, 모서리 위이며, 각도가 마이너스 인 경우, 모서리 이하이다).

우리는 두 벡터가있는 경우 {a1,b1}{a2,b2}그들 사이의 각도가 행렬의 행렬식의 부호를 찾아 양 또는 음의 경우, 우리는 확인할 수 있습니다 {{a1,b1},{a2,b2}}. (이 작업을 수행하는 나의 오래된 방법은 복소수의 산술을 사용했습니다.

이것이 코드에서 작동하는 방식은 다음과 같습니다.

  • {p-l+#,p-q}&/@Tuples[.5{1,-1},2]에서 4 개 개의 벡터를 취득 {x0,y0}하고, 화소의 네 모퉁이 (함께 l:={i,j}앞서 정의 된 픽셀의 좌표), 또한 사이 벡터 {x0,y0}{x1,y1}.
  • s@Det@...선과 네 모서리 사이의 각도 표시를 찾습니다 (를 사용하여 s=Sign). 이것들은 -1, 0 또는 1과 같습니다.
  • Abs@Mean[...]<.6일부 각도가 양수이고 일부는 음수인지 확인합니다. 이 속성을 가진 4 개의 튜플 부호는 모두 -0.5와 0.5 (포함) 사이의 평균을 갖기 때문에 <대신 0.6을 사용하여 바이트를 저장합니다 <=.

여전히 문제가 있습니다.이 코드는 선이 양방향으로 영원히 연장된다고 가정합니다. 따라서 우리는 선의 끝점으로 정의 된 사각형 내부와 외부 에있는 1-Max[s[p-l]s[q-l],0](시험 및 오류로 찾은) 을 곱하여 선을 자릅니다 .10

사각형으로 선 자르기

나머지 코드는 이러한 픽셀의 격자를 만듭니다.

보너스로 181 바이트에 대해 완전히 다른 방법으로 시도한 초기 시도가 있습니다.

Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&

1
이제 끝났습니다. 점심 시간입니다! (오후 6:30 오후…)
나무가 아님

1

CJam, 122 바이트

{),V>{[I\]E.*A.+}/}:F;l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:D[0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fID~\:I;F]{_Wf>\S.<+:*},{~_3$=@0tt}/N*

온라인으로 사용해보십시오

이것은 기본적으로 다른 도전에 대해 이전에 쓴 두 가지 답변 (주로 두 번째 one-function의 계산)을 결합합니다.l )을 결합합니다.
(0, 0)은 자연스럽게 왼쪽 위 모서리이며 명령문의 예제와 같이 왼쪽 아래가 아닙니다.

개요 :

{),V>{[I\]E.*A.+}/}:F;정의 좌표 주어진 x의 모든 화소 (좌표 쌍)을 생성하는 데 도움 F 작동
l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:D판독하여 입력을 처리하고, 도트 매트릭스 생성
0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fI마지막 제외한 모든 X 좌표의 반복 처리를, 모든 대응하는 화소를 생성을
D~\:I;F위한 동일하지 마지막 X 좌표
{_Wf>\S.<+:*},만, 화상 내에 표시하는 화소 유지
{~_3$=@0tt}/각 픽셀 매트릭스두고 0
N*디스플레이 개행 문자 매트릭스를 조인

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