Author: Kore Nordmann
Date: 2007-01-31 15:58:35 +0100 (Wed, 31 Jan 2007)
New Revision: 4604

Log:
- Added initial version for polygon and ellipse segment size reducement
  # Does not work properly in all cases yet

Modified:
   trunk/Graph/src/interfaces/driver.php

Modified: trunk/Graph/src/interfaces/driver.php
===================================================================
--- trunk/Graph/src/interfaces/driver.php       2007-01-31 14:55:20 UTC (rev 
4603)
+++ trunk/Graph/src/interfaces/driver.php       2007-01-31 14:58:35 UTC (rev 
4604)
@@ -106,26 +106,9 @@
         for ( $i = 0; $i < $pointCount; ++$i )
         {
             $nextPoint = ( $i + 1 ) % $pointCount;
-
-            $x = $points[$nextPoint]->x - $points[$i]->x;
-            $y = $points[$nextPoint]->y - $points[$i]->y;
-
-            $length = sqrt(
-                pow( $x, 2 ) + 
-                pow( $y, 2 )
-            );
-
-            if ( $length == 0 )
-            {
-                $vectors[$i] = new ezcGraphCoordinate( $x, $y );
-            }
-            else
-            {
-                $vectors[$i] = new ezcGraphCoordinate(
-                    $x / $length,
-                    $y / $length
-                );
-            }
+            $vectors[$i] = ezcGraphVector::fromCoordinate( $points[$nextPoint] 
)
+                            ->sub( $points[$i] )
+                            ->unify();
         }
 
         // Move points to center
@@ -148,24 +131,128 @@
                     -$vectors[$last]->y * $vectors[$next]->x +
                     $vectors[$last]->x * $vectors[$next]->y 
                 ) < 0 ? 1 : -1;
+            
+            // Orthogonal vector with direction based on the side of the inner
+            // angle
+            $v = clone $vectors[$next];
+            if ( $sign > 0 )
+            {
+                $v->rotateClockwise()->scalar( $size );
+            }
+            else
+            {
+                $v->rotateCounterClockwise()->scalar( $size );
+            }
 
             // Calculate new point: Move point to the center site of the 
             // polygon using the normalized orthogonal vectors next to the 
             // point and the size as distance to move.
-            $newPoints[$next] = new ezcGraphCoordinate(
-                $points[$next]->x
-                    + $sign * $vectors[$last]->y * $size
-                    + $sign * $vectors[$next]->y * $size,
-                $points[$next]->y
-                    - $sign * $vectors[$last]->x * $size
-                    - $sign * $vectors[$next]->x * $size
-            );
+            // point + v + size / tan( angle / 2 ) * startVector
+            $newPoint = clone $vectors[$next];
+            $newPoints[$next] = 
+                $v  ->add( 
+                        $newPoint
+                            ->scalar( 
+                                $size / 
+                                tan( 
+                                    $vectors[$last]
+                                        ->mul( $vectors[$next] ) /
+                                    2
+                                ) 
+                            ) 
+                    )
+                    ->add( $points[$next] );
         }
 
         return $newPoints;
     }
 
     /**
+     * Reduce the size of an ellipse
+     *
+     * The method returns a the edgepoints and angles for an ellipse where all 
+     * borders are moved to the inner side of the ellipse by the give $size 
+     * value.
+     *
+     * The method returns an 
+     * array (
+     *      'center' => (ezcGraphCoordinate) New center point,
+     *      'start' => (ezcGraphCoordinate) New outer start point,
+     *      'end' => (ezcGraphCoordinate) New outer end point,
+     *      'startAngle' => (float) Angle from old center point to new start 
point,
+     *      'endAngle' => (float) Angle from old center point to new end point,
+     * )
+     * 
+     * @param ezcGraphCoordinate $center 
+     * @param mixed $startAngle 
+     * @param mixed $endAngle 
+     * @param mixed $size 
+     * @return array
+     */
+    protected function reduceEllipseSize( ezcGraphCoordinate $center, $width, 
$height, $startAngle, $endAngle, $size )
+    {
+        $oldStartPoint = new ezcGraphVector(
+            $width * cos( deg2rad( $startAngle ) ) / 2,
+            $height * sin( deg2rad( $startAngle ) ) / 2
+        );
+
+        $oldEndPoint = new ezcGraphVector(
+            $width * cos( deg2rad( $endAngle ) ) / 2,
+            $height * sin( deg2rad( $endAngle ) ) / 2
+        );
+
+        // Calculate normalized vectors for the lines spanning the ellipse
+        $startVector = ezcGraphVector::fromCoordinate( $oldStartPoint 
)->unify();
+        $endVector = ezcGraphVector::fromCoordinate( $oldEndPoint )->unify();
+
+        $oldStartPoint->add( $center );
+        $oldEndPoint->add( $center );
+
+        // Use orthogonal vectors of normalized ellipse spanning vectors to 
+        $v = clone $startVector;
+        $v->rotateClockwise()->scalar( $size );
+
+        // calculate new center point
+        // center + v + size / tan( angle / 2 ) * startVector
+        $centerMovement = clone $startVector;
+        $newCenter = $v->add( $centerMovement->scalar( $size / tan( deg2rad( ( 
$endAngle - $startAngle ) / 2 ) ) ) )->add( $center );
+
+
+        // Use start spanning vector and its orthogonal vector to calculate 
+        // new start point
+        $newStartPoint = clone $oldStartPoint;
+
+        $innerVector = clone $startVector;
+        $innerVector->scalar( $size )->scalar( -1 );
+
+        $orthogonalVector = clone $startVector;
+        $orthogonalVector->scalar( $size )->rotateClockwise();
+
+        var_dump( '===', $newStartPoint, $innerVector, $orthogonalVector );
+        $newStartPoint->add( $innerVector)->add( $orthogonalVector );
+
+        // Use end spanning vector and its orthogonal vector to calculate 
+        // new end point
+        $newEndPoint = clone $oldEndPoint;
+
+        $innerVector = clone $endVector;
+        $innerVector->scalar( $size )->scalar( -1 );
+
+        $orthogonalVector = clone $endVector;
+        $orthogonalVector->scalar( $size )->rotateCounterClockwise();
+
+        $newEndPoint->add( $innerVector )->add( $orthogonalVector );
+
+        var_dump( $newCenter, $newStartPoint, $newEndPoint );
+
+        return array(
+            'center' => $newCenter,
+            'start' => $newStartPoint,
+            'end' => $newEndPoint,
+        );
+    }
+
+    /**
      * Draws a single polygon. 
      * 
      * @param array $points Point array

-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to