Autor Zpráva
leonid
Profil
Dobry vecer,

poptavam php script pro vypocet souradnic objektu. Objekt se sklada ze ctvercu 10x10 a ctverce spolu sdileji vzdy alespon jednu celou stenou. Razeni je pouze ve 4 smerech. Vstupni udaje jsou v poli prikl.1:

$array=(10,0,20,0,10,10,20,10,30,10,20,20,20,30,10,30);


Toto je objekt z pole v prikladu:

0110
0111
0010
0110

Pole seradim do multidimensionalniho pole, ve kterem je prvni pole vzdy hodnota souradnic nahore nalevo.

$multiarray[0][0] je souradnice x
$multiarray[0][1] je souradnice y

V tomto pripade x=10;y=0

Jeste dalsi jednoduchy priklad2:

Vstupni pole:

$array(10,0,20,0)


prvni ctverec je tedy:
x=10;y=0

druhy ctverec:
x=20;y=0

Pozadovany vystup:

$coords=(10,0,30,0,30,10,10,10)


Samozrejme script musi zvladnout jakkoli slozity objekt v ramci popsanych pravidel, i takzvaneho hada, kdy se oba konce dotykaji rohem.


Ano, pochopili jste spravne, potrebuji mit na vystupu souradnice x,y obvodu objektu po smeru hodinovych rucicek, pricemz znam pouze souradnice ctvercu o rozmerech 10x10 (levy horni roh) a jsou mi zname souradnice prvniho ctverce. Ctverce spolu vzdy sdili alespon jednu celou stenu.


Vzhledem k tomu, ze nejsem schopen ten zk.... algoritmus dat ani po trech dnech dohromady, hledam profika co si s tim poradi. Navrhnete prosim cenu.

Leonid

p.s. kdo si mysli ze je to trivialni uloha.. take jsem si to myslel :)

Moderátor Mistr: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou. Dále Tě žádám, podobně jako kolega TomášK, o doplnění kontaktu. To totiž vyžadují pravidla této sekce.
TomášK
Profil
Chybí kontakt. Přijde mi, že algoritmus není neproveditelný. Pokud jsi ochoten napsat si to sám, založ si na vlákno v příslušné sekci, popiš, co jsi zkoušel a třeba to dokážem dotáhnout k funkčnímu algoritmu.
leonid
Profil
leonid:
Omlouvám se, doplňuji kontakt:

zalewski99 (a) gmail com

to: tomášK

Počkám jestli se najde někdo, kdo by to udělal za odměnu. Nemám již čas dále experimentovat. Pokud se nikdo nenajde časem vlakno založím.
blablabla
Profil *
prvni ctverec je tedy:
x=10;y=0

druhy ctverec:
x=20;y=0

Pozadovany vystup:

1

$coords=(10,0,30,0,30,10,10,10)


není to náhodou proti směru hodinových ručiček?
leonid
Profil
Jak to myslis? ty dva ctverce tvori ctyri rohy. Prvni roh 10,0 druhy 30,0 treti 30,10 posledni 10,10 to je podle me po smeru..
blablabla
Profil *
možná mi jdou špatně hodiny



čtverec1 10,0
čtverec2 20,0

po směru

první 10,0 - druhý roh 10,10 - třetí 30,10 - čtvrtý 30,0

ručičky jdou do prava, doufam
leonid
Profil
Druhy roh objektu nema souradnice 10,10 nybrz 30,0
blablabla
Profil *
no dobře.. takže proti ručičkam..
blablabla
Profil *
promiň,

takže ta prvotní souřadnice čtverce je levý horní roh...

ok.. já jsem to bral jako spodní levý
Krakatoa
Profil *
Ten obvod jen venkovní? Nebo i vnitřní? To v případě, že to některé části uzavře.
Krakatoa
Profil *
Jedna se mi tedy o tyto případy:
111
101
111
bude:
$coords=(0,0,30,0,30,30,0,30)
nebo nějak vypsat i (10,10,20,10,20,20,10,20)

a co toto?
011
101
111
bude:
$coords=(10,0,30,0,30,30,0,30,0,10,10,10,10,20,20,20,20,10,10,10,10,0)
???
leonid
Profil
Vnitrní čtverce, ktere maji kolem dokola sousedy budem ignorovat - ve všech 8 směrech jako ve tvém prvnim přikladu. Druhý příklad je ten had dotýkající se rohy jak popisuji výše. Souřadnice máš správně jen bez poslednich x,y ty určuje výchozi bod. Shoda prvních x,y a posledních x,y vždy ukončí script.
Krakatoa
Profil *
Algoritmus:

Vstupní údaje rozkouskovat na jednotlivé levé horní rohy a udělat z toho tabulku A (id,název obvodu,číslo čtverce,x,y).
Pomocí tabulky A vytvořit tabulku B (id,název obvodu,číslo čtverce,x1,y1,x2,y2), která bude obsahovat všechny hrany všech čtverců, přičemž první uvedený bod leží vždy vlevo nebo výš.
Udělat tabulku C (id,název obvodu,číslo čtverce,x1,y1,x2,y2,z), která se vytvoří tak, že se vemou jen všechny hrany z tabulky B, které nejsou 2x, ale jsou v tabulce jen jednou.
Tabulka D (id,název obvodu, č. obvodu,číslo souřadnice, x, y)

A začneme:
Z tabulky A vememe bod, který je nejvíc nahoře a následně nejvíc nalevo. A máme první bod. Zanesem do tabulky D souřadnice x a y.
Druhý bod je logicky ten napravo (do tabulky D se ještě nezapisuje). U hrany, tvořenou bodem prvním a druhým, zaneseme do proměnné "z" v tabulce C, že jsme ji už prošli. Uložíme do dočasné proměnné směr (doprava). Otestujeme ještě neprocházené hrany v tabulce C pro hrany ve čtyřech směrech pro bod dvě. Pokud je jen jedna volná hrana, pokračujeme po ní. Pokud víc, zjistíme z tabulky C, jakému čtverci patřila poslední procházená hrana a po volné hraně toho čtverce pokračujeme. Zjistíme směr, pokud je různý jako směr předchozí hrany, tak zaneseme bod do tabulky D jako další bod obvodu. Zaneseme hranu jako prošlou do tabulky C. Takto pokračujeme dokud nenarazíme na bod první.
Na závěr zkontrolujeme, jestli nejsou v tabulce C volné hrany, pokud ano, máme v obrazci nějakou uzavřenou část, pro kterou vytvoříme další obvod stejně jako ten hlavní (je stejný postup). A nasledně kontrolu opakujeme, jestli v obrazci není ještě další uzavřená část.
Na úplný závěr vytvoříme z tabulky D výstup obvodu, popř. i vnitřních, pokud je to potřeba.

:-)
leonid
Profil
TO Krakatoa

Ahoj, dekuji za navr algoritmu. Mel jsem hodne prace a musel jsem projekt dat na par dni k ledu. Nyni mam vyhrazen cely vikend, takze se pokusim jej uvest do praxe.

Vaše odpověď

Mohlo by se hodit

Podělte se prosím o své zkušenosti s touto kategorií Věnujte pozornost pravidlům. Zejména:
• Máte-li zájem o tuto nabídku/poptávku, využijte uvedený kontakt, nepište do diskuse.
• Držte se tématu.
  • Nepoučujte.

Prosím používejte diakritiku a interpunkci.

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

0