This GD example program demonstrates the code for an example program that demonstrates how to draw antialiased triangles with GD and create a png image.
<?php
function LeftOn($dX1, $dY1, $dX2, $dY2, $dPX, $dPY) {
return ((($dX2 - $dX1)*($dPY - $dY1) - ($dPX - $dX1)*($dY2 - $dY1)) <= 0);
}
// We need P3 to be left of the P1 P2 line segment.
function SmoothTriangle(&$qrImage, $dX1, $dY1, $dX2, $dY2, $dX3, $dY3, $qColor) {
$iWidth = ImageSX($qrImage);
$iHeight = ImageSY($qrImage);
for ($i = 0; $i < $iWidth; ++$i) {
for ($j = 0; $j < $iHeight; ++$j) {
// Filter indices
// Locations: -.4, -.2, 0, .2, .4
$iWeight = 0;
for ($iXF = 0; $iXF < 5; ++$iXF) {
for ($iYF = 0; $iYF < 5; ++$iYF) {
$dX = $i + .2*$iXF - .4;
$dY = $j + .2*$iYF - .4;
$bLeftOn1 = LeftOn($dX1, $dY1, $dX2, $dY2, $dX, $dY);
$bLeftOn2 = LeftOn($dX2, $dY2, $dX3, $dY3, $dX, $dY);
$bLeftOn3 = LeftOn($dX3, $dY3, $dX1, $dY1, $dX, $dY);
if ($bLeftOn1 && $bLeftOn2 && $bLeftOn3) {
$iWeight += 1;
}
}
}
// Get the current pixel index
if ($iWeight != 0) {
// reweight using a semicircle to approximate logarithmic response
// Use a semicircle response curve x/w = y^2/w^2 --> y = sqrt(w*x)/w
// The maximum weight is 25.
$qPixel = ImageColorExactAlpha( $qrImage,
$qColor[ 'R' ], $qColor[ 'G' ], $qColor[ 'B' ],
( 127 - 127*sqrt(25*$iWeight)/25 ) );
ImageSetPixel( $qrImage, $i, $j, $qPixel);
}
}
}
}
$qImage = ImageCreateTrueColor( 320, 240 );
// These triangles must be positively oriented.
SmoothTriangle($qImage, 20, 20, 160, 200, 300, 120,
Array( 'R' => 0x40, 'G' => 0x80, 'B' => 0x40 ));
SmoothTriangle($qImage, 10, 120, 300, 50, 120, 20,
Array( 'R' => 0x80, 'G' => 0x80, 'B' => 0xF0 ));
Header('Content-Type: image/png');
ImagePNG($qImage);
ImageDestroy($qImage);
?>
© 20072025 XoaX.net LLC. All rights reserved.