Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Drawing lines and circles

by studymonkperl (Novice)
on Oct 01, 2013 at 08:14 UTC ( #1056450=perlquestion: print w/ replies, xml ) Need Help??
studymonkperl has asked for the wisdom of the Perl Monks concerning the following question:

Monks,

I'm trying to learn graphics algorithms. But before that I'm learning how to draw simple shapes like lines, circles etc, On the console. I know this sort of thing can be achieved easily using some graphics library, But I want to first learn how to draw it on the console.

The idea is to imagine each pixel as separated by a space horizontally and a line break vertically. The issue is you can never get a perfectly straight line. Basically the co ordinates you generate rarely match the integer points on the grid. I realize the same thing happens on the monitor screen too, except the pixels are too small for us to notice.

I wrote this code today morning, is there a nice way to do this?

use strict; use warnings; use Data::Dumper; my $gridx = 10; my $gridy = 10; my $pixel = '.'; my $x1 = 1; my $y1 = 2; my $x2 = 8; my $y2 = 2; my $gr = draw_line( $x1 , $y1 , $x2 , $y2 , 0 , $pixel , $gridx , $gri +dy ); draw_pixels_on_screen( $gr , $gridx , $gridy ); $x1 = 3; $y1 = 1; $x2 = 3; $y2 = 7; $gr = draw_line( $x1 , $y1 , $x2 , $y2 , 0 , $pixel , $gridx , $gridy +); draw_pixels_on_screen( $gr , $gridx , $gridy ); $x1 = 2; $y1 = 3; $x2 = 7; $y2 = 9; $gr = draw_line( $x1 , $y1 , $x2 , $y2 , 0 , $pixel , $gridx , $gridy +); draw_pixels_on_screen( $gr , $gridx , $gridy ); sub draw_line{ my ( $x1 , $y1 , $x2 , $y2 , $yaxisintercept , $pixel , $gridx , $gridy ) = @_; my @grid; my $i = 0; my $j = 0; for( $i = 0 ; $i <= $gridx ; $i++ ){ for( $j = 0 ; $j <= $gridy ; $j++ ){ $grid[$i][$j] = " "; } } if( ( $x2 == $x1 ) && ( $y2 == $y1 ) ){ $grid[$x2][$y2] = $pixel; }elsif( $x2 == $x1 ){ #for a vertical line slope is undefined while( $y2 != $y1 ){ $grid[$x1][$y1] = $pixel; $y1++; } }elsif( $y2 == $y1 ){ $yaxisintercept = $y2; while( $x2 != $x1 ){ $grid[$x1][$y1] = $pixel; $x1++; } }else{ my $slope = find_slope( $x1 , $y1 , $x2 , $y2 ); #$slope = int( $slope + 0.5 ); #breaks when this line is comme +nted while( $x1 != $x2 ){ my $x = $x1; my $y = ( $slope * $x ) + $yaxisintercept; $grid[$x][$y] = $pixel; $x1++; } } return \@grid; } sub find_slope{ my ( $x1 , $y1 , $x2 , $y2 ) = @_; #Note y = mx + c is the equation of a line # Given two equations (y1) = m(x1) + c and (y2) = m(x2) + c # Subtracting second equation from first you get m as my $m = ( $y2 - $y1 ) / ( $x2 - $x1 ) ; return $m; } sub draw_pixels_on_screen{ my ( $grid_values , $x_axis_limit , $y_axis_limit ) = @_; my @grid = @$grid_values; my $x = 0; my $y = 0; for( $x = $x_axis_limit ; $x >= 0 ; $x-- ){ for( $y = 0 ; $y <= $y_axis_limit ; $y++ ){ print $grid[$y][$x]; } print "\n"; } }

Comment on Drawing lines and circles
Download Code
Re: Drawing lines and circles
by RichardK (Priest) on Oct 01, 2013 at 08:35 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1056450]
Approved by hdb
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (9)
As of 2014-07-14 08:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (256 votes), past polls