Class chart { Var $ a; // The long half-axis of the ellipse. Var $ B; // specifies the shorter half-axis of an ellipse. Var $ DataArray; // data of each sector Var $ ColorArray; // The color of each slice must be written in hexadecimal format, but 0x is not added before. // Black for the edge and shadow Function chart ($ pa = 100, $ pb = 60, $ sData = "100,200,300,400,500,300", $ sColor = "ee00ff, dd0000, cccccccc, ccff00, 00 ccff, ccff00 ") { $ This-> a = $ pa; $ This-> B = $ pb; $ This-> DataArray = split (",", $ sData ); $ This-> ColorArray = split (",", $ sColor ); } Function setA ($ v ){ $ This-> a = $ v; } Function getA (){ Return $ this->; } Function setB ($ v ){ $ This-> B = $ v; } Function getB (){ Return $ this-> B; } Function setDataArray ($ v ){ $ This-> DataArray = split (",", $ v ); } Function getDataArray ($ v ){ Return $ this-> DataArray; } Function setColorArray ($ v ){ $ This-> ColorArray = split (",", $ v ); } Function getColorArray (){ Return $ this-> ColorArray; } Function DrawPie (){ $ Image = imagecreate ($ this-> a * 2 + 40, $ this-> B * 2 + 40 ); $ PieCenterX = $ this-> a + 10; $ PieCenterY = $ this-> B + 10; $ DoubleA = $ this-> a * 2; $ DoubleB = $ this-> B * 2; List ($ R, $ G, $ B) = getRGB (0 ); $ ColorBorder = imagecolorallocate ($ image, $ R, $ G, $ B ); $ DataNumber = count ($ this-> DataArray ); // $ DataTotal For ($ I = 0; $ I <$ DataNumber; $ I ++) $ DataTotal + = $ this-> DataArray [$ I]; // calculates the data and // Fill in the background Imagefill ($ image, 0, 0, imagecolorallocate ($ image, 0xFF, 0xFF, 0xFF )); /* ** Draw each slice */ $ Degrees = 0; For ($ I = 0; $ I <$ DataNumber; $ I ++ ){ $ StartDegrees = round ($ Degrees ); $ Degrees + = ($ this-> DataArray [$ I]/$ DataTotal) * 360 ); $ EndDegrees = round ($ Degrees ); $ Percent = number_format ($ this-> DataArray [$ I]/$ DataTotal * 100, 1 ); List ($ R, $ G, $ B) = getRGB (hexdec ($ this-> ColorArray [$ I]); $ CurrentColor = imagecolorallocate ($ image, $ R, $ G, $ B ); If ($ R> 60 and $ R <256) $ R = $ R-60; If ($ G> 60 and $ G <256) $ G = $ G-60; If ($ B> 60 and $ B <256) $ B = $ B-60; $ CurrentDarkColor = imagecolorallocate ($ image, $ R, $ G, $ B ); // Draw slice arc Imagearc ($ image, $ PieCenterX, $ PieCenterY, $ DoubleA, $ DoubleB, $ StartDegrees, $ EndDegrees, $ CurrentColor ); // Draw a straight line List ($ ArcX, $ ArcY) = pie_point ($ StartDegrees, $ this-> a, $ this-> B ); Imageline ($ image, $ PieCenterX, $ PieCenterY, floor ($ PieCenterX + $ ArcX), floor ($ PieCenterY + $ ArcY), $ CurrentColor ); // Draw a straight line List ($ ArcX, $ ArcY) = pie_point ($ EndDegrees, $ this-> a, $ this-> B ); Imageline ($ image, $ PieCenterX, $ PieCenterY, ceil ($ PieCenterX + $ ArcX), ceil ($ PieCenterY + $ ArcY), $ CurrentColor ); // Fill the slice $ MidPoint = round ($ EndDegrees-$ StartDegrees)/2) + $ StartDegrees ); List ($ ArcX, $ ArcY) = Pie_point ($ MidPoint, $ this-> a * 3/4, $ this-> B * 3/4 ); Imagefilltoborder ($ image, floor ($ PieCenterX + $ ArcX), floor ($ PieCenterY + $ ArcY), $ CurrentColor, $ CurrentColor ); Imagestring ($ image, 2, floor ($ PieCenterX + $ ArcX-5), floor ($ PieCenterY + $ ArcY-5), $ percent. "%", $ colorBorder ); // Shadow If ($ StartDegrees> = 0 and $ StartDegrees <= 180 ){ If ($ EndDegrees <= 180 ){ For ($ k = 1; $ k <15; $ k ++) Imagearc ($ image, $ PieCenterX, $ PieCenterY + $ k, $ DoubleA, $ DoubleB, $ StartDegrees, $ EndDegrees, $ CurrentDarkColor ); } Else { For ($ k = 1; $ k <15; $ k ++) Imagearc ($ image, $ PieCenterX, $ PieCenterY + $ k, $ DoubleA, $ DoubleB, $ StartDegrees, 180, $ CurrentDarkColor ); } } } /* This script has produced an image. ** What we need now is to send it to the browser. The important thing is to send the header to the browser so that it knows that it is a GIF file. Otherwise, you can only see a bunch of strange garbled characters. */ // Output the generated image Header ("Content-type: image/gif "); Imagegif ($ image ); Imagedestroy ($ image ); } // End drawPie () } // End class // Implementation
$ Objp = new chart (); $ Objp-> DrawPie (); |