PHP Velho Oeste 2024

SWFShape::drawLineTo

(PHP 5 < 5.3.0, PECL ming SVN)

SWFShape::drawLineToTrace une ligne

Description

SWFShape::drawLineTo ( float $x , float $y ) : void
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

swfshape::setrightfill() trace une ligne (en utilisant le style de la ligne courante, défini par la fonction swfshape::setline()) depuis la position courante du stylo vers le point (x,y) dans l'espace de coordonnées de la forme.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

add a note add a note

User Contributed Notes 1 note

up
0
lexmanspam at laposte dot net
18 years ago
If you have the error <<drawlineto(): failed assertion>> :

Ming can't handel drawLineToTo if the distance from the previous point is over 8276.7 pixels (mesured empiriticaly) in the vertical or horizontal axis
Why ?
Coordinates in SWF are in twips (20 twips = 1 pixel)
and 2^16 = 65536 = 3276.8 * 20
So we can assume that coordinates of drawLineTo in SWf are relatives to the previous point, and take 16 bits (plus the sign).
Or it can be ming that brings this limitation
These measures have been made with ming_setScale(20.00000000);
This issue doesn't seem to occur with movePenTo

Here's how you can handle this :

<?php
function splitForMing($x1, $y1, $x2, $y2) {
 
$res = array();
 
$nbSegments floor(max(abs($x2 - $x1), abs($y2 - $y1)) / 3276) + 1;
  for(
$i = 1; $i < $nbSegments ; $i++) { // ($nbSegments - 1) iterations in the loop : the 1st point is assumed to have been already processed ; the last one is already known
           
$res[] = array($x1 + ($x2 - $x1) * $i / $nbSegments, $y1 + ($y2 - $y1) * $i / $nbSegments);
  }
 
$res[] = array($x2, $y2);
  return
$res;
}

ming_setScale(20.00000000);
ming_useswfversion(6); // With ming 0.3
$movie = new SWFMovie();
$movie->setDimension(20000,8000);
$movie->setBackground(0xcc, 0xcc, 0xcc );
$movie->setRate(24);

$polygone = new SWFShape();
$polygone->setRightFill($polygone->addFill(0xff, 0, 0));
$polygone->setLine(20, 0x7f, 0, 0);
$polygone->movePenTo(10000, 500); // No split needed for movePenTo
$tmp = splitForMing(10000, 500, 15000, 500);
for(
$i = 0 ; $i < count($tmp) ; $i++) {
    
$polygone->drawLineTo($tmp[$i][0], $tmp[$i][1]); // C
}
$tmp = splitForMing(15000, 500, 15000, 5500);
for(
$i = 0 ; $i < count($tmp) ; $i++) {
    
$polygone->drawLineTo($tmp[$i][0], $tmp[$i][1]); // C
}
$tmp = splitForMing(15000, 5500, 10000, 500);
for(
$i = 0 ; $i < count($tmp) ; $i++) {
    
$polygone->drawLineTo($tmp[$i][0], $tmp[$i][1]); // C
}
$polygone->drawLineTo(15000, 15000);
$ajout = $movie->add($polygone);
$ajout->setName("test");
$movie->output();
?>
To Top