Toto je druhá varianta hry Inspiro, která kreslí mnohoúhelníky a hvězdičky.
Časem jsem naprogramoval ještě
jiné varianty.
Pokud byste měli zájem o zdrojové soubory, není problém zaslat. Je to pár řádek v polárních souřadnicích.
Jak se kreslí hvězdičky na papír.
Nejprve si nakreslíte/nenakreslíte pomyslný kruh a v něm tři body do tvaru A či obráceného V.
Potom po stranách přikreslíte jednu/dvě/tři tečky, podle toho kolikaúhelník chcete.
Nakonec kreslíte obrácená večka pro každé dva sousední body, až Vám vznikne hvězdička. Pomyslný kruh a tečky si odmyslíte či vygumujete. Hvězdičku obtáhnete.
Takto vznikají hvězdy s lichým počtem vrcholů. U sudých je to zajímavější. Tam jsou to buď takové hvězdy tažené jednou souvislou čarou, nebo jsou to dvě symetrické lichohvězdičky vzájemně pootočené kolem středu. To je případ známé Davidovy hvězdy, popřípadě následující hvězdy s osmi vrcholy.
Hodnoty, které nenastavíte, určí počítač náhodně. Vyzkoušejte klávesu F5 - reload.
<?php
if ($vypis!=1) Header("Content-type: image/png");
//toto dela n-uhelniky s hvezcikou
if ($nuhelnik=="") $n=rand(3,25); else $n=$nuhelnik;
if (($obvod+$hroty+$hvezda+$obrys)==0)
{
switch (rand(1,4))
{
case 1:
$obvod=1; break;
case 2:
$obrys=1; break;
case 3:
$hvezda=1; break;
case 4:
$hroty=1; break;
}
}
if ($hroty=="") $hroty=rand(0,1);
// if ($obvod=="") $obvod=rand(0,1);
// if ($obrys=="") $obrys=rand(0,1);
// if ($hvezda=="") $hvezda=rand(0,1);
// if (($obvod+$hroty+$hvezda+$obrys)==0) $hroty=1;
if ($pozadir=="") $pozadir=255;
if ($pozadig=="") $pozadig=255;
if ($pozadib=="") $pozadib=255;
if ($popredir=="") $popredir=0;
if ($popredig=="") $popredig=0;
if ($popredib=="") $popredib=0;
if ($velikosthrotu=="") $velikosthrotu=rand(3,12);
//barvahrotu viz nize u alokace barev
if ($picWidth=="") $picWidth = 400;//round(400*$pomerx);
if ($picHeight=="") $picHeight = 400;//round(400*$pomery);
$xbase = $picWidth / 2;
$ybase = $picHeight / 2;
$mala = min($xbase,$ybase);
$uhel = array($n);
$bodx = array($n);
$body = array($n);
if ($pomer =="") $pomerx=round(rand(20,100))/100; else $pomerx=$pomer/100;
if ($pomer =="") $pomery=round(rand(20,100))/100; else $pomery=$pomer/100;
if ($elipsa =="") $elipsa=rand(0,1);
if ($elipsa ==1) $pomery=1; else $pomerx=1;
//$pomerx=1;
//$pomery=1;
$pic =ImageCreate($picWidth+1,$picHeight+1);
$cPozadi =ImageColorAllocate($pic,$pozadir,$pozadig,$pozadib); //pozadi
$cPopredi =ImageColorAllocate($pic,$popredir,$popredig,$popredib); //popredi
$cRed =ImageColorAllocate($pic,255,0,0);
$cGreen =ImageColorAllocate($pic,0,255,0);
$cBlue =ImageColorAllocate($pic,0,0,255);
$cYellow =ImageColorAllocate($pic,255,255,0);
$cWhite =ImageColorAllocate($pic, 255, 255, 255);
$cRandom =ImageColorAllocate($pic, rand(0,255), rand(0,255), rand(0,255));
if ($barvahrotu=="") $barvahrotu=$cRandom;
function mezibodxy($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4,&$mezibodxx,&$mezibodyy)
{
//tezko hledat slozitejsi zpusob vypoctu nez tento analyticky.
//Nejjednodussi je viz n-uhelnik posunout ho o polovinu zubu a udelat mezibody se zvolenym polomerem
if ($x1!=$x2)
{
$a12=($y1-$y2)/($x1-$x2); //parametry prvni primky
$b12=$y1-$a12*$x1;
}
else
{
$mezibodxx=$x1;
$svislice="12";
}
if ($x3 != $x4)
{
$a34=($y3-$y4)/($x3-$x4); //parametry druhe primky
$b34=$y3-$a34*$x3;
}
else
{
$mezibodxx=$x3;
$svislice="34";
}
if ($svislice == "")
{
$mezibodxx = -($b12-$b34)/($a12-$a34);
$mezibodyy = $mezibodxx*$a12 + $b12;
}
else
{
if ($svislice == "12") $mezibodyy = $mezibodxx*$a34 + $b34;
if ($svislice == "34") $mezibodyy = $mezibodxx*$a12 + $b12;
//neřeší případ, že by to byly obě svislice
}
} //konec funkce
if ($r1=="")
{
$volnaruka=rand(0,1);
$r1=rand(1, $mala); //vnější obvod
}
$pomerr=$mala/(abs($r1));
if ($volnaruka) $pomerr=1; //hausnumera
$r1 = $r1 * $pomerr;
//vyplni array body n-uhelnika
for ($i=0;$i<$n;$i++)
{
$uhel[$i] = $i*2*pi()/$n; //uhel ve kterem jsou body od stredu
$bodx[$i] = round($xbase + cos($uhel[$i])*$r1*$pomerx); //x souradnice bodu
$body[$i] = round($ybase + sin($uhel[$i])*$r1*$pomery); // y souradnice bodu
if ($vypis==1) echo "$i,_ $bodx[$i], $body[$i] <br>\n";
}
//u vsech vykresli n-uhelnik
if ($obvod)
{
for ($i=0;$i<($n-1);$i++)
{
imageline($pic, $bodx[$i], $body[$i], $bodx[$i+1], $body[$i+1],1);
// imagesetpixel ($pic, $nx,$ny , 1);
}
imageline($pic, $bodx[$n-1], $body[$n-1], $bodx[0], $body[0],1);
}
if ($obrys && ($n>4))
{
if (1&$n) //test zdaliz je $n sude nebo liche
{
$krokmaly=floor($n/2); //liche
$krokvelky=$krokmaly + 1; //liche
}
else
{
$krokmaly=($n/2)-1; //sude;
$krokvelky=($n/2)+1; //sude;
}
//spocita cisla bodu, ktere tvori protinajici primky. Je to bod n a predchozi a k nim protilehle body
for ($i=0;$i<($n);$i++)
{
$protejsii=$i+$krokmaly;
if ($protejsii>($n-1)) $protejsii=$protejsii-$n;
$j=$i+1; //j je nasledujici bod po i
if ($j==$n) $j=0;
$protejsij=$j+$krokvelky;
if ($protejsij>($n-1)) $protejsij=$protejsij-$n;
// $k=$i+1; //k je následující po i
// if ($k==$n) $k=0;
if ($vypis==1) echo "$n ($i $protejsii) ($j $protejsij) $k; <br>\n";
// function mezibodxy($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4)
// mezibodxy($bodx[$i], $body[$i], $bodx[$protejsii], $body[$protejsii], $bodx[$j], $body[$j], $bodx[$protejsij], $body[$protejsij],$mezibodxx,$mezibodyy);
mezibodxy($bodx[$i], $body[$i], $bodx[$protejsii], $body[$protejsii], $bodx[$j], $body[$j], $bodx[$protejsij], $body[$protejsij], $mezibodx[$i], $mezibody[$i]);
if ($vypis==1) echo "$bodx[$i], $body[$i], $bodx[$protejsii], $body[$protejsii],_ $bodx[$j], $body[$j], $bodx[$protejsij], $body[$protejsij],_ $mezibodx[$i], $mezibody[$i]) <br>";
// $mezibodx[$i]=$mezibodxx;
// $mezibody[$i]=$mezibodyy;
imageline($pic, $bodx[$i], $body[$i], $mezibodx[$i], $mezibody[$i],1);
imageline($pic, $mezibodx[$i], $mezibody[$i], $bodx[$j], $body[$j],1);
}
}
//u lichych vykresli celou hvezdicku
if ((1&$n)*$hvezda)
{
$krok=floor($n/2);
$stary=0;
for ($i=0;$i<$n;$i++)
{
$novy=$stary+$krok;
if ($novy>($n-1)) $novy=$novy-$n;
imageline($pic, $bodx[$stary], $body[$stary], $bodx[$novy], $body[$novy],1);
// imagesetpixel ($pic, $nx, $ny , 1);
$stary=$novy;
}
}
//u sudych vykresli hvezdicku
else
{
if ($hvezda)
{
$krok=($n/2)-1;
$stary=0;
for ($i=0;$i<$n;$i++)
{
$novy=$i+$krok;
if ($novy>($n-1)) $novy=$novy-$n;
imageline($pic, $bodx[$i], $body[$i], $bodx[$novy], $body[$novy],1);
// imagesetpixel ($pic, $nx,$ny , 1);
$stary=$novy;
}
}
}
// dodela bile tecky
if ($hroty)
{
for ($i=0;$i<$n;$i++)
{
// imagearc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color )
// imagearc ( $pic , $bodx[$i],$body[$i] , 5 , 5 , 0 , 360 , $cRed );
// imageellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color )
imagefilledellipse ( $pic , $bodx[$i],$body[$i] , $velikosthrotu , $velikosthrotu , $barvahrotu);
// imagesetpixel ($pic, $bodx[$i],$body[$i] , $cRed);
// imagesetpixel ($pic, $bodx[$i],$body[$i] , $cYellow);
}
}
if ($vystup==1):
$f = fopen("background2.htm", "w");
$promenne="picWidth=".$picWidth."&picHeight=".$picHeight."&pozadir=".$pozadir."&pozadig=".$pozadig."&pozadib=".$pozadib."&popredir=".$popredir."&popredig=".$popredig."&popredib=".$popredib."&pomer=".$pomer."&elipsa=".$elipsa."&r1=".$r1."&nuhelnik=".$nuhelnik."&obvod=".$obvod."&hroty=".$hroty."&hvezda=".$hvezda."&velikosthrotu=".$velikosthrotu;
fputs($f, "<html><body>");
fputs($f, "<a href=inspiro2.php?".$promenne.">hodnoty vlozit do formulare inspiro2.php</a><br>");
fputs($f, "<a href=background2.php?".$promenne.">ulozene hodnoty z background2.php</a><br>");
fputs($f, $promenne);
fputs($f, "</body></html>");
fclose($f);
endif;
Imagepng($pic);
ImageDestroy($pic);
?>