/**
 * @param float $r1
 * @param float $r2
 * @param float $alpha
 * @param float $angle
 *
 * @return Path
 */
function getGroupPath($r1, $r2, $alpha, $angle)
{
    $radians = ArcUtils::getArcRadians($alpha, $angle);
    $scale = ArcUtils::getScale($radians);
    list($sX, $sY) = ArcUtils::getPolarPoint($r2, $radians[0]);
    list($curX, $curY) = ArcUtils::getPolarPoint($r1, $radians[0]);
    $path = new Path($sX, $sY);
    if ($r1 !== $r2) {
        $path->lineTo($curX, $curY);
    }
    $pos = 1;
    while ($pos < count($radians)) {
        list($nextX, $nextY) = ArcUtils::getPolarPoint($r1, $radians[$pos++]);
        list($c1X, $c1Y) = ArcUtils::getBezierControl($curX, $curY, -$scale);
        list($c2X, $c2Y) = ArcUtils::getBezierControl($nextX, $nextY, $scale);
        $path->curveTo($c1X, $c1Y, $c2X, $c2Y, $nextX, $nextY);
        $curX = $nextX;
        $curY = $nextY;
    }
    list($eX, $eY) = ArcUtils::getPolarPoint($r2, end($radians));
    if ($r1 !== $r2) {
        $path->lineTo($eX, $eY);
    }
    return $path;
}
 /**
  */
 public function testVisibility()
 {
     $path = new Path(1, 2);
     $this->assertFalse($path->isVisible());
     $path = new Path(1, 2);
     $path->close();
     $this->assertFalse($path->isVisible());
     $path = new Path(1, 2);
     $path->lineTo(2, 3);
     $this->assertTrue($path->isVisible());
     $path = new Path(1, 2);
     $path->curveTo(2, 3, 3, 4, 4, 5);
     $this->assertTrue($path->isVisible());
 }
 /**
  * @return Path
  */
 private function getPartialRingPath()
 {
     $outer = $this->getOuterRadius();
     $inner = $this->getInnerRadius();
     $cx = $this->getX();
     $cy = $this->getY();
     if ($this->angle === 0.0) {
         $radian = ArcUtils::toRadian($this->getAlpha());
         list($outerX, $outerY) = ArcUtils::getPolarPoint($outer, $radian);
         list($innerX, $innerY) = ArcUtils::getPolarPoint($inner, $radian);
         return (new Path($outerX + $cx, $outerY + $cy))->lineTo($innerX + $cx, $innerY + $cy)->close();
     }
     $radians = ArcUtils::getArcRadians($this->getAlpha(), $this->getAngle());
     $scale = ArcUtils::getScale($radians);
     $pos = 0;
     // outer arc
     list($curX, $curY) = ArcUtils::getPolarPoint($outer, $radians[$pos++]);
     $path = new Path($curX + $cx, $curY + $cy);
     while ($pos < count($radians)) {
         list($nextX, $nextY) = ArcUtils::getPolarPoint($outer, $radians[$pos++]);
         list($c1X, $c1Y) = ArcUtils::getBezierControl($curX, $curY, -$scale);
         list($c2X, $c2Y) = ArcUtils::getBezierControl($nextX, $nextY, $scale);
         $path->curveTo($c1X + $cx, $c1Y + $cy, $c2X + $cx, $c2Y + $cy, $nextX + $cx, $nextY + $cy);
         $curX = $nextX;
         $curY = $nextY;
     }
     // inner arc
     list($curX, $curY) = ArcUtils::getPolarPoint($inner, $radians[--$pos]);
     if ($this->angle === 360.0) {
         // full ring
         $path->close()->moveTo($curX + $cx, $curY + $cy);
     } else {
         $path->lineTo($curX + $cx, $curY + $cy);
     }
     while ($pos > 0) {
         list($nextX, $nextY) = ArcUtils::getPolarPoint($inner, $radians[--$pos]);
         list($c1X, $c1Y) = ArcUtils::getBezierControl($curX, $curY, $scale);
         list($c2X, $c2Y) = ArcUtils::getBezierControl($nextX, $nextY, -$scale);
         $path->curveTo($c1X + $cx, $c1Y + $cy, $c2X + $cx, $c2Y + $cy, $nextX + $cx, $nextY + $cy);
         $curX = $nextX;
         $curY = $nextY;
     }
     // close path
     $path->close();
     return $path;
 }
Exemple #4
0
$rect = $graphic->addRectangle(-35, 10, 30, 30);
$rect->setFillColor('red');
$rect->setStrokeColor('green');
$rect->setOpacity(0.7);
$rect = $graphic->addRectangle(0, 0, 30, 30);
$rect->setFillColor('blue');
$rect->setStrokeColor(null);
$rect = $graphic->addRectangle(-30, -30, 30, 30);
$rect->setFillColor('yellow');
$rect->setStrokeColor('red');
$rect = $graphic->addRectangle(0, -30, 30, 30);
$rect->setFillColor('green');
$rect->setStrokeColor('blue', 0.5);
$radius = 80;
$p1 = $path = new Path($radius * sin(0.0 / 5.0 * pi()), $radius * cos(0.0 / 5.0 * pi()));
$path->curveTo($radius * sin(1.0 / 5.0 * pi()) / 2, $radius * cos(1.0 / 5.0 * pi()) / 2, $radius * sin(3.0 / 5.0 * pi()) / 2, $radius * cos(3.0 / 5.0 * pi()) / 2, $radius * sin(4.0 / 5.0 * pi()), $radius * cos(4.0 / 5.0 * pi()));
$path->curveTo($radius * sin(5.0 / 5.0 * pi()) / 2, $radius * cos(5.0 / 5.0 * pi()) / 2, $radius * sin(7.0 / 5.0 * pi()) / 2, $radius * cos(7.0 / 5.0 * pi()) / 2, $radius * sin(8.0 / 5.0 * pi()), $radius * cos(8.0 / 5.0 * pi()));
$path->curveTo($radius * sin(9.0 / 5.0 * pi()) / 2, $radius * cos(9.0 / 5.0 * pi()) / 2, $radius * sin(1.0 / 5.0 * pi()) / 2, $radius * cos(1.0 / 5.0 * pi()) / 2, $radius * sin(2.0 / 5.0 * pi()), $radius * cos(2.0 / 5.0 * pi()));
$path->curveTo($radius * sin(3.0 / 5.0 * pi()) / 2, $radius * cos(3.0 / 5.0 * pi()) / 2, $radius * sin(5.0 / 5.0 * pi()) / 2, $radius * cos(5.0 / 5.0 * pi()) / 2, $radius * sin(6.0 / 5.0 * pi()), $radius * cos(6.0 / 5.0 * pi()));
$path->curveTo($radius * sin(7.0 / 5.0 * pi()) / 2, $radius * cos(7.0 / 5.0 * pi()) / 2, $radius * sin(9.0 / 5.0 * pi()) / 2, $radius * cos(9.0 / 5.0 * pi()) / 2, $radius * sin(0.0 / 5.0 * pi()), $radius * cos(0.0 / 5.0 * pi()));
$path->close();
$graphic->addPath($path)->setFillColor('black', 0.3);
$radius = 80;
$path = new Path($radius * sin(1.0 / 5.0 * pi()), $radius * cos(1.0 / 5.0 * pi()));
$path->lineTo($radius * sin(5.0 / 5.0 * pi()), $radius * cos(5.0 / 5.0 * pi()));
$path->lineTo($radius * sin(9.0 / 5.0 * pi()), $radius * cos(9.0 / 5.0 * pi()));
$path->lineTo($radius * sin(3.0 / 5.0 * pi()), $radius * cos(3.0 / 5.0 * pi()));
$path->lineTo($radius * sin(7.0 / 5.0 * pi()), $radius * cos(7.0 / 5.0 * pi()));
$path->lineTo($radius * sin(1.0 / 5.0 * pi()), $radius * cos(1.0 / 5.0 * pi()));
$path->close();
$graphic->addPath($path)->setFillColor('black')->setStrokeColor('blue', 0.6)->setOpacity(0.6);