ASCII art Bresenham line drawing

17

2

Write the shortest possible program that draws a Bresenham line in ASCII art. Your program should take two integers x and y (command line or stdin, your choice) and draw an ASCII line which starts in the upper left and goes right x units and down y units. You must use _ and \ characters and place them in the correct location according to Bresenham's algorithm.

You may assume x >= y, so no vertical segments are required.

Note that because you're using the _ character, for a line with y=3 you will likely need to output 4 lines of text (and you may emit a leading blank line when it isn't necessary).

examples:

11 3
_
 \___
     \___
         \_
11 1
_____
     \_____

5 4

\
 \_
   \
    \

For points which are exactly halfway you may choose either rounding:

10 1
____
    \_____
or
_____
     \____

Keith Randall

Posted 2011-03-05T05:41:55.307

Reputation: 19 865

Answers

7

Perl, 74

/ /;print int(.5+$_*$'/$`)>int(.5+--$_*$'/$`)?$/.$"x$_.'\\':'_'for 1..$`

Run with -n option (counted in code size).

$ perl -n bresenham.pl <<<'11 3'
_
 \___
     \___
         \_
$ perl -n bresenham.pl <<<'11 1'
_____
     \_____
$ perl -n bresenham.pl <<<'5 4'

\
 \_
   \
    \
$ perl -n bresenham.pl <<<'10 1'
____
    \_____

J B

Posted 2011-03-05T05:41:55.307

Reputation: 9 638

5

C 136 123 Characters

z,x,y,i,f;main(){for(scanf("%d%d",&x,&y);i<=x;i++){f=f?printf("_"):1;z+=y;if(2*z>=x&&i<x)f=0,z-=x,printf("\n%*c",i+1,92);}}

fR0DDY

Posted 2011-03-05T05:41:55.307

Reputation: 4 337

4

Dephi, 109

Quite small if you ask me :

var x,y,i:Word;begin Read(x,y);for i:=1to(x)do if(i*y+x div 2)mod x<y then Write(^J,'\':i)else Write('_')end.

The 2 integers are read from the command line.

The newline is written by the seldomly used ^J syntax (meaning LineFeed), the following '\' character is indented using the little-known syntax :Write(string:width).

It's a pitty Delphi div for integer-divide (instead of just \). Ah well...

PatrickvL

Posted 2011-03-05T05:41:55.307

Reputation: 641

Pretty neat and short. Read(input,x,y) can be shortened to read(x,y), and without program and apptype it becomes 157 characters. – Wouter van Nifterick – 2011-03-12T14:36:34.237

@Wouter van Nifterick : A few hours later and it's down to 109 characters now! Don't think there's much to win left... – PatrickvL – 2011-03-13T09:47:31.747

That's a clever use of write() here. I figured that rewriting if(i*y+x div 2)mod x<y then to if(i*y*2+x)mod(x*2)<y*2then could help, but it's the exact same amount of characters. – Wouter van Nifterick – 2011-03-13T14:57:07.450

1

APL (Dyalog Classic), 39 bytes

{⍉↑(-1++\a)↑¨'_\'[a←-2-/⌊.5+⍵×⍺÷⍨⍳1+⍺]}

Try it online!

ngn

Posted 2011-03-05T05:41:55.307

Reputation: 11 449