Captcha 3d iso & lecture de font console

Description

ceci permet d'afficher un texte en relief sur une map en 3d iso (sur le principe des tilemaps mais sans tile)

pour l'afficher, on utilise une police de fichier de console, ces polices ne sont pas tres difficiles a lire, les 4 premiers octets ne servent a rien, ensuite, un octet code une ligne d'un caractere (un bit a 1 dit qu'il y a un point) 8 octets codent un caractere.

un conseil : le texte a placer ici doit-etre un mot parce-que sinon, la lisibilite sera mauvaise (l'exemple presente ici affiche des caracteres aleatoires et non un mot aleatoire)

demo en ligne ici http://eelte.megami.fr/test.php
explications supplementaires ici : http://eelte.megami.fr/

la meme source mais traduite en python ici : http://www.pythonfrance.com/codes/CAPTCHA-3D-ISOMETRIQUE_47676.aspx (elle n'est pas de moi.)

Source / Exemple :


<?php

define('PI', 3.141592754);

function evoluer(&$val, $i){
	$val-=$i*2;
}

/**

  • @brief renvoie une matrice de hauteurs qui correspond a l'affichage de la chaine de caractere
  • @param $alphabet le contenu du fichier de font
  • @param $chaine la chaine a transposer
  • @param $h la hauteur du texte
  • @param $h2 la hauteur des ondes
  • @param $CANGLE l'angle des vagues
  • @param $CX le coef en X des vagues
  • @param $CY le coef en Y des vagues
  • @param $phy l'ajout dans les cos
  • @return int**
    • /
function getmatrice($alphabet, $chaine, $h=5, $h2=3, $CANGLE=0.055, $CX=0.5, $CY=1, $phy=1){ $limX=16*(strlen($chaine)+1); $a = array_fill(0, $limX, 0); // les deformation en vagues for ($k=0;$k<20;$k++){ for ($i=0;$i<$limX;$i++){ $array[$k][$i]=( cos(($i*$CY+$k*$CX*PI)*$CANGLE +$phy) * sin(($i*$CY+$k*$CX*PI)*$CANGLE +$phy) )*$h2*7; } } $l=strlen($chaine); for ($k=1;$k<=$l;$k++){ for ($i=0;$i<8;$i++){ for ($j=7;$j>=0;$j--){ if (ord($alphabet[$i+4+ord($chaine[$k-1])*8]) & (1<<$j)){ evoluer($array[$i*2+2][$k*16+9-$j*2], $h); evoluer($array[$i*2+3][$k*16+9-$j*2], $h); evoluer($array[$i*2+2][$k*16+10-$j*2], $h); evoluer($array[$i*2+3][$k*16+10-$j*2], $h); } } } } return $array; } function getColor($matrice, $couleur){ return $couleur * (10-$matrice/3)/10; } /**
  • @brief affiche la matrice en 3d isometrique
  • @param $matrice la matrice a afficher
  • @param $image l'image dans laquelle on dessine
  • @param $couleur la couleur des trais
  • @param $white la couleur de fond
  • @param $a l'angle de vue du plan 3d iso
  • @param $dx le "scale" en abscisse
  • @param $dy le "scale" en ordonnee
  • @param $by le decalage en ordonnee
  • /
function iso3dmatrice($matrice, $image, $couleur, $white, $a, $dx=4, $dy=8, $by=10){ $sinA=sin($a); $cosA=cos($a); $limx=count($matrice[0])-1; $limy=count($matrice)-1; for ($y=0;$y<$limy;$y++){ for ($x=1;$x<$limx;$x++){ $a=array( ($x+$y*$cosA)*$dx, $by+$matrice[$y][$x]+($y+$x*$sinA)*$dy, ($x+1+$y*$cosA)*$dx, $by+$matrice[$y+1][$x]+($y+1+$x*$sinA)*$dy, ($x+1+(1+$y)*$cosA)*$dx, $by+$matrice[$y+1][$x+1]+($y+1+($x+1)*$sinA)*$dy, ($x+(1+$y)*$cosA)*$dx, $by+$matrice[$y][$x+1]+($y+($x+1)*$sinA)*$dy ); imagefilledpolygon( $image, $a,4, 0xffffff ); imagepolygon( $image, $a,4, $couleur ); } } } /**
  • @brief sert a avoir une chaine aleatoire
  • @return une chaine de 5 caracteres aleatoires
  • /
function randSTR(){ $alphabet=strtoupper('bcdefghjklmnpqstuvwxyz'); $out=''; $l=strlen($alphabet)-1; for ($i=0;$i<5;$i++){ $out.=$alphabet[mt_rand(0, $l)]; } return $out; } $txt=randstr(); $rand=mt_rand(0, 0x00FFFF); // VOUS DEVEZ INSERER ICI VOTRE CODE D'ENREGISTREMENT DE $txt et $rand EN SESSION. // on decompose rand en 6 rands ayant pour valeurs, des valeurs comprises entre 0 et 3 (sur 2 bits donc) $rand1=($rand & 0x000003); // ----0011 3 $rand2=($rand & 0x00000C) >> 2 ; // ----1100 12 -> C $rand3=($rand & 0x000030) >> 4 ; // 0011---- $rand4=($rand & 0x0000C0) >> 6 ; // 1100---- $rand5=($rand & 0x000300) >> 8 ; $rand6=($rand & 0x000C00) >> 10; define ('DX', 63 * strlen($txt)); define ('DY', 250); $img=imageCreateTrueColor(DX, DY); $white = imagecolorallocate($img, 255, 255, 255); imagecolortransparent($img, $white); $black = imagecolorallocate($img, 0, 0, 255); imagefilledrectangle($img, 0, 0, DX, DY, $white); $alphabet=file_get_contents('alt-8x8.psf'); if (isset($rand)) $matrice=getmatrice($alphabet, $txt, 3+5/($rand1+1), ($rand2+2), $CANGLE=0.1/($rand3/3+3), ($rand4+3)/5, ($rand5+10)/6, PI*2/($rand1+1)); else{ $matrice=getmatrice($alphabet, $txt); $rand1=1; } iso3dmatrice($matrice, $img, $black, $white, PI/200*($rand1+2),3,5,20); if (isset($_GET['resizeX']) && isset($_GET['resizeY'])){ $b=imageCreateTrueColor($_GET['resizeX'], $_GET['resizeY']); $white = imagecolorallocate($b, 255, 255, 255); imagecolortransparent($b, $white); imagefilledrectangle($b, 0, 0, $_GET['resizeX'], $_GET['resizeY'], $white); imageCopyResized($b, $img, 0, 0, 0, 0, $_GET['resizeX'], $_GET['resizeY'], DX, DY); $img=$b; } header('content-type:image/png'); imagepng($img); ?>

Conclusion :


l'accessibilite est reduite car certaines personnes ne peuvent pas lire les reliefs

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.