Files
harbour-core/harbour/contrib/hbgd/tests/tpoly.prg
Viktor Szakats 125cb328ff 2010-11-21 15:56 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbgd/tests/tpoly.prg
    + Applied PI patch from Tamas.

  * contrib/hbgd/gd.ch
    ! Changed tabs to spaces.
    * Formatting.
    - Deleted GD_VERS which was not working and its wrong concept
      anyway.

  * contrib/hbgd/gdwrp.c
    ! Fixed to always define all wrappers regardless of GD version.

  * contrib/hbgd/gdimage.prg
    ! Deleted reliance on GD_VERS.
2010-11-21 14:57:50 +00:00

118 lines
2.6 KiB
Plaintext

/*
* $Id$
*/
/*
* Koch Flake -- for testing gdImage*Polygon()
*/
#include "gd.ch"
#include "simpleio.ch"
#command TurnRight( <x> ) => s_nAngle += Pi() / 3 * <x>
#command TurnLeft( <x> ) => s_nAngle -= Pi() / 3 * <x>
#define IMAGES_OUT "imgs_out" + hb_ps()
STATIC s_aCoords
STATIC s_nAngle, s_nCoordX, s_nCoordY
PROCEDURE Main()
DrawFlake( .T. )
DrawFlake( .F. )
RETURN
PROCEDURE DrawFlake( lOpenPoly )
LOCAL nOrder, nSide, nSides, nSideLen
LOCAL gdImage, gdColor
LOCAL cImageName
nSides := 3
nSideLen := 1500
nOrder := 7
cImageName := IIF( lOpenPoly, "flakeo.png", "flake.png" )
gdImage := gdImageCreate( 1900, 2100 )
gdImageColorAllocate( gdImage, 0, 0, 0 )
/* Flake inside out, initial state */
s_nCoordX := 200
s_nCoordY := 600
s_aCoords := { { s_nCoordX, s_nCoordY } }
s_nAngle := 0
FOR nSide := 1 TO nSides
KochFlake( nOrder, nSideLen, .F. )
s_nAngle += Pi() * 2 / nSides
NEXT
OutStd( hb_strFormat( "Drawing %d vertices%s", Len( s_aCoords ), hb_eol() ) )
/** In green */
gdColor := gdImageColorAllocate( gdImage, 0, 255, 0 )
IIF( lOpenPoly,;
gdImageOpenPolygon( gdImage, s_aCoords, gdColor ),;
gdImagePolygon( gdImage, s_aCoords, gdColor ) )
/* Regular flake, initial state */
s_nCoordX := 200
s_nCoordY := 600
s_aCoords := { { s_nCoordX, s_nCoordY } }
s_nAngle := 0
FOR nSide := 1 TO nSides
KochFlake( nOrder, nSideLen, .T. )
s_nAngle += Pi() * 2 / nSides
NEXT
OutStd( hb_strFormat( "Drawing %d vertices%s", Len( s_aCoords ), hb_eol() ) )
/** In yellow */
gdColor := gdImageColorAllocate( gdImage, 255, 255, 0 )
IIF( lOpenPoly,;
gdImageOpenPolygon( gdImage, s_aCoords, gdColor ),;
gdImagePolygon( gdImage, s_aCoords, gdColor ) )
gdImagePng( gdImage, IMAGES_OUT + cImageName )
gdImageDestroy( gdImage )
RETURN
PROCEDURE KochFlake( nOrder, nSideLen, lLeftFirst )
IF nOrder == 0
AAdd( s_aCoords, {;
s_nCoordX += Cos( s_nAngle ) * nSideLen,;
s_nCoordY += Sin( s_nAngle ) * nSideLen;
})
ELSE
KochFlake( nOrder - 1, nSideLen / 3, lLeftFirst )
IF lLeftFirst
TurnLeft( 1 )
ELSE
TurnRight( 1 )
ENDIF
KochFlake( nOrder - 1, nSideLen / 3, lLeftFirst )
IF lLeftFirst
TurnRight( 2 )
ELSE
TurnLeft( 2 )
ENDIF
KochFlake( nOrder - 1, nSideLen / 3, lLeftFirst )
IF lLeftFirst
TurnLeft( 1 )
ELSE
TurnRight( 1 )
ENDIF
KochFlake( nOrder - 1, nSideLen / 3, lLeftFirst )
ENDIF
RETURN