Skocz do zawartości

Sprawdzenie czy siatka jest pusta


Makary155

Rekomendowane odpowiedzi

Napisałem skrypt który generuje mi wysepkę:

1sdz40.png

 

<?php

header("Content-Type: image/png");
$w=500;
$h=400;
$obraz=imagecreatetruecolor($w,$h);

$bg=imagecolorallocate($obraz,200,200,200);
imagefill($obraz,1,1,$bg);
imagecolortransparent($obraz,$bg);
$red=imagecolorallocate($obraz,255,0,0);
$black=imagecolorallocate($obraz,0,0,0);
$green=imagecolorallocatealpha($obraz,0,255,0,60);

$x=20;
$y=0;
$old_x=rand(20,40);
$old_y=rand(20,40);
$start_x=$old_x;
$start_y=$old_y;
for ($i=$old_y; $i<=$h-20; $i=$i+5)
{
    $add=rand(-5,5);
    if ($x + $add < 10)
    {
        $add=-$add;
    }
    $x+=$add;
    
    
    imageline($obraz,$old_x,$old_y,$x,$i, $black);
    $old_x=$x;
    $old_y=$i;
    
}
$y=$old_y;

for ($i=$old_x; $i<=$w-20; $i=$i+5)
{
    $add=rand(-5,5);
    if ($y + $add > $h-20)
    {
        $add=-$add;
    }
    $y+=$add;
    
    
    imageline($obraz,$old_x,$old_y,$i,$y, $black);
    $old_x=$i;
    $old_y=$y;
}
$x=$old_x;
for ($i=$old_y; $i>=20; $i=$i-5)
{
    $add=rand(-5,5);
    if ($x + $add > $w-20)
    {
        $add=-$add;
    }
    $x+=$add;
    
    
    imageline($obraz,$old_x,$old_y,$x,$i, $black);
    $old_x=$x;
    $old_y=$i;
}
$y=$old_y;
for ($i=$old_x; $i>=30; $i=$i-5)
{
    $add=rand(-5,5);
    if ($y + $add < 20)
    {
        $add=-$add;
    }
    $y+=$add;
    
    
    imageline($obraz,$old_x,$old_y,$i,$y, $black);
    $old_x=$i;
    $old_y=$y;
}
imageline($obraz,$old_x,$old_y,$start_x,$start_y,$black);
imagefill($obraz,$w/2,$h/2, $green);
for ($i=50; $i<=$w; $i=$i+50)
{
    imageline($obraz,$i,0,$i,$h,$red);
}
for ($i=50; $i<=$h; $i=$i+50)
{
    imageline($obraz,0,$i,$w,$i,$red);
}
imagerectangle($obraz,1,1,$w-1,$h-1,$red);
imagepng($obraz);
imagedestroy($obraz);

?>

 

Jak teraz sprawdzić która kratka jest "pusta" tzn jej środek nie zawiera się w zielonym kolorze? Siatka jest 50x50px

Odnośnik do komentarza
Udostępnij na innych stronach

<?php

function isImageEmpty( $image, $width = null, $height = null, $startx = 0, $starty = 0 )
{
    if( !$width )
        $width = imagesx( $image );
    
    if( !$height )
        $height = imagesy( $image );
    
    $empty = true;
    
    for( $x = $startx; $x <= $width; $x++ )
    {
        for( $y = $starty; $y <= $height; $y++ )
        {
            $rgba = imagecolorat( $image, $x, $y );
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            $a = ($rgba & 0x7F000000) >> 24;
            
            if( $a < 0xFF )
            {
                $empty = false;
                $x = $y = max($width, $height)+1; //taki break :D
            }
        }
    }
}

//$x - jest to iloraz szerokości obrazka i szerokości bloku
//$y - analogicznie
function isBlockEmpty( $image, $x, $y, $a = 49 )
{
    return isImageEmpty( $image, $x * $a + $a, $y * $a + $a, $x * $a, $y * $a );
}

//sam sobie pozamieniaj wartość 49
//pamiętaj, że masz na swoim obrazku w pizdu syfu, który będzie przeszkadzał (margines i linie), jeśli koniecznie chcesz z tym liniami, to sobie sam dorób zią!
//nie sprawdzane

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, nawet jeśli nie zadziała to już sobie sam poprawię. Linie zawsze mogę dać jako osobną warstwę - tutaj dałem je żeby było wiadomo, o co chodzi.

 

Btw, jeśli dam

imagecolortransparent($obraz,$zielony);

To imagecolorat dalej będzie zwracał zielony?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...