Autor | Zpráva | ||
---|---|---|---|
hary28 Profil |
#1 · Zasláno: 14. 7. 2011, 19:59:21
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 * |
#2 · Zasláno: 15. 7. 2011, 10:45:48
A ty souradnice jsou zadany kookretne jak? zapoj trochu matematiky a samotny skript pak nebude tezke napsat...
|
||
Jozin Profil |
#3 · Zasláno: 15. 7. 2011, 11:17:29
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 |
#4 · Zasláno: 15. 7. 2011, 11:42:44
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 |
#5 · Zasláno: 15. 7. 2011, 11:51:39
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 |
#6 · Zasláno: 15. 7. 2011, 11:54:28
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 |
#7 · Zasláno: 15. 7. 2011, 15:35:08
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. |
||
Časová prodleva: 13 let
|
0