This project contains C source code for drawing 2D lines by different techniques.
All samples output PNGs with svpng.
License: public domain.
The fundamental line drawing algorithm by Bresenham [1], based on rosetta code.
Represent lines as capsule shapes, in order to support real-valued coordinates and variable width.
Simple anti-aliasing with 5x5 super sampling.
Using signed distnace field (SDF) of capsule shape to perform anti-aliasing with single sample per pixel.
Use AABB of capsule to reduce the number of samples. Render shapes into the buffer individually with alpha blending.
$ make test
gcc -Wall -O3 -o line_bresenham line_bresenham.c
gcc -Wall -O3 -o line_sampling line_sampling.c
gcc -Wall -O3 -o line_supersampling line_supersampling.c
gcc -Wall -O3 -o line_sdf line_sdf.c
gcc -Wall -O3 -o line_sdfaabb line_sdfaabb.c
time ./line_bresenham
0.03 real 0.02 user 0.00 sys
time ./line_sampling
1.93 real 1.91 user 0.00 sys
time ./line_supersampling
47.06 real 46.85 user 0.10 sys
time ./line_sdf
2.00 real 1.98 user 0.00 sys
time ./line_sdfaabb
0.03 real 0.03 user 0.00 sys
- These samples are only for illustrative purposes.
- Line clipping are not performed.
- The SDF AABB sample can be further optimized by tigther quaduraliteral bounds.
[1] Bresenham, Jack E. "Algorithm for computer control of a digital plotter." IBM Systems journal 4.1 (1965): 25-30.