<?php
|
/*---------------------------------------------------------------*/
|
/*
|
Titre : Ligne diagonale
|
|
URL : https://phpsources.net/code_s.php?id=975
|
Date édition : 15 Fév 2019
|
*/
|
/*---------------------------------------------------------------*/
|
|
function imagelinetoborder($im , $x1 , $y1 , $angle , $col){
|
|
|
/*******************************************************************************
|
//*****
|
* Trace une droite d'un point vers le bord en suivant un angle *
|
* *
|
* array imagelinetoborder(ressource im, int x1, int y1, int angle, int col) *
|
* *
|
* imagelinetoborder retourne un tableau contenant aux indexs x *
|
* et y les coordonnées de l'intersection de la droite avec le bord de l'image
|
*
|
* Elle traçe une droite de la couleur col en partant du point de coordonnées
|
x1, y1 * * en suivant l'angle a exprimé en degrés , les angles corresponden
|
t aux angles *
|
* utilisés sur une carte : 0 et 360 vers le haut, 90 vers la droite, 180 vers
|
le bas*
|
* et 270 vers la gauche. *
|
* *
|
*
|
********************************************************************************
|
**/
|
|
$width=imagesx($im);
|
$height=imagesy($im);
|
|
if ($angle<0)
|
{
|
$angle=360*100+$angle;
|
}
|
|
$angle=$angle % 360;
|
$angle_rad=deg2rad($angle);
|
|
$x2=$x1;
|
$y2=$y1;
|
|
$rayon_cercle_trigo=2;
|
|
$y1toy2=cos($angle_rad)*$rayon_cercle_trigo;
|
$x1tox2=sin($angle_rad)*$rayon_cercle_trigo;
|
|
|
//Cette boucle permet de mettre des segments immaginaires bout a bout jusqu'Ã Â
|
// ce qu'un depasse du cadre
|
|
//et arrête la boucle. La structure de contôle do...while permet d'executer la
|
// première boucle et ensuite
|
//de verifier la condition contenue dans while.
|
|
while($x2>=0 and $x2<=$width and $y2>=0 and $y2<=$height)
|
{
|
$x2=$x2+$x1tox2;
|
$y2=$y2-$y1toy2;
|
}
|
|
|
//La boucle précedente va maintenant nous permettre de savoir ou aboutit le
|
// dernier segment immaginaire
|
|
//La situation correspond a sa position n correspondant à  Nord, s à  Sud
|
// ...
|
|
//Je me suis permis de faire une approximation quand aux situations ne, nw, se
|
// et sw (trop compliqué)
|
|
$situation="";
|
|
if($y2<=0)
|
{
|
$situation.="n";
|
}
|
elseif($y2>=$height)
|
{
|
$situation.="s";
|
}
|
|
if($x2<=0)
|
{
|
$situation.="w";
|
}
|
elseif($x2>=$width)
|
{
|
$situation.="e";
|
}
|
|
if($situation=="nw" or $situation=="ne")
|
{
|
$situation=="n";
|
}
|
elseif($situation=="sw" or $situation=="nw")
|
{
|
$situation=="s";
|
}
|
|
|
//maintenant que l'on connait la situation, on va pouvoir effectuer des calculs
|
// precis pour determiner la
|
//position du point de destination de coordonnées [x2, y2].
|
|
if($situation=="n")
|
{
|
$y2=0;
|
$x2=sin($angle_rad)*$y1+$x1;
|
}
|
elseif($situation=="s")
|
{
|
$y2=$height;
|
$x2=sin($angle_rad)*($height-$y1)+$x1;
|
}
|
elseif($situation=="w")
|
{
|
$x2=0;
|
$y2=-cos($angle_rad)*$x1+$y1;
|
}
|
elseif($situation=="e")
|
{
|
$x2=$width;
|
$y2=-cos($angle_rad)*($width-$x1)+$y1;
|
}
|
|
//Voilà  enfin le moment de tracer cette fameuse droite !!
|
|
imageline($im, $x1, $y1, $x2, $y2, $col);
|
|
//et voilà  le moment de retourner le résultat
|
|
$resultat=array("x"=>$x2, "y"=>$y2);
|
|
return $resultat;
|
}
|
|
?>
|
|
|