Inspiro 2

PhDr. Mgr. Jeronym Klimes, Ph.D. 2015-01-11

http://klimes.mysteria.cz

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.



x - obrázku [pix]:

y - obrázku [pix]:

Pozadí R G B [0-255] 3×255=bílá; 3×0=černá

Popředí R G B

n-úhelník nebo n-cípá hvězda

Vykrelit hvězdu? Ano Ne

Vykrelit hroty? Ano Ne

Vykrelit obvod? Ano Ne

Poloměr velkého kola (r1):

Elipsa [%] x    y 100=kolo

Výstup do souboru background2.htm


<?php


if ($vypis!=1Header("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($pic255255255);
    
$cRandom     =ImageColorAllocate($picrand(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); 

?>