1<?php
2
3/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5/**
6 * 3d Library
7 *
8 * PHP versions 5
9 *
10 * LICENSE:
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24 *
25 * @category  Image
26 * @package   Image_3D
27 * @author    Kore Nordmann <3d@kore-nordmann.de>
28 * @copyright 1997-2005 Kore Nordmann
29 * @license   http://www.gnu.org/licenses/lgpl.txt lgpl 2.1
30 * @version   CVS: $Id$
31 * @link      http://pear.php.net/package/PackageName
32 * @since     File available since Release 0.1.0
33 */
34
35require_once('Image/3D/Paintable/Object.php');
36
37/**
38 * Image_3D_Object_Pie
39 *
40 * @category   Image
41 * @package    Image_3D
42 * @author     Kore Nordmann <3d@kore-nordmann.de>
43 * @copyright  1997-2005 Kore Nordmann
44 * @license    http://www.gnu.org/licenses/lgpl.txt lgpl 2.1
45 * @version    Release: @package_version@
46 * @link       http://pear.php.net/package/PackageName
47 * @since      Class available since Release 0.1.0
48 */
49class Image_3D_Object_Pie extends Image_3D_Object {
50
51    public function __construct($parameter)
52    {
53        $parameter = $this->_checkParameter($parameter);
54
55        if ($parameter['inside'] == 0) {
56            $this->_createPie($parameter);
57        } else {
58            $this->_createDonutPie($parameter);
59        }
60    }
61
62    protected function _createPie($parameter)
63    {
64        $step = ($parameter['end'] - $parameter['start']) / $parameter['detail'];
65
66        // center
67        $centerTop = new Image_3D_Point(0, 0, .5);
68        $centerBottom = new Image_3D_Point(0, 0, -.5);
69
70        // Add polygones for top and bottom of the pie
71        $x = cos($parameter['start']) * $parameter['outside'];
72        $y = sin($parameter['start']) * $parameter['outside'];
73        $top = new Image_3D_Point($x, $y, .5);
74        $bottom = new Image_3D_Point($x, $y, -.5);
75
76        // Polygones for the opening side
77        $this->_addPolygon(new Image_3D_Polygon($top, $centerTop, $centerBottom));
78        $this->_addPolygon(new Image_3D_Polygon($bottom, $top, $centerBottom));
79
80        for ($i = 1; $i <= $parameter['detail']; $i++) {
81            $x = cos($parameter['start'] + $i * $step) * $parameter['outside'];
82            $y = sin($parameter['start'] + $i * $step) * $parameter['outside'];
83
84            $newTop = new Image_3D_Point($x, $y, .5);
85            $newBottom = new Image_3D_Point($x, $y, -.5);
86
87            $this->_addPolygon(new Image_3D_Polygon($centerTop, $top, $newTop));
88            $this->_addPolygon(new Image_3D_Polygon($centerBottom, $bottom, $newBottom));
89
90            // Rand
91            $this->_addPolygon(new Image_3D_Polygon($top, $newBottom, $newTop));
92            $this->_addPolygon(new Image_3D_Polygon($top, $bottom, $newBottom));
93
94            $top = $newTop; $bottom = $newBottom;
95        }
96
97        // Polygones for the closing side
98        $this->_addPolygon(new Image_3D_Polygon($top, $centerTop, $centerBottom));
99        $this->_addPolygon(new Image_3D_Polygon($bottom, $top, $centerBottom));
100    }
101
102    protected function _checkParameter($array)
103    {
104        $array['detail'] = max(1, (int) @$array['detail']);
105        $array['outside'] = max(0, (int) @$array['outside']);
106        $array['inside'] = min(max(0, (int) @$array['inside']), @$array['outside']);
107        $array['start'] = max(0, deg2rad((float) @$array['start']));
108        $array['end'] = max(0, deg2rad((float) @$array['end']));
109
110        return ($array);
111    }
112}
113