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