Orientované hrany - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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);
?>

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: