Changeset 54964 in spip-zone


Ignore:
Timestamp:
Nov 28, 2011, 8:06:59 PM (8 years ago)
Author:
fredjust@…
Message:

modification de la fonction diag_echecs_hilite_line()
pour tracer de véritables flèches au lieu de simples lignes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/jeux/jeux/diag_echecs_inc.php

    r54669 r54964  
    156156}
    157157
    158 // trace une ligne coloree sur l'echiquier
     158// trace une flèche colorée sur l'echiquier
    159159function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
    160160        global $diag_echecs_globales;
     
    164164        $yori = intval(jeux_config('yori'));
    165165       
    166         // epaisseur de la ligne
     166        // epaisseur de la flèche
    167167        switch($taille) {
    168168                case 35 : $thick = 5; break;
     
    178178       
    179179        if (!$flip) {
    180                 $x1 = round(($diag_echecs_globales['letter2number'][$xfrom]-1)*$taille+$bordure+$taille/2)-1+$xori;
    181                 $y1 = round((8-$yfrom)*$taille+$bordure+$taille/2)-1+$yori;
    182                 $x2 = round(($diag_echecs_globales['letter2number'][$xto]-1)*$taille+$bordure+$taille/2)-1+$xori;
    183                 $y2 = round((8-$yto)*$taille+$bordure+$taille/2)-1+$yori;
     180                $x1 = (($diag_echecs_globales['letter2number'][$xfrom]-1)*$taille+$bordure+$taille/2)-1+$xori;
     181                $y1 = ((8-$yfrom)*$taille+$bordure+$taille/2)-1+$yori;
     182                $x2 = (($diag_echecs_globales['letter2number'][$xto]-1)*$taille+$bordure+$taille/2)-1+$xori;
     183                $y2 = ((8-$yto)*$taille+$bordure+$taille/2)-1+$yori;
    184184        } else {
    185                 $x1 = round((8-$diag_echecs_globales['letter2number'][$xfrom])*$taille+$bordure+$taille/2)-1+$xori;
    186                 $y1 = round(($yfrom-1)*$taille+$bordure+$taille/2)-1+$yori;
    187                 $x2 = round((8-$diag_echecs_globales['letter2number'][$xto])*$taille+$bordure+$taille/2)-1+$xori;
    188                 $y2 = round(($yto-1)*$taille+$bordure+$taille/2)-1+$yori;               
     185                $x1 = ((8-$diag_echecs_globales['letter2number'][$xfrom])*$taille+$bordure+$taille/2)-1+$xori;
     186                $y1 = (($yfrom-1)*$taille+$bordure+$taille/2)-1+$yori;
     187                $x2 = ((8-$diag_echecs_globales['letter2number'][$xto])*$taille+$bordure+$taille/2)-1+$xori;
     188                $y2 = (($yto-1)*$taille+$bordure+$taille/2)-1+$yori;           
    189189        }
    190190 
    191         // cercle aux extremites en attendant une vraie fleche
     191        // cercle au début
    192192        imagefilledellipse($image, $x1,$y1,$thick*2,$thick*2,$hilite_color);   
    193         imagefilledellipse($image, $x2,$y2,$thick*2,$thick*2,$hilite_color);   
    194  
    195     if ($thick == 1)
     193
     194        if ($thick == 1)
    196195        return imageline($image, $x1, $y1, $x2, $y2, $hilite_color);
    197196
    198     $t = round($thick / 2)-1 ;
    199     if ($x1 == $x2 || $y1 == $y2)
    200         return imagefilledrectangle($image, round(min($x1, $x2) - $t), round(min($y1, $y2) - $t), round(max($x1, $x2) + $t), round(max($y1, $y2) + $t), $hilite_color);
    201 
    202         // alors la, bonjour les equations de droites !
    203         $k = ($y2 - $y1) / ($x2 - $x1); //y = kx + q
    204     $a = $t / sqrt(1 + pow($k, 2));
    205         // des que je comprends j'ajoute 3 points pour faire une fleche ;-)
    206     $points = array(
    207         round($x1 - (1+$k)*$a), round($y1 + (1-$k)*$a),
    208         round($x1 - (1-$k)*$a), round($y1 - (1+$k)*$a),
    209         round($x2 + (1+$k)*$a), round($y2 - (1-$k)*$a),         
    210         round($x2 + (1-$k)*$a), round($y2 + (1+$k)*$a)                 
    211     ); 
    212     return imagefilledpolygon($image, $points, 4, $hilite_color);   
     197        $ep=round(2.5*$thick/2); //épaisseur totale de la pointe
     198        $lg=round(5*$thick/2);  //longeur de la pointe
     199    $t=round($thick / 2)-1;      //demi épaisseur de la flèche
     200       
     201    if ($y1 == $y2) {// flèches horizontales
     202                if ($x1 < $x2) {//vers la droite
     203                        $points = array(
     204                                round($x1),round($y1+$t),
     205                                round($x2-$lg),round($y2+$t),
     206                                round($x2-$lg),round($y2+$ep),
     207                                round($x2),round($y2),
     208                                round($x2-$lg),round($y2-$ep),
     209                                round($x2-$lg),round($y2-$t),   
     210                                round($x1),round($y1-$t)
     211                        );                     
     212                        return imagefilledpolygon($image, $points, 7, $hilite_color);   
     213                } else {//vers la gauche
     214                        $points = array(
     215                                round($x1),round($y1+$t),
     216                                round($x2+$lg),round($y2+$t),
     217                                round($x2+$lg),round($y2+$ep),
     218                                round($x2),round($y2),
     219                                round($x2+$lg),round($y2-$ep),
     220                                round($x2+$lg),round($y2-$t),   
     221                                round($x1),round($y1-$t)
     222                        );                     
     223                        return imagefilledpolygon($image, $points, 7, $hilite_color);           
     224                }
     225        }
     226       
     227        if ($x1 == $x2) {// flèches verticales
     228                if ($y1 < $y2) {//vers le bas
     229                        $points = array(
     230                                round($x1-$t),round($y1),
     231                                round($x2-$t),round($y2-$lg),
     232                                round($x2-$ep),round($y2-$lg),
     233                                round($x2),round($y2),
     234                                round($x2+$ep),round($y2-$lg),
     235                                round($x2+$t),round($y2-$lg),
     236                                round($x1+$t),round($y1)
     237                        );                     
     238                        return imagefilledpolygon($image, $points, 7, $hilite_color);   
     239                } else {//vers le haut
     240                        $points = array(
     241                                round($x1-$t),round($y1),
     242                                round($x2-$t),round($y2+$lg),
     243                                round($x2-$ep),round($y2+$lg),
     244                                round($x2),round($y2),
     245                                round($x2+$ep),round($y2+$lg),
     246                                round($x2+$t),round($y2+$lg),
     247                                round($x1+$t),round($y1)
     248                        );                     
     249                        return imagefilledpolygon($image, $points, 7, $hilite_color);   
     250                }
     251        }
     252        //autres flèches
     253        // utilisation des coordonnées polaires
     254        $pi=pi();
     255        $teta=atan(($y2-$y1)/($x2-$x1));
     256        // (x3,y3) est le point intermédiare pour contruire la pointe
     257        if ($x2>$x1) {
     258                $x3=$x2+$lg*cos($teta+$pi);
     259                $y3=$y2+$lg*sin($teta+$pi);
     260        } else {
     261                $x3=$x2-$lg*cos($teta+$pi);
     262                $y3=$y2-$lg*sin($teta+$pi);
     263        }
     264       
     265        $points = array(
     266                round($x1+$t*cos($teta+$pi/2)),round($y1+$t*sin($teta+$pi/2)),
     267                round($x3+$t*cos($teta+$pi/2)),round($y3+$t*sin($teta+$pi/2)),
     268                round($x3+$ep*cos($teta+$pi/2)),round($y3+$ep*sin($teta+$pi/2)),
     269                round($x2),round($y2),
     270                round($x3+$ep*cos($teta-$pi/2)),round($y3+$ep*sin($teta-$pi/2)),
     271                round($x3+$t*cos($teta-$pi/2)),round($y3+$t*sin($teta-$pi/2)),
     272                round($x1+$t*cos($teta-$pi/2)),round($y1+$t*sin($teta-$pi/2))
     273        );                             
     274        return imagefilledpolygon($image, $points, 7, $hilite_color);   
     275       
    213276}
    214277?>
Note: See TracChangeset for help on using the changeset viewer.