Autor Zpráva
hary28
Profil
Ahoj, mám takový problém. Mám síť jako je třeba u piškvorek, 1 pole = 1m2. Mám souřadnice zaškrtnutých polí, ale nevím, jak z těchto souřadnic vypočítat obvod a plochu obrazce.

Díky za jakékoliv rady, postupy či nápady
graph
Profil *
A ty souradnice jsou zadany kookretne jak? zapoj trochu matematiky a samotny skript pak nebude tezke napsat...
Jozin
Profil
hary28:
Zdravím,

tak pokud je to pole, tak co třeba procházet buňku po buňce, pokud je vyplněna, tak do proměnné $plocha přičtu jedna. Pak zkusím všechny strany čtverce jakožto jestli okolo něj je nějaký další vyplněn a podle toho přičtu 1 do obvodu.

Pro pochopení jen nástřel:
<?php
//prochazeni pole nebudu psat
if($pole[$y][$x] != 'x') continue; //x = vyplněno
$plocha++;
if($pole[$y-1][$x] != 'x') $obvod++;
if($pole[$y+1][$x] != 'x') $obvod++;
if($pole[$y][$x-1] != 'x') $obvod++;
if($pole[$y][$x+1] != 'x') $obvod++;


nějak tak... neopisuj to přesně, psal jsem to jen na pochopení logiky toho, jak to myslím.
o_O
Profil
Dejme tomu, že máš pole se souřadnicemi [$y][$x], v kterých 0 = nevyplněno, 1 = vyplněno:
$p[0][0]=0;	$p[0][1]=0;	$p[0][2]=0;	$p[0][3]=0;	$p[0][4]=0;
$p[1][0]=0;	$p[1][1]=1;	$p[1][2]=1;	$p[1][3]=1;	$p[1][4]=0;
$p[2][0]=0;	$p[2][1]=1;	$p[2][2]=0;	$p[2][3]=1;	$p[2][4]=0;
$p[3][0]=0;	$p[3][1]=1;	$p[3][2]=1;	$p[3][3]=1;	$p[3][4]=0;
$p[4][0]=0;	$p[4][1]=0;	$p[4][2]=0;	$p[4][3]=0;	$p[4][4]=0;


Pro obvod musíš počítat tak, jak vysvětluje Jozin.
$obvod=0;$obsah=0;
echo '<table>';
for($y=0;$y<5;$y++){
  echo '<tr>';
  for($x=0;$x<5;$x++){
    echo '<td'.($p[$y][$x]==1 ? ' class="u"':'').'>'.$y.'|'.$x.'</td>';
    if($p[$y][$x]==1){
      $obsah++; // Políčko je vyplněno, můžeme přičíst 1.
      if($p[$y-1][$x]==0)$obvod++; // je nahoře něco?
      if($p[$y+1][$x]==0)$obvod++; // je dole něco?
      if($p[$y][$x-1]==0)$obvod++; // je nalevo něco?
      if($p[$y][$x+1]==0)$obvod++; // je napravo něco?
    }
  }
  echo '</tr>'."\n";
}
echo '</table>';


Tímto pak získáš požadované údaje - $obsah a $obvod.
o_O
Profil
Jozin:
if($pole[$y][$x] != 'x') continue; //x = vyplněno
V tom případě x musí být nevyplněno, nebo Vám falíruje podmínka :-)

Jelikož toto znamená pokud $pole[$y][$x] není vyplněno -> pokračuj;
hary28
Profil
díky za vaše nápady, ale to co tu o_O se mi zdá, že by nefungovalo třeba na tento můj případ



nebo se mýlím a fungovalo by to i na tento obrazec.

Ten obrazec může vypadat jakkoliv a také může být různě tvarovaný.

Dal by se obsah vypočítat pomocí L´Huillierových vzorců?
o_O
Profil
hary28:
nebo se mýlím a fungovalo by to i na tento obrazec.
Mýlíte. Můj kód počítá s čímkoliv krom rámečku (tzn. v případě, že bude na boku, bude se PHP snažit nalézt pozici vedle něj která nebude existovat a bude vracet chyby. To se dá samozřejmě vyřešit tak, že obrazce nebudete vkládat na bok, nebo prostě jeden rámeček uděláte nepoužitelný.

Ovšem pozor: Obvod se počítá jak na vnitřní tak i na vnější straně, tzn. v případě, že dodáte nevyplněný čtverec, obvod bude větší, než má.

Příklad:
[img]http://img.fileup.cz/?di=213107270732[/img]
-> Obvod bude 24 - 4 na každé straně zvenčí, 2 na každé straně uvnitř. To dává 16+8 (24)
Ovšem tento:
[img]http://img.fileup.cz/?di=713107273015[/img]
Již bude vypisovat správný obvod - 16.

Co se týče "nespojení":
[img]http://img.fileup.cz/?di=3131072742111[/img]
Bude obvod opět 16 - každý čtverec má 2 nespojené hrany, na bocích to tedy dává dohromady 8 čtverců = 16.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0