From: <ai...@us...> - 2011-03-05 18:36:51
|
Revision: 11598 http://plplot.svn.sourceforge.net/plplot/?rev=11598&view=rev Author: airwin Date: 2011-03-05 18:36:45 +0000 (Sat, 05 Mar 2011) Log Message: ----------- Add fill pages to the 27th f95 example to make the results consistent with the corresponding C example. Modified Paths: -------------- trunk/examples/f95/x27f.f90 Modified: trunk/examples/f95/x27f.f90 =================================================================== --- trunk/examples/f95/x27f.f90 2011-03-05 18:16:32 UTC (rev 11597) +++ trunk/examples/f95/x27f.f90 2011-03-05 18:36:45 UTC (rev 11598) @@ -1,4 +1,4 @@ -! $Id:$ +! $Id$ ! ! Drawing "spirograph" curves - epitrochoids, cycolids, roulettes ! @@ -36,12 +36,15 @@ use plplot implicit none - ! R, r, p, N + integer i, j, fill real(kind=plflt) params(4,9) - integer i, j - + ! R, r, p, N + ! R and r should be integers to give correct termination of the + ! angle loop using gcd. + ! N.B. N is just a place holder since it is no longer used + ! (because we now have proper termination of the angle loop). data ( ( params(i,j) ,i=1,4) ,j=1,9 ) / & 21.0_plflt, 7.0_plflt, 7.0_plflt, 3.0_plflt, & 21.0_plflt, 7.0_plflt, 10.0_plflt, 3.0_plflt, & @@ -72,10 +75,11 @@ call plssub(3, 3) + fill = 0 do i = 1,9 call pladv(0) call plvpor( 0.0_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt ) - call spiro( params(1,i) ) + call spiro( params(1,i), fill ) end do call pladv(0) call plssub(1, 1) @@ -83,14 +87,41 @@ do i = 1,9 call pladv(0) call plvpor( 0.0_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt ) - call spiro( params(1,i) ) + call spiro( params(1,i), fill ) end do - ! Don't forget to call plend() to finish off! + ! fill the curves. + fill = 1 + call pladv(0) + call plssub(1, 1) + + do i = 1,9 + call pladv(0) + call plvpor( 0.0_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt ) + call spiro( params(1,i), fill ) + end do + call plend() end program x27f +! -------------------------------------------------------------------------- +! Calculate greatest common divisor following pseudo-code for the +! Euclidian algorithm at http://en.wikipedia.org/wiki/Euclidean_algorithm + +integer function gcd (a, b) + implicit none + integer a, b, t + a = abs(a) + b = abs(b) + do while ( b .ne. 0 ) + t = b + b = mod (a, b) + a = t + enddo + gcd = a +end function gcd + ! =============================================================== subroutine cycloid @@ -101,14 +132,14 @@ ! =============================================================== -subroutine spiro( params ) +subroutine spiro( params, fill ) use plplot implicit none real(kind=plflt) params(*) integer NPNT - parameter ( NPNT = 20000 ) + parameter ( NPNT = 2000 ) integer n real(kind=plflt) xcoord(NPNT+1) real(kind=plflt) ycoord(NPNT+1) @@ -116,6 +147,7 @@ integer windings integer steps integer i + integer fill real(kind=plflt) phi real(kind=plflt) phiw real(kind=plflt) dphi @@ -123,20 +155,17 @@ real(kind=plflt) xmax real(kind=plflt) ymin real(kind=plflt) ymax - real(kind=plflt) scale + integer gcd - ! Fill the coordinates + ! Fill the coordinates - windings = int(params(4)) + ! Proper termination of the angle loop very near the beginning + ! point, see + ! http://mathforum.org/mathimages/index.php/Hypotrochoid. + windings = int(abs(params(2))/gcd(int(params(1)), int(params(2)))) steps = NPNT/windings - dphi = 8.0_plflt*acos(-1.0_plflt)/dble(steps) + dphi = 2.0_plflt*PL_PI/dble(steps) - ! This initialisation is safe! - xmin = 0.0_plflt - xmax = 0.0_plflt - ymin = 0.0_plflt - ymax = 0.0_plflt - n = windings*steps+1 do i = 1,n @@ -145,25 +174,30 @@ xcoord(i) = (params(1)-params(2))*cos(phi)+params(3)*cos(phiw) ycoord(i) = (params(1)-params(2))*sin(phi)-params(3)*sin(phiw) + if (i.eq.1) then + xmin = xcoord(1) + xmax = xcoord(1) + ymin = ycoord(1) + ymax = ycoord(1) + endif if ( xmin > xcoord(i) ) xmin = xcoord(i) if ( xmax < xcoord(i) ) xmax = xcoord(i) if ( ymin > ycoord(i) ) ymin = ycoord(i) if ( ymax < ycoord(i) ) ymax = ycoord(i) end do - if ( xmax-xmin > ymax-ymin ) then - scale = xmax - xmin - else - scale = ymax - ymin - endif - xmin = - 0.65_plflt * scale - xmax = 0.65_plflt * scale - ymin = - 0.65_plflt * scale - ymax = 0.65_plflt * scale + xmin = xmin - 0.15_plflt * (xmax - xmin) + xmax = xmax + 0.15_plflt * (xmax - xmin) + ymin = ymin - 0.15_plflt * (ymax - ymin) + ymax = ymax + 0.15_plflt * (ymax - ymin) call plwind( xmin, xmax, ymin, ymax ) call plcol0(1) - call plline(xcoord(1:n), ycoord(1:n) ) + if ( fill.eq.1) then + call plfill(xcoord(1:n), ycoord(1:n) ) + else + call plline(xcoord(1:n), ycoord(1:n) ) + endif end subroutine spiro This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |