Algorithm-Line-Bresenham
view release on metacpan or search on metacpan
lib/Algorithm/Line/Bresenham.pm view on Meta::CPAN
if ($x*($x2-$x1) > 0) { #/* horizontal cut at P4? */
if ($y*($y2-$y1) > 0){ #/* vertical cut at P6 too? */
if (abs(($y0-2*$y1+$y2)/$t*$x) > abs($y)) { #/* which first? */
$x0 = $x2; $x2 = $x+$x1; $y0 = $y2; $y2 = $y+$y1;# /* swap points */
} #/* now horizontal cut at P4 comes first */
}
$t = ($x0-$x1)/$t;
$r = (1-$t)*((1-$t)*$y0+2.0*$t*$y1)+$t*$t*$y2;# /* By(t=P4) */
$t = ($x0*$x2-$x1*$x1)*$t/($x0-$x1); #/* gradient dP4/dx=0 */
$x = int($t+0.5); $y = int($r+0.5);
$r = ($y1-$y0)*($t-$x0)/($x1-$x0)+$y0; #/* intersect P3 | P0 P1 */
push @points, basic_bezier($x0,$y0, $x,int($r+0.5), $x,$y);
$r = ($y1-$y2)*($t-$x2)/($x1-$x2)+$y2; #/* intersect P4 | P1 P2 */
$x0 = $x1 = $x; $y0 = $y; $y1 = int($r+0.5);# /* P0 = P4, P1 = P8 */
}
if (($y0-$y1)*($y2-$y1) > 0) { #/* vertical cut at P6? */
$t = $y0-2*$y1+$y2; $t = ($y0-$y1)/$t;
$r = (1-$t)*((1-$t)*$x0+2.0*$t*$x1)+$t*$t*$x2; # /* Bx(t=P6) */
$t = ($y0*$y2-$y1*$y1)*$t/($y0-$y1); #/* gradient dP6/dy=0 */
$x = int($r+0.5); $y = int($t+0.5);
$r = ($x1-$x0)*($t-$y0)/($y1-$y0)+$x0; #/* intersect P6 | P0 P1 */
push @points, basic_bezier($x0,$y0, int($r+0.5),$y, $x,$y);
$r = ($x1-$x2)*($t-$y2)/($y1-$y2)+$x2; #/* intersect P7 | P1 P2 */
$x0 = $x; $x1 = int($r+0.5); $y0 = $y1 = $y;# /* P0 = P6, P1 = P7 */
}
push @points, basic_bezier($x0,$y0, $x1,$y1, $x2,$y2); #/* remaining part */
return @points;
}
=head2 C<polyline>
my @points = polyline ($x0, $y0, $x1, $y1, $x2, $y2)
( run in 0.731 second using v1.01-cache-2.11-cpan-39bf76dae61 )