Author: Kore Nordmann
Date: 2007-02-07 16:14:13 +0100 (Wed, 07 Feb 2007)
New Revision: 4631

Log:
- Calculate edge points for ellipses with reduced size correctly

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

Modified: trunk/Graph/src/interfaces/driver.php
===================================================================
--- trunk/Graph/src/interfaces/driver.php       2007-02-07 15:13:27 UTC (rev 
4630)
+++ trunk/Graph/src/interfaces/driver.php       2007-02-07 15:14:13 UTC (rev 
4631)
@@ -227,6 +227,10 @@
             $height * sin( deg2rad( $endAngle ) ) / 2
         );
 
+        // We always need radian values..
+        $startAngle = deg2rad( $startAngle );
+        $endAngle = deg2rad( $endAngle );
+
         // Calculate normalized vectors for the lines spanning the ellipse
         $startVector = ezcGraphVector::fromCoordinate( $oldStartPoint 
)->unify();
         $endVector = ezcGraphVector::fromCoordinate( $oldEndPoint )->unify();
@@ -241,33 +245,56 @@
         // 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 );
+        $newCenter = $v->add( $centerMovement->scalar( $size / tan( ( 
$endAngle - $startAngle ) / 2 ) ) )->add( $center );
 
-
         // Use start spanning vector and its orthogonal vector to calculate 
         // new start point
         $newStartPoint = clone $oldStartPoint;
 
+        // Create tangent vector from tangent angle
+        
+        // Ellipse tangent factor
+        $ellipseTangentFactor = sqrt(
+            pow( $height, 2 ) *
+                pow( cos( $startAngle ), 2 ) +
+            pow( $width, 2 ) *
+                pow( sin( $startAngle ), 2 )
+        );
+        $ellipseTangentVector = new ezcGraphVector(
+            $width * -sin( $startAngle ) / $ellipseTangentFactor,
+            $height * cos( $startAngle ) / $ellipseTangentFactor
+        );
+
+        // Reverse spanning vector
         $innerVector = clone $startVector;
         $innerVector->scalar( $size )->scalar( -1 );
 
-        $orthogonalVector = clone $startVector;
-        $orthogonalVector->scalar( $size )->rotateClockwise();
+        $newStartPoint->add( $innerVector)->add( 
$ellipseTangentVector->scalar( $size ) );
 
-        $newStartPoint->add( $innerVector)->add( $orthogonalVector );
-
         // Use end spanning vector and its orthogonal vector to calculate 
         // new end point
         $newEndPoint = clone $oldEndPoint;
 
+        // Create tangent vector from tangent angle
+        
+        // Ellipse tangent factor
+        $ellipseTangentFactor = sqrt(
+            pow( $height, 2 ) *
+                pow( cos( $endAngle ), 2 ) +
+            pow( $width, 2 ) *
+                pow( sin( $endAngle ), 2 )
+        );
+        $ellipseTangentVector = new ezcGraphVector(
+            $width * -sin( $endAngle ) / $ellipseTangentFactor,
+            $height * cos( $endAngle ) / $ellipseTangentFactor
+        );
+
+        // Reverse spanning vector
         $innerVector = clone $endVector;
         $innerVector->scalar( $size )->scalar( -1 );
 
-        $orthogonalVector = clone $endVector;
-        $orthogonalVector->scalar( $size )->rotateCounterClockwise();
+        $newEndPoint->add( $innerVector )->add( $ellipseTangentVector->scalar( 
$size )->scalar( -1 ) );
 
-        $newEndPoint->add( $innerVector )->add( $orthogonalVector );
-
         return array(
             'center' => $newCenter,
             'start' => $newStartPoint,

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

Reply via email to