Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
Orientované hrany
3. května 2000, 00.00 | Následující tip ukáže jak v PHP vykreslit orientované hrany, tj. čáry zakončené šipkou.
Následující tip ukáže jak v PHP vykreslit orientované hrany, tj. hrany zakončené šipkou.
PHP má poměrně dobrou podporu pro práci s grafikou. Dokáže kreslit čáry, základní geometrické útvary, text ap.
Speciálně u čar lze ale kreslit pouze základní tloušťkou (ostatní můžete obejít vyplněným obdélníkem), případně čárou přerušovanou. Vše ostatní si musíte doprogramovat sami.
Jak tedy vykreslit orientovanou hranu?
(viz ukázka funkce níže a ukázkový kód použití)
- Základem je vykreslení klasické čáry.
- Poté propočtení souřadnic pro zakončení šipky. Není to nic složitého, základní goniometrické funkce.
- Vypočtené souřadnice jsou relativní a lze je použít na obou stranách čáry.
- Případně použijeme vyplněnou šipku. Zde voláme funkci ImageFilledPolygon, kde jedním parametrem je seznam předem vypočtených bodů.
Výsledkem je funkce, která umí navíc od klasické Imageline(): klasickou šipku na jedné nebo obou stranách, vyplněnou šipku. Doplňkem je pak nastavení velikosti šipky: délky a výšky.
Fuknce a ukázka použití
function sign($x)
{
return $x>0?1:-1;
}
function Imagemyline($im, $x1, $y1, $x2, $y2, $col,
$end=0, $fill=0, $off=5, $off1=5)
/*
im .. kam se ma kreslit
x1,y1 .. souradnice pocatku
x2,y2 .. souradnice konce
col .. jakou barvou
end .. jak ukoncit:
0 -> normalne
1 -> sipka na konci
2 -> sipka na zacatku
3 -> sipka na obou stranach
fill .. ma byt vyplnena?
off .. delka sipky
off1 .. vyska sipky
(c) 2000
*/
{
/* 1. zaklad, vykreslime pouze caru
(tj. totez co normalni Imageline) */
Imageline($im, $x1, $y1, $x2, $y2, $col);
/* 2. vypocet pozice sipky */
if($end)
{
$sa=sign($x2-$x1);
$sb=sign($y2-$y1);
$a=Abs($x2-$x1);
$b=Abs($y2-$y1);
$c=Sqrt($a*$a+$b*$b);
$alfa=Asin($b/$c);
$beta=M_PI/2-$alfa;
$x=sqrt($off*$off + $off1*off1);
$uhel=ATan($off1/$off);
$delta=$alfa-$uhel;
$dx1=round($x*Cos($delta));
$dy1=round($x*Sin($delta));
$delta=$beta - $uhel;
$dx2=round($x*Sin($delta));
$dy2=round($x*Cos($delta));
}
/* 3. sipka na konci */
if($end==1||$end==3) {
if(!$fill) {
/* klasicka sipka */
Imageline($im, $x2, $y2, $x2-$sa*$dx1, $y2-$sb*$dy1, $col);
Imageline($im, $x2, $y2, $x2-$sa*$dx2, $y2-$sb*$dy2, $col);
}
else
/* plna sipka */
ImageFilledPolygon($im,array($x2,$y2,$x2-$sa*$dx1,$y2-$sb*$dy1,
$x2-$sa*$dx2,$y2-$sb*$dy2),3,$col);
}
/* 4.sipka na zacatku */
if($end==2||$end==3) {
if(!$fill) {
Imageline($im, $x1, $y1, $x1+$sa*$dx1, $y1+$sb*$dy1, $col);
Imageline($im, $x1, $y1, $x1+$sa*$dx2, $y1+$sb*$dy2, $col);
}
else
ImageFilledPolygon($im,array($x1,$y1,$x1+$sa*$dx1,$y1+$sb*$dy1,
$x1+$sa*$dx2,$y1+$sb*$dy2),3,$col);
}
}
$imgy=$imgx=300;
$img=imagecreate($imgx,$imgy);
$bg=ImageColorAllocate($img, 255,255,255);
Imagefill($img,0,0,$bg);
$col=ImageColorAllocate($img, 0,0,0);
/* pouziti nove funkce */
Imagemyline($img, 10,100, 280,240,$col,1,0,20,10);
Imagemyline($img, 10,50, 280,50,$col,3,1,20);
Imagemyline($img, 100,50, 100,290,$col,1,0,20);
/* vypis obrazku */
Header("Content-type: image/gif");
Imagegif($img);
ImageDestroy($img);
?>
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007