Diskuze: pascal - dynamické alokování proměnných


Neaktivní uživatel:24.8.2013 19:48
Dívka se tu vidi málokdy... Alespoň nadšení nezmizelo
Kit:24.8.2013 20:05
Nauč se odsazovat. Dost blbě se to čte.
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
Tady vidíš, že jsi vytvořila dynamickou proměnnou "hlava" a o pár řádek níž jsi ji zlikvidovala tím, že jsi do ní uložila "posuvnik_v_polygonech".
Ahoj Děkuju moc za
přečtení
Pardon, za to odsazování, nějak se to okopírovalo bez toho, tak pokus číslo 2...
Jé, děkuju moc, to je pravda... to by mi tam asi zůstalo alokovaný
prázdný místo bez odkazu... takže jen nevytvářet new (hlava)? Tím, že to
mám jednosměrný spojový seznam, tak potřebuju mít jeden odkaz na začátek
(hlava) a jeden, abycvh mohla pracovat s "aktuálním koncem" (posuvník v
polygonech)... Ale myslím, že v tom není hlavní chyba Myslím, že ten největší problém
je u těch vložených spojových seznamů do toho hlavního, těch, které
obsahují souřadnice bodů
procedure nacti_data (var hlava:Tpolygony);
var punkt: Tbod;
poradove_cislo: integer;
posuvnik_v_polygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
begin
assign (data, 'data.txt');
reset (data);
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;
while not EOF (data) do
begin
posuvnik_v_polygonech^.cislo:=poradove_cislo;
inc (poradove_cislo);
{new (posuvnik_v_polygonech^.info);
posuvnik_v_polygonech^.info^dalsi:=nil;}
posuvnik_v_bodech:=posuvnik_v_polygonech^.info;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;
new (posuvnik_v_bodech^.dalsi);
posuvnik_v_bodech^.dalsi^.dalsi:=nil;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
new (posuvnik_v_polygonech^.dalsi);
posuvnik_v_polygonech^.dalsi^.dalsi:=nil;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
close (data);
end;
Tak nakonec vloženo jako obrázek omluvám se, ale opravdu nevím, jak to sem jinak vložit, snad už je
to přehlednější
)
type Tbod = record
x: real;
y: real;
end;
type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
body = record
souradnice: Tbod;
dalsi:Tbody;
end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony}
polygon = record
cislo: integer;
info: Tbody;
dalsi: Tpolygony;
end;
procedure nacti_data (var hlava:Tpolygony);
var punkt: Tbod;
poradove_cislo: integer;
posuvnik_v_polygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
begin
assign (data, 'data.txt');
reset (data);
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;
while not EOF (data) do
begin
posuvnik_v_polygonech^.cislo:=poradove_cislo;
inc (poradove_cislo);
{new (posuvnik_v_polygonech^.info);
posuvnik_v_polygonech^.info^dalsi:=nil;}
posuvnik_v_bodech:=posuvnik_v_polygonech^.info;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;
new (posuvnik_v_bodech^.dalsi);
posuvnik_v_bodech^.dalsi^.dalsi:=nil;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
new (posuvnik_v_polygonech^.dalsi);
posuvnik_v_polygonech^.dalsi^.dalsi:=nil;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
close (data);
end;
Tak nakonec jsem se doklikala i k normálnímu vložení xD
Kit:24.8.2013 21:14
Ty nevidíš to tlačítko pro vložení zdrojového kódu? Jako obrázek to sem nedávej, s tím nemohu dělat vůbec nic.
Kdybys aspoň měla pro posuvníky pohodlnější názvy Proč tam vlastně máš to slovo
"posuvnik"? Vždycky jsme na takové pomocné proměnné používali "p" nebo
tak nějak.
new(hlava);
hlava^.dalsi:=nil;
posuvnik_v_polygonech:=hlava;
poradove_cislo:=1;
To je jen část úpravy. Ještě se dívám na zbytek.
Kit:24.8.2013 21:21
Ještě si přisadím: Vždycky nás varovali před používáním názvů proměnných: "promenna", "cislo", "retezec", "zaznam" apod. To už je lepší používat názvy "i", "j", "k", "p".
Kit:24.8.2013 21:24
Místo
posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;
stačí jen
posuvnik_v_bodech^.souradnice:=punkt;
Kit:24.8.2013 21:29
Celé by se ti to dělalo mnohem lépe, kdyby sis implementovala datové typy seznam polygonů a seznam bodů. V téhle změti se mi to dost blbě hledá a snadno se v tom udělá chyba. Také máš na konci vždy jeden zbytečný prvek, který vůbec nemusel vzniknout.
Děkuju moc ) já vím,
že to je dost paskvil... studuju matematiku, programování máme spíš
okrajově...
už teď se v
tom přestávám orientovat, možná to i přepíšu, abych to měla
pojmenované výstižněji
) vždycky mi to zkompilovalo, ale hlásí mi to běhové chyby už
před tím
posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;
respektive před
posuvnik_v_bodech^.souradnice:=punkt;
... zkrátka je tam nějaký problém s alokováním začátku toho seznamu
bodů, který je uložen u každého polygonu
Seznam polygonů a seznam bodů? Jako nějak odděleně? Problém je, že já nemám zadané žádné požadavky na vstup, takže tam může být libovolné množství polygonů... tím pádem polygony musím ukládat dynamicky... zárove%n každý polygon může mít libovolný počet vrcholů, takže ty body potřebuju ukládat také dynamicky... nic jiného, než jednosměrný spojový seznam polygonů, kde každý prvek obsahuje odkaz na jednosměrný spojový seznam bodů, mě nenapadá...
Kit:24.8.2013 21:36
Pokud studuješ matematiku, tak vás mají učit jazyky Python nebo Matlab (resp. Octave), které na rozdíl od Pascalu budeš používat a budou ti vyhovovat mnohem víc. Takhle je to pro tebe jen utrpení a nulový přínos.
Jn, ale s tím asi moc nepohnu Dokonce se mi i nějakým zázrakem podařilo udělat zkoušku, jen
musím doklepat zápočet a pak už to nikdy neuvidím
max. jen tak "pro radost" jako
nějaký nepovinný předmět
mně to i vcelku baví, jen to ladění je vždycky oříšek
Kit:24.8.2013 21:40
No právě. Klíčové je to slovo seznam . Je tedy víc než vhodné si vyrobit abstraktní datový typ seznam, který bude umět přidávat položky, mazat položky, zjistit svoji délku apod. To vše bez podobných experimentů s ukazateli. Ty zůstanou uvězněny ve funkcích seznamu a vně nebudou vůbec vidět.
Bohužel nevím, co všechno dnešní Pascal umí. Pokud v něm funguje OOP, mohlo by to řešení být mnohem, mnohem jednodušší, ba i triviální.
Aha, tak to už je nad moje znalosti a schopnosti děkuju moc za rady a opravy,
když tam bude těch chyb míň, tak to třeba najdu
Ještě jednou díky za čas a
hezký večer
Vojtěch Mašek (Woyta):25.8.2013 0:04
Klasický pascal neumí dynamicky přidělovat paměť.
Všechny potřebné proměnné se alokují při spuštění programu v
deklarační části "var".
Kit:25.8.2013 0:14
V tom případě nezbývá nic jiného, než si naimplementovat vlastní ArrayList nebo LinkedList. Při každé manipulaci se seznamem by se mi už nechtělo hrát si s ukazateli jako za pionýrských dob.
V Pascalu jsou ještě dynamicky alokované proměnné přes funkce new() a dispose(). Ovšem je to podobný hard-level jako malloc() v C. Pro mne už to není. Užil jsem si toho dost a nyní se bez toho docela rád obejdu.
David Hartinger:25.8.2013 9:15
Můžeš se inspirovat tímto seznamem v Pascalu: http://mircosoft.mzf.cz/…/SEZNAMY.PAS Jinak se divím, že
se to ještě někde učí, je to muzejní jazyk
Kit:25.8.2013 10:16
Když ten vyučující nic jiného neumí ...
Učit matematiky Pascal je zbytečné, zejména na takových hloupých příkladech. Tím jen získají odpor k programování. Počítač se pro ně stane protivníkem, přitom má být spojencem.
Nejde o vyučujícího...Na MFF se všichni učí Pascal...i informatici
začínají pascalem a pak jdou na jiné programovací jazyky - teorie, že
pascal vzniknul jako výukovej jazyk a snadno se z něj přechází na ostatní
jazyky (prý), protože se v něj člověk nenaučí žádné "chyby"... co
povoluje pascal, povolují všechny ostatní jazyky, né naopak (nemám s čím
porovnávat, jen papouškuju)
Děkuju moc za ten příklad seznamu... s tím celkem nemám problémy,
jenže já pořebuju přesně takovýhle seznam, ale v každé položce seznamu
potřebuju odkaz na další jednosměrný seznam... a když mám v dynamicky
alokované proměnné další dynamicky alokovaný proměnný, tak už nevím,
jak se to píše... respektive myslela jsem si, že vím, ale pořád mi to
hlásí chybu
respektive o prázdninách mi ukradli notebook s (nesmějte se moc) windows
Xp, kde mi fungoval starej borland pascal... teď mám novej noťas, s windows 8
a to už nerozjede... takže to zkouším v lazaru a akorát mi to hlásí
chyby, ale nepíše "CO" se tomu nelíbí, takže jsem z toho mírně zoufalá
Pardon za tento výlev,
musela jsem si postěžovat xD
Kit:25.8.2013 13:05
Nic z toho mi k smíchu nepřipadá.
Ten původní Borland Pascal už nenajdeš?
Pascal byl svého času dobrý programovací jazyk a pro výuku se hodil. Dokonce jsem v něm kdysi dělal i OOP, ale vůbec mi to nešlo. Dnes už je překonán lepšími jazyky, které se pro výuku hodí mnohem lépe a můžeš u nich dokonce i zůstat. Pro programátory je to Java či C#, pro matematiky spíš Python (nativně umí nejen seznamy, ale např. komplexní čísla) a pro práci s maticemi Matlab či Octave.
Posledně jmenované umí nativně násobit nebo invertovat matice, počítat determinanty, řešit soustavy rovnic a vykreslí třeba i výsledné 3D grafy. Tohle by se měli učit matematici používat, tohle je pro ně užitečné.
Ahoj,
** Sehnání BP7 **
jestli jsi z MFF (což předpokládám, že podle příspěvku výše ano) a
máš problém sehnat Borland Pascal 7, měl by se nchaázet na strojích v
počítačových laboratořích. Na Malé Straně je určitě, v karlíně by
mohl být také. Mělo by ho stačit jen zkopírovat k sobě. Myslím, že
žádné další kroky při jeho instalaci nenastávají. V labu na Malé
Straně jsem prakticky každý všední den, takže ti ho můžu případně
sehnat. Ale budeš na něj asi potřebovat virtuální počítač. Resp. ono
existuje i grafické rozhraní pro Windows (bpw.exe myslím), ale nevím, jak
moc dobře funguje, dělal jsem v něm jen jednou.
** Lazarus **
Lazarus by měl pro tvoje potřeby stačit, ale co jsem ho zkoušel před
nějakou dobou, nedosahuje takového komfortu co se týče vývoového
prostředí. Například krokování v něm bylo velmi bolestivé (alespoň mně
probíhalo po jednotlivých instrukcích CPu, což předpokládám, že zažít
nechceš).
Co se týče výukovosti:
Podle mě to myslí tak, že v Pascalu není třeba v základu používat
složitější (a nebezpečnější) věci jako ukazatele či objekty (třídy),
navíc se tam dobře pracuje s řetězci. To znamená, že začátečníci by
neměli být mateni nutností začít hned používat OOP (alespoň trošku),
což je v Javě či C# nemine. Je fakt, že třeba na Ostravské univerzitě se
začíná Javou a první semestr je ta výuka čistě procedurální. Přišlo
mi ale, že to ty lidi dost mate, když tam mají podivné zápisy (volání
metod na objektech, definice třídy), kterým nerozumí, ale potřebují je,
aby mohli programovat procedurálně.
Matlab/Matematicu se, pokud vím, budete učit ve vyšších ročnících. Nejsem na matematice, ale občas na nějaký ten předmět od vás zavítám. O Pythonu/Octave nic nevím. Ono tím programováním v Pascalu nás zřejmě chtějí trochu naučit, jak to všechno funguje na systémové úrovni, což je podle mě dobře. Vím, že ale docela dost studentů (a studentek) potřebuje nějaký čas (popř. lépe podané vysvětlení než na přednáškách/cvičeních), než tyhle věci jako dynamické datové struktury, pochopí (to se týká i informatiků).
Pokud je problém ještě aktuální, tak můžeš někam hodit aktuální verzi zdrojáku a já se na ni podívám.
Kit:25.8.2013 14:06
Práce s řetězci se v Pascalu nějak zlepšila? Vždycky byla děsně nepohodlná, musela se deklarovat maximální délka stringu a už si ani nepamatuji, jak se stringy spojovaly, vyhledávaly substringy apod.
Vojtěch Mašek (Woyta):25.8.2013 14:37
V Turbo Pascalu se s řetězci dělalo celkem dobře, už si nepamatuju ty funkce ale třeba spojování se dělalo operátorem +
Kit:25.8.2013 14:42
Vím, že byl problém s dynamickou délkou stringu, musela se vždy deklarovat maximální délka. Ani nevím, jak je to s podporou Unicode - asi není žádná. Dynamické struktury byly k dispozici jen přes ukazatele, takže na úrovni jazyka C...
Martin Dráb:25.8.2013 14:43
Deklarovat maximální délku nebylo povinné. Pokud tak člověk neudělal, maximální délka byla nastavena na 255 znaků (což je i maximální délka pascalovského řetězce vůbec).
Pro spojování se používal operátor +. Pro vyhledávání substringů lze použít funkci Pos. Asi tam nenajdeš nějaké extra pokročilé funkce pro dělání vylomenin, ale pro výukové účely to určitě stačí, zvláště když jde o algoritmy a ne o programovací jazyk jako takový.
Jasně, C#, Java, C++ apod. mají práci s řetězci také jednoduchou. Ale třeba v proovnáním s C jsou pascalovské řetězce naprosto megasuper.
David Hartinger:25.8.2013 14:44
Koukni se na web člena Mircosoft, mám dojem, že tam má toho Pascala ke stažení. FreePascal funguje jinak a určitě bych to v něm nedělal, protože to potom nemusí fungovat.
Kit:25.8.2013 15:08
To je hrozné, jak se to člověku vykouří z hlavy. A to jsem v Pascalu napsal stovky programů...
255 znaků, už si vzpomínám. Bylo to kvůli tomu, že v prvním bytu byla
délka stringu. Dnes už to moc nevyhovuje, dnešní programátoři jsou schopni
napsat do zdrojáku i delší řádek
Stringy v C jsou horší, navíc nejsou binary-safe. Pokud někdo tuto vlastnost potřebuje, tak se na #0 nespoléhá a udělá to podobně jako v Pascalu, tedy délku samostatně.
Když jsem potřeboval udělat v RAM seznam z řetězců proměnné délky, tak to bylo docela náročné. Implementace slovníku byla i delší než na stránku. Dnes je to součástí programovacích jazyků. Stačí jen použít.
Koukni se na web člena Mircosoft, mám dojem, že tam má toho Pascala ke
stažení. FreePascal funguje jinak a určitě bych to v něm nedělal, protože to
potom nemusí fungovat.
Freepascal by měl být dostatečně kompatibilní s BP, zvláště pokud se zapne režim kompatibility. Myslím, že automatický systém pro vyhodnocování úloh na MFF (CoDex) používá překldač Freepascalu. Gramatika Freepascalu je ale trochu odlišná od BP (některé zdrojáky jdou zkompilovat v BP, ale ne ve FP). Plus je rozdíl v tom, že BP programy běží v "reálném" režimu procesoru, kdežto FP v chráněném (v případě programů pro DOS). Ale to by nemělo být znatelné v případě programování algoritmických úloh.
Stringy v C jsou horší, navíc nejsou binary-safe. Pokud někdo tuto
vlastnost potřebuje, tak se na #0 nespoléhá a udělá to podobně jako v
Pascalu, tedy délku samostatně.
Právě kvůli problémům s s ukončovacím nulovým znakem se třeba ve Windows kernelu většinou používají speciální verze stringů, které jsou definovány strukturou UNICODE_STRING.
typedef struct _LSA_UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;
Jádro exportuje rutiny pro práci s nimi. Samozřejmě to není zrovna procházka růžovým sadem, s takovými řetězci pracovat.
Hm a koukám, že už jsme hodně mimo téma.
haubeltova:25.8.2013 18:37
Ahoj:) Díky moc, to je dobrý nápad, ale nevím, co mají v labech za
operační systém, mně to na těch starejch xp-čkách běželo, teď mám
windows 8, stáhla jsem to asi 10 z různých zdrojů, vždycky zkusila
nainstalovat a nefunguje to... Jj, problém je aktuální, mám naprogramovat
zápočtovej program a nevím, jak to funguje s vloženými spojáky do
spojáku... jakmile mi bude fungovat tahle procedura s načítáním dat, tak
zbytek už bude analogickej, s tím si poradím, ale když nemůžu zjistit v
čem je chyba, jen že mi to nefunguje, tak je to opravování "po slepu"...
včera jsem to znova přepsala, snad už to je lepší, ale nefunguje pořád
type Tbod = record
x: real;
y: real;
type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
body = record
souradnice: Tbod;
dalsi:Tbody;
end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony}
polygon = record
cislo: integer;
info:Tbody;
dalsi: Tpolygony;
end;
procedure nacti_data (var hlava: Tpolygony; var sirka_lesa: real);
var posuvnik_v_polygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
punkt: Tbod;
poradove_cislo: integer;
begin
assign (data, 'data.txt');
reset (data);
{readln (data, sirka_lesa); }
{new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;}
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;
while not EOF (data) do
begin
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
posuvnik_v_polygonech^.cislo:=poradove_cislo;
inc (poradove_cislo);
posuvnik_v_bodech:=posuvnik_v_polygonech^.info;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
while not EOLN (data) do
begin
new (posuvnik_v_bodech);
posuvnik_v_bodech^.dalsi:=nil;
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice:=punkt;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
end;
close (data);
end;
děkuju moc za přečtení
Ještě jednou děkuju moc všem za přečtení a za rady
Ahoj,
assign (data, 'data.txt');
reset (data);
readln (data, sirka_lesa);
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;
Tohle je docela OK. Tento kód v podstatě otevře soubor se vstupními daty, načte šířku lesa (ať je to, co je to) a vytvoří hlavu seznamu polygonů.
Cyklus
while not EOF (data) do
bych trochu přeorganizoval. Tvoje implementace tohoto cyklu aktuálně funguje tak, že nejprve vyžvoří polygon, následně jej (vnitřním while cyklem) naplní. Mluvím o tom, jaká je asi tvoje představa, že by to mělo fungovat.
Předpokládáš, že chceš dělat ten seznam polygonů s hlavou. Přes new() vytvoř novou proměnnou typu Tpolygony, ne ale přes posuvnik_v_polygonech (ten ma odkazovat vždy na poslední prvek seznamu polygonů), ale přes nějakou dočasnou proměnnou, kterou si zavedeš. Jakmile ji inicializuješ (nezapomeň inicializovat i položku info na nil či spíše na hlavu seznamu bodů (kterou případě dynamicky alokuješ)). Jakmile inicializaci této proměnné provedeš, stačí nasměrovat posuvnik_v_bodech na její položku ifno a zařadit ji do seznamu polygonů (za poslední prvek, na který odkazuje posuvnik_v_polygonech). To lze provést třeba takto:
posuvnik_v_bodech := docasna^.info;
posuvnik_v_polygonech^.dalsi := docasna;
posuvnik_v_polygonech := posuvnik_v_polygonech^.dalsi;
Co se týče načítání seznamu bodů, je tato část kódu
new (posuvnik_v_bodech);
posuvnik_v_bodech^.dalsi:=nil;
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice:=punkt;
skoro v pořádku, jen je zase třeba pro vytvoření "instance" bodu použít nějakou dočasnou proměnnou (např docasny_bod), protože proměnná posuvnik_v_bodech má za úkol odkazovat na poslední bod v seznamu bodů, aby do tohoto seznamu bylo možno přidávat (význam je obdobný jako u proměnné posuvnik_v_polygonech). Jakmile jsou souřadnice bodu vyplněny, je třeba tento bod přidat do seznamu, což, pokud má seznam bodů hlavu (viz výše), se provede obdobně jako při přidávání nového polygonu do seznamu, tedy např. takto:
posuvnik_v_bodech^.dalsi := docasny_bod;
posuvnik_v_bodech := posuvnik_v_bodech^.dalsi;
Jakmile ti skončí vnější cyklus, znamená to, že jsi dočetla vstupní soubor na konec řádku. Nevím, zda je to nutné, ale já bych ještě přidal za tento cyklus příkaz, který nastaví pozici ve vstupním souboru na začátek další řádky.
readln(data);
Poznámky
Složitost implementace dost závisí na tom, jaké druh spojových seznamů
použiješ a jaké operace na něm provádíš. Jednosměrné spojové seznamy
výborně fungují, pokud se do nich přidává na začátek (třeba za hlavu,
pokud ji mají). Pokud přidáváš na jejich konec, musíš vždy mít u sebe
odkaz na jejich poslední prvek, kteroužto funkci plní proměnné
posuvnik_v_polygonech a ""posuvnik_v_bodech**, nebo jej
vždy zíískat procházením seznamu od začátku. Pokud bys nové polygony
(resp. body) přidávala na začátek seznamů, posuvníky nebudeš potřebovat.
Na druhou stranu asi tvé algoritmy počítají s tím, že polygony a body v
nich nebudou načteny v opačném pořadí.
Ideální by samozřejmě bylo udělat si nějaké funkce pro vytvoření bodu a polygonu a jejich inicializaci, aby to celé bylo přehlednější. Například nějaké tkaové funkce by kód dost zpřehlednily:
Function VytvorBod(x,y:Integer):TBody;
Function VytvorPolygon(poradove_cislo:Integer):TPolygony;
Procedure VlozPolygon(ZaKoho:TPolygon; CoVlozit:TPolygony);
Procedure VlozBod(ZaKoho:TBody; CoVlozit:TBody);
Nešel jsem ale do toho, protože jsem chtěl, aby kód, co jsi sem dala, se příliš nezměnil, což pro tebe bude méně matoucí.
Samozřejmě by se daly implementovat i obecné rutiny pro práci se spojovými seznamy (často je používám, ale moje oblíbené spojové seznamy jsou obousměrné cyklické s hlavou), ale v Pascalu/Delphi se to neimplementuje úplně snadno (lidsky čitelně). V základu jde o to, že každý záznam, který budeš nějak zařazovat do spojového seznamu, vybavíš položkou
dalsi : TPrvek;
která bude obsahovat odkaz na položku dalsi dalšího záznamu v seznamu. Obecné rutiny pro práci se spojovými seznamy pak budou pracovat použe s těmito položkami dalsi, jinak nebudou záviset na struktuře vkládaných záznamů, nebudou ani vědět, kde se položka dalsi v těch záznamech nachází, z čehož plyne jejich obecnost. Pak může nastat i případ, že jeden záznam těchto položek dalsi (samozřejmě různě pojmenovaných) obsahuje více, což mu dává schopnost býti ve více spojových seznamech zároveň.
nechtěl jsem ale jít touto cestou, protože je buď potřeba ukazatelům dost dobře rozumět a mít je už v krvi, aby vynikla krása tohoto řešení, nebo je to dobré/nutné ukázat na z tužkou papíře a fórum nepovažuji za dostatečně rychlý způsob komunikace na vysvětlení případných nejasností.
Jinak v labu na Malé Straně jsou stále Windows XP, takže tam Borland Pascal 7 bude fungovat. Alespoň když jsem navštěvoval první ročník, bylo tomu tak.
P.S. Vím, že by bylo pro všechny strany snadnější, kdybych sem vyplivl správné řešení přímo jako kód, ale:
- obecně to nedělám rád, ne napoprvé,
- nevím, komu ten zápočtový program budeš ukazovat, ale jeden můj kamarád cvičí matematiky programování v Pascalu a je tu jisté (asi velmi malé) nebezpečí, že by mohl poznat můj styl.
Pardon, dostala jsem se k tomu až teď ) ještě jsem to znovu
přepsala, byly tam chyby asi i v něčem jiném, ale ten readln mi moc pomohl,
děkuju xD už to v pohodě načítá... zkoušela jsem tam ještě přidat
načtení jedný proměnný, ale to z nějakýho záhadnýho důvodu nebere...
ale hlavně, že to načítá ty body, při nejhorším budu mít 2 vstupní
soubory, nebo tu jednu proměnnou načtu z obrazovky... nakonec to vypadá
takhle:
procedure nacti_data (var hlava: Tpolygony; var sirka_lesa:real);
var posuvnik_v_polygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
punkt: Tbod;
poradove_cislo: integer;
begin
assign (data, 'data.txt');
reset (data);
readln (data, sirka_lesa);
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;
while not EOF (data) do
begin
posuvnik_v_polygonech^.cislo:=poradove_cislo;
inc (poradove_cislo);
new (posuvnik_v_bodech);
posuvnik_v_bodech^.dalsi:=nil;
posuvnik_v_polygonech^.info:=posuvnik_v_bodech;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice:=punkt;
new (posuvnik_v_bodech^.dalsi);
posuvnik_v_bodech^.dalsi^.dalsi:=nil;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
readln (data);
new (posuvnik_v_polygonech^.dalsi);
posuvnik_v_polygonech^.dalsi^.dalsi:=nil;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
close (data);
end;
Ještě jednou děkuju moc všem za pomoc )
Kdyžtak ještě ukaž nějaká vstupní soubor, třeba z toho bude poznat, proč se nenačítá šířka lesa.
Tak už to mám nakonec hotové dokonce i uznané to už mám
Děkuju všem za pomoc, ze začátku jsem se v tom vážně plácala
{Zapoctovy program na predmet Programovani II - NPRM045}
{Tema: Cesta mezi polygony}
{Libuse Haubeltová}
program polygony24;
uses Crt;
const vypisy = true; {hodnota true: program vypise na obrazovku jednotlive kroky, false: pouze vystup do souboru}
{***deklarace datovych typu***}
type Tbod = record {bod v rovine jednoznacne urceny x-ovou a y-ovou souradnici}
x: real;
y: real; end;
type Tvektor = record {vektor urceny x-ovou a y-ovou souradnici}
x: real;
y: real; end;
type Tprimka = record {primka urcena koeficienty a,b,c z obecneho tvaru primky z analytické geometrie (ax+by+c=0)}
a: real;
b: real;
c: real; end;
type Tusecka = record {usecka dana pocatecnim a koncovym bodem, na poradi nezalezi}
zac: Tbod;
kon: Tbod; end;
type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
body = record
souradnice: Tbod;
dalsi:Tbody;
end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony, v kazdem polygonu odkaz na lin.spoj.seznam bodu}
polygon = record
cislo: integer;
info:Tbody;
z_info:Tbody;
dalsi: Tpolygony;
end;
{***deklarace globalnich promennych***}
var vstup, vystup, data: text;
hlava: Tpolygony;
sirka_lesa, polomer: real;
projde: boolean;
cislo_nepruchozi, pocet_komponent:integer;
{***procedury pro praci s daty - nacteni dat ze souboru, vypisy***}
procedure priprav_data; {vytvori kopii vstupniho souboru bez nepotrebnych znaku}
var radekvstupu: string;
delkaradku, znak, i: integer;
begin
assign (vstup, 'vstup1.txt');
reset (vstup);
assign (data, 'data.txt');
rewrite (data);
while not EOF (vstup) do
begin
readln (vstup, radekvstupu);
delkaradku:=length(radekvstupu);
for i:=1 to delkaradku do
begin
znak:=ord(radekvstupu[i]);
case znak of
91: ;
59: write (data, ' ');
93: ;
else write (data, chr(znak));
end;
end;
writeln (data);
end;
close (data);
close (vstup);
end;
procedure vypis_polygon (co:Tbody); {vypise seznam bodu celeho polygonu (jejich souradnice)}
var posuvnik_v_bodech:Tbody;
begin
posuvnik_v_bodech:=co;
while posuvnik_v_bodech^.dalsi<>nil do
begin
write ('[', posuvnik_v_bodech^.souradnice.x:4:2, ';', posuvnik_v_bodech^.souradnice.y:4:2, ']', ' ');
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
end;
procedure polygon_do_souboru (co:Tbody); {vypise seznam bodu celeho poFlygonu (jejich souradnice) do souboru}
var posuvnik_v_bodech:Tbody;
begin
posuvnik_v_bodech:=co;
while posuvnik_v_bodech^.dalsi<>nil do
begin
write (vystup, '[');
write (vystup, posuvnik_v_bodech^.souradnice.x:4:2);
write (vystup, ';');
write (vystup, posuvnik_v_bodech^.souradnice.y:4:2);
write (vystup, '] ');
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
writeln (vystup);
end;
procedure vypis_polygony (hlava: Tpolygony); {vypise souradnice bodu vsech polygonu, seznam bodu kazdeho polygonu zvlast na radek}
var posuvnik_v_polygonech: Tpolygony;
begin
if vypisy=true
then begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
vypis_polygon (posuvnik_v_polygonech^.info);
writeln;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
end;
end;
procedure vypis_z_polygony (hlava: Tpolygony); {vypise souradnice vsech polygonu zvetsenych o polomer obra}
var posuvnik_v_polygonech: Tpolygony;
begin
if vypisy=true
then begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
vypis_polygon (posuvnik_v_polygonech^.z_info);
writeln;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
end;
end;
procedure nacti_data (var hlava: Tpolygony; var sirka_lesa: real; var polomer: real); {nacte data z upravene kopie vstupniho souboru}
var zacatek: Tpolygony;
posuvnik_v_bodech: Tbody;
punkt: Tbod;
poradove_cislo: integer;
begin
assign (data, 'data.txt');
reset (data);
readln (data, sirka_lesa);
readln (data, polomer);
new (hlava);
hlava^.dalsi:=nil;
zacatek:=hlava;
poradove_cislo:=1;
while not EOF (data) do
begin
hlava^.cislo:=poradove_cislo;
inc (poradove_cislo);
new (posuvnik_v_bodech);
posuvnik_v_bodech^.dalsi:=nil;
hlava^.info:=posuvnik_v_bodech;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice:=punkt;
new (posuvnik_v_bodech^.dalsi);
posuvnik_v_bodech^.dalsi^.dalsi:=nil;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
readln (data);
new (hlava^.dalsi);
hlava^.dalsi^.dalsi:=nil;
hlava:=hlava^.dalsi;
end;
hlava:=zacatek;
close (data);
if vypisy=true then
begin
writeln ('nacteno ze vstupniho souboru');
vypis_polygony (hlava);
writeln ('sirka lesa= ', sirka_lesa:4:2);
writeln ('polomer kruhového obra= ', polomer:4:2);
end;
end;
{***jednoduche funkce pro zakladni ulohy v rovine z analyticke geometrie***}
function vyrob_vektor (a, b: Tbod): Tvektor; {ze souradnic bodu A,B urci souradnice vektoru ->AB}
begin
vyrob_vektor.x:=b.x-a.x;
vyrob_vektor.y:=b.y-a.y;
end;
function normalovy_vektor (v: Tvektor): Tvektor; {urci normalovy vektor k vektoru ->v}
begin
normalovy_vektor.x:=v.y;
normalovy_vektor.y:= (-1)*v.x;
end;
function opacny_vektor (v: Tvektor): Tvektor; {urci opacny vektor k vektoru ->v}
begin
opacny_vektor.x:=(-1)*v.x;
opacny_vektor.y:=(-1)*v.y;
end;
function velikost_vektoru (v: Tvektor): real; {urci eukleidovskou normu vektoru ->v}
begin
velikost_vektoru:=sqrt (v.x*v.x+v.y*v.y);
end;
function vyrob_vektor_velikosti (v:Tvektor; polomer:real): Tvektor; {z vektoru ->v vyrobi vektor, jehoz eukleidovská norma = polomer, smer zachova}
var k: real;
begin
k:=sqrt((polomer*polomer)/((v.x*v.x)+(v.y*v.y)));
vyrob_vektor_velikosti.x:=v.x*k;
vyrob_vektor_velikosti.y:=v.y*k;
end;
function posun_bod (a: Tbod; v: Tvektor): Tbod; {posune bod A o vektor ->v}
begin
posun_bod.x:=a.x+v.x;
posun_bod.y:=a.y+v.y;
end;
function vzdalenost_bodu (a,b: Tbod): real; {spočítá vzdálenost bodů A,B}
var v: Tvektor;
begin
v:=vyrob_vektor (a,b);
vzdalenost_bodu:=velikost_vektoru(v);
end;
function vyrob_primku (a: Tbod; v: Tvektor):Tprimka; {urci primku z bodu A se smerovym vektorem ->v}
var normal: Tvektor;
begin
normal:=normalovy_vektor(v);
vyrob_primku.a:=normal.x;
vyrob_primku.b:=normal.y;
vyrob_primku.c:=((((normal.x)*(a.x))+((normal.y)*(a.y)))*(-1));
end;
function vyrob_primku_z_bodu (a,b: Tbod):Tprimka; {urci primku prochazejici body A,B}
var vektor: Tvektor;
begin
vektor:=vyrob_vektor (a,b);
vyrob_primku_z_bodu:=vyrob_primku (a,vektor);
end;
function je_bod_napravo_od_primky (a,b,x: Tbod): boolean; {urci, zdali je bod x v polorovině "vpravo" od orientovane usecky AB, nebo v opacne polorovine}
var u, v: Tvektor;
d: real;
begin
u:=vyrob_vektor (A, B);
v:=vyrob_vektor (A, X);
d:=(u.x*v.y)-(u.y*v.x);
if d>0 then je_bod_napravo_od_primky:=false
else je_bod_napravo_od_primky:=true;
end;
function lezi_bod_na_primce (A,B,X:Tbod):boolean; {urci, zdali bod X alezi primce prochazejici body AB}
var primka: Tprimka;
begin
primka:=vyrob_primku_z_bodu (A,B);
if round((primka.a*x.x+primka.b*x.y+primka.c)*10000)/10000=0
then lezi_bod_na_primce:=true
else lezi_bod_na_primce:=false;
end;
function rovnobezky (a,b,c,d: Tbod): boolean; {urci, zdali jsou primky/usecky dane body A,B a C,D rovnobezne}
var u, v: Tvektor;
koeficient: real;
begin
u:=vyrob_vektor (a,b);
v:=vyrob_vektor (c,d);
if (u.x=0) AND (u.y=0) OR (v.x=0) AND (v.y=0)
then begin
rovnobezky:=true;
exit;
end;
if u.x=0
then begin
if v.x=0
then rovnobezky:=true
else rovnobezky:=false;
exit;
end;
if v.x=0
then begin
rovnobezky:=false;
exit;
end;
if u.y=0
then begin
if v.y=0
then rovnobezky:=true
else rovnobezky:=false;
exit;
end;
if v.y=0
then begin
rovnobezky:=false;
exit;
end;
koeficient:=u.x;
u.x:=1;
u.y:=u.y/koeficient;
koeficient:=v.x;
v.x:=1;
v.y:=v.y/koeficient;
if (round (u.y*10000)/10000 = round (v.y*10000)/10000)
then rovnobezky:=true
else rovnobezky:=false;
end;
function urci_prusecik_primek (a,b,c,d :Tbod): Tbod; {urci prusecik ruznobeznych primek, v pripade rovnobezek bez vysledku, napise chybovou hlasku}
var primka1, primka2: Tprimka;
koeficient, y :real;
begin
if rovnobezky (a,b,c,d) = true
then begin
writeln ('!!!Behova chyba, neosetreny prusecik ruznych/totoznych primek/usecek!!!');
exit;
end;
primka1:=vyrob_primku_z_bodu (a,b);
primka2:=vyrob_primku_z_bodu (c,d);
if primka1.a=0
then begin
if (primka2.a)=0 then writeln ('rovnobezky');
if primka1.b=0 then writeln ('ne primka, ale bod');
y:=(-1)*primka1.c/primka1.b;
urci_prusecik_primek.y:=y;
urci_prusecik_primek.x:=(((primka2.b)*y+primka2.c)/((-1)*primka2.a));
exit;
end
else if primka2.a=0
then begin
if primka1.a=0 then writeln ('rovnobezky2');
if primka2.b=0 then writeln ('bod');
y:=primka2.c*(-1)/primka2.b;
urci_prusecik_primek.y:=y;
urci_prusecik_primek.x:=(((primka1.b)*y+primka1.c)/((-1)*primka1.a));
exit;
end
else begin
koeficient:=primka1.a;
primka1.a:=1;
primka1.b:=primka1.b/koeficient;
primka1.c:=primka1.c/koeficient;
koeficient:=(-1)*primka2.a;
primka2.a:=-1;
primka2.b:=primka2.b/koeficient;
primka2.c:=primka2.c/koeficient;
if primka1.b+primka2.b=0 then writeln ('rovnobezky');
y:=(((-1)*(primka1.c+primka2.c))/(primka1.b+primka2.b));
urci_prusecik_primek.y:=y;
urci_prusecik_primek.x:=((-1)*((y*primka1.b)+primka1.c));
end;
end;
function lezi_bod_na_usecce (zac,kon,x:Tbod): boolean; {urci, zdali bod x lezi na usecce dane body "zac", "kon"}
var u, v: Tvektor;
koeficient:real;
begin
{if ((zac.x=x.x)AND(zac.y=x.y)) OR ((kon.x=x.x)AND(kon.y=x.y)) } {1) je bod X koncovym bodem usecky?}
if ((round (zac.x*1000))/1000 = (round(x.x*1000))/1000) AND ((round(zac.y*1000))/1000=(round(x.y*1000))/1000) OR
((round (kon.x*1000))/1000 = (round(x.x*1000))/1000) AND ((round(kon.y*1000))/1000=(round(x.y*1000))/1000)
then begin
lezi_bod_na_usecce:=true;
exit;
end;
lezi_bod_na_usecce:=true;
if lezi_bod_na_primce (zac, kon, x) = false {2) lezi bod X na primce dane body "zac", "kon"?}
then begin
lezi_bod_na_usecce:=false;
exit;
end;
u:=vyrob_vektor (zac, x);
v:=vyrob_vektor (kon, x);
if u.x = 0 {3) lezi bod X mezi body "zac", "kon"? }
then if (v.x=0) AND (((u.y>0) AND (v.y<0)) OR ((u.y<0) AND (v.y>0)))
then begin
lezi_bod_na_usecce:=true;
exit;
end
else begin
lezi_bod_na_usecce:=false;
exit;
end
else if u.y=0 then if (v.y=0) AND (((u.x<0) AND (v.x>0)) OR ((u.x>0) AND (v.x<0)))
then begin
lezi_bod_na_usecce:=true;
exit;
end
else begin
lezi_bod_na_usecce:=false;
exit;
end
else begin
koeficient:=abs(u.x);
u.x:=u.x/koeficient;
u.y:=u.y/koeficient;
koeficient:=abs(v.x);
v.x:=v.x/koeficient;
v.y:=v.y/koeficient;
if (round (u.x*10000)/10000=round((-1)*v.x*10000)/10000) AND (round(u.y*10000)/10000=round((-1)*v.y*10000)/10000)
then lezi_bod_na_usecce:=true
else lezi_bod_na_usecce:=false;
end;
end;
function maji_usecky_prusecik (a,b,c,d: Tbod): boolean; {urci, zdali mají usecky spolecny bod/body}
var p,q: Tprimka;
x: Tbod;
begin
if rovnobezky (a,b,c,d) = true
then if lezi_bod_na_usecce(a,b,c) OR lezi_bod_na_usecce (a,b,d) OR lezi_bod_na_usecce (c,d,a) OR lezi_bod_na_usecce (c,d,b)
then begin
maji_usecky_prusecik:=true;
exit;
end
else begin
maji_usecky_prusecik:=false;
exit;
end
else begin
x:=urci_prusecik_primek (a,b,c,d);
if lezi_bod_na_usecce (a,b,x) AND lezi_bod_na_usecce (c,d,x)
then maji_usecky_prusecik:=true
else maji_usecky_prusecik:=false;
end;
end;
function urci_prusecik_usecek (a,b,c,d: Tbod): Tbod; {urci prusecik neprekryvajicich se usecek}
begin
if (rovnobezky (a,b,c,d)=true) and (maji_usecky_prusecik(a,b,c,d)=true)
then begin
writeln ('!!!Behova chyba, usecky se prekryvaji!!!');
exit;
end;
if maji_usecky_prusecik (a,b,c,d) = true
then urci_prusecik_usecek:=urci_prusecik_primek (a,b,c,d);
end;
function vzdalenost_bodu_od_primky (a,b,x: Tbod): real; {urci vzdalenost bodu X od primky dane body A,B}
var p: Tprimka;
begin
p:=vyrob_primku_z_bodu (a,b);
vzdalenost_bodu_od_primky:=abs(x.x*p.a+x.y*p.b+p.c)/sqrt(p.a*p.a+p.b*p.b);
end;
function vzdalenost_bodu_od_usecky (a,b,x: Tbod): real; {urci vzdalenost bodu X od usecky dane body A,B}
var p: Tprimka;
pata, y: Tbod;
n: Tvektor;
odjednoho, oddruheho: real;
begin
if lezi_bod_na_usecce(a,b,x)=true
then begin
vzdalenost_bodu_od_usecky:=0;
exit;
end;
p:=vyrob_primku_z_bodu (a,b);
n.x:=p.a;
n.y:=p.b;
y:=posun_bod(x, n);
pata:=urci_prusecik_primek (a,b,x,y);
if lezi_bod_na_usecce (a,b,pata) = true
then vzdalenost_bodu_od_usecky:=vzdalenost_bodu_od_primky (a,b,x)
else begin
odjednoho:=vzdalenost_bodu(a,x);
oddruheho:=vzdalenost_bodu(b,x);
if odjednoho<oddruheho
then vzdalenost_bodu_od_usecky:=odjednoho
else vzdalenost_bodu_od_usecky:=oddruheho
end;
end;
function vystrc_poc_bod (a,b :Tbod) :Tbod; {slouzi ke zvetseni polygonu, posune pocatecni bod hrany kolmo ven z polygonu o polomer obra}
var v, n: Tvektor;
x: Tbod;
begin
v:=vyrob_vektor (a,b);
n:=normalovy_vektor(v);
n:=vyrob_vektor_velikosti (n, polomer);
x:=posun_bod (a,n);
if je_bod_napravo_od_primky (a,b,x)
then begin
vystrc_poc_bod.x:=x.x;
vystrc_poc_bod.y:=x.y;
end
else begin
n:=opacny_vektor(n);
x:=posun_bod (a,n);
vystrc_poc_bod.x:=x.x;
vystrc_poc_bod.y:=x.y;
end;
end;
function vystrc_konc_bod (a,b :Tbod) :Tbod; {slouzi ke zvetseni polygonu, posune koncovy bod hrany kolmo ven z polygonu o polomer obra}
var v, n: Tvektor;
x: Tbod;
begin
v:=vyrob_vektor (a,b);
n:=normalovy_vektor(v);
n:=vyrob_vektor_velikosti (n, polomer);
x:=posun_bod (a,n);
if je_bod_napravo_od_primky (a,b,x)=false
then begin
vystrc_konc_bod.x:=x.x;
vystrc_konc_bod.y:=x.y;
end
else begin
n:=opacny_vektor(n);
x:=posun_bod (a,n);
vystrc_konc_bod.x:=x.x;
vystrc_konc_bod.y:=x.y;
end;
end;
{***Klicove procedury a funkce***}
function lezi_bod_na_obvodu (a: Tbod; polygon: Tbody): boolean; {urci, jestli bod A lezi na obvodu polygonu}
var zac, kon: Tbod;
posuvnik: Tbody;
begin
lezi_bod_na_obvodu:=false;
posuvnik:=polygon;
while posuvnik^.dalsi^.dalsi<>nil do
begin
zac:=posuvnik^.souradnice;
kon:=posuvnik^.dalsi^.souradnice;
if lezi_bod_na_usecce (zac,kon,a)=true
then begin
lezi_bod_na_obvodu:=true;
exit;
end;
posuvnik:=posuvnik^.dalsi;
end;
end;
function je_bod_uvnitr (a: Tbod; polygon: Tbody):boolean; {urci, jestli je bod uvnitr polygonu, na obvodu se nepocita}
var mimo,vrchol: Tbod;
prvni, druhy: Tbody;
zac, kon: Tbod;
protnuti: integer;
vrcholy: boolean;
posuvnik_v_bodech: Tbody;
begin
if lezi_bod_na_obvodu (a, polygon)= true
then begin
je_bod_uvnitr:=false;
exit;
end;
mimo.x:=sirka_lesa+polomer+1;
vrcholy:=false;
mimo.y:=1;
while vrcholy<>true do
begin
posuvnik_v_bodech:=polygon;
mimo.y:=mimo.y+0.1;
vrcholy:=true;
while posuvnik_v_bodech^.dalsi<>nil do
begin
vrchol:=posuvnik_v_bodech^.souradnice;
if lezi_bod_na_usecce (a,mimo,vrchol) = true
then begin
vrcholy:=false;
break;
break;
end
else posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
end;
posuvnik_v_bodech:=polygon;
protnuti:=0;
while posuvnik_v_bodech^.dalsi^.dalsi<>nil do
begin
zac:=posuvnik_v_bodech^.souradnice;
kon:=posuvnik_v_bodech^.dalsi^.souradnice;
if maji_usecky_prusecik (zac, kon, a, mimo) = true
then begin
inc (protnuti);
end;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
if protnuti mod 2=0
then je_bod_uvnitr:=false
else je_bod_uvnitr:=true;
end;
procedure zvetsi_polygon (var hlava: Tpolygony); {zvetsi polygon o polomer obra (musime zapocitat i kruznice kolem bodu}
var posuvnik_v_bodech, z_posuvnik_v_bodech: Tbody;
zac,kon, novy: Tbod;
begin
posuvnik_v_bodech:=hlava^.info;
new (hlava^.z_info);
hlava^.z_info^.dalsi:=nil;
z_posuvnik_v_bodech:=hlava^.z_info;
while posuvnik_v_bodech^.dalsi^.dalsi<>nil do
begin
zac:=posuvnik_v_bodech^.souradnice;
kon:=posuvnik_v_bodech^.dalsi^.souradnice;
novy:=vystrc_poc_bod (zac, kon);
z_posuvnik_v_bodech^.souradnice:=novy;
new (z_posuvnik_v_bodech^.dalsi);
z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
z_posuvnik_v_bodech:=z_posuvnik_v_bodech^.dalsi;
novy:=vystrc_konc_bod (kon, zac);
z_posuvnik_v_bodech^.souradnice:=novy;
new (z_posuvnik_v_bodech^.dalsi);
z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
z_posuvnik_v_bodech:=z_posuvnik_v_bodech^.dalsi;
posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
end;
new (z_posuvnik_v_bodech^.dalsi);
z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
z_posuvnik_v_bodech^.souradnice:=hlava^.z_info^.souradnice;
end;
function pocet_bodu (polygon: Tbody):integer; {spocita pocet bodu polygonu}
var posuvnik: Tbody;
body:integer;
begin
body:=1;
posuvnik:=polygon;
while posuvnik^.dalsi<>nil do
begin
inc (body);
posuvnik:=posuvnik^.dalsi;
end;
pocet_bodu:=body;
end;
procedure procisti_polygon (var polygon: Tbody); {procisti duplicitnihrany/hrany uvnitr polygonu, ktere vznikly pri zvetseni}
var zac, kon, zacmazani, konmazani, smazat, odkaz: Tbody;
prusecik: Tbod;
upravit:boolean;
a,b,c,d: Tbod;
begin
if pocet_bodu (polygon)<=4
then exit;
upravit:=false;
zac:=polygon;
kon:=polygon^.dalsi^.dalsi;
a:=zac^.souradnice;
b:=zac^.dalsi^.souradnice;
while kon^.dalsi^.dalsi^.dalsi<>nil do
begin
c:=kon^.souradnice;
d:=kon^.dalsi^.souradnice;
if maji_usecky_prusecik (a,b,c,d)=true
then begin
zacmazani:=zac;
konmazani:=kon;
upravit:=true;
end;
kon:=kon^.dalsi;
end;
if upravit=true
then begin
c:=konmazani^.souradnice;
d:=konmazani^.dalsi^.souradnice;
if rovnobezky (a,b,c,d)=true
then begin
odkaz:=zacmazani^.dalsi;
zacmazani^.dalsi:=konmazani^.dalsi;
while odkaz^.dalsi<>zac^.dalsi do
begin
smazat:=odkaz;
odkaz:=odkaz^.dalsi;
dispose (smazat);
end;
end
else begin
prusecik:=urci_prusecik_usecek (a,b,c,d);
zacmazani^.dalsi^.souradnice:=prusecik;
odkaz:=zacmazani^.dalsi^.dalsi;
zacmazani^.dalsi^.dalsi:=konmazani^.dalsi;
while odkaz^.dalsi<>zacmazani^.dalsi^.dalsi do {jen odkaz}
begin
smazat:=odkaz;
odkaz:=odkaz^.dalsi;
dispose (odkaz);
end;
end;
end;
if pocet_bodu (polygon^.dalsi)<=4
then exit;
zac:=polygon^.dalsi;
while zac^.dalsi^.dalsi^.dalsi^.dalsi<>nil do
begin
upravit:=false;
kon:=zac^.dalsi^.dalsi;
a:=zac^.souradnice;
b:=zac^.dalsi^.souradnice;
while kon^.dalsi^.dalsi<>nil do
begin
c:=kon^.souradnice;
d:=kon^.dalsi^.souradnice;
if maji_usecky_prusecik (a,b,c,d)
then begin
upravit:=true;
zacmazani:=zac;
konmazani:=kon;
end;
kon:=kon^.dalsi;
end;
if upravit=true
then begin
c:=konmazani^.souradnice;
d:=konmazani^.dalsi^.souradnice;
if rovnobezky(a,b,c,d)=true
then begin
odkaz:=zacmazani^.dalsi;
zacmazani^.dalsi:=konmazani^.dalsi;
while odkaz^.dalsi<>zacmazani^.dalsi do
begin
smazat:=odkaz;
odkaz:=odkaz^.dalsi;
dispose (smazat);
end;
upravit:=false;
end
else begin
prusecik:=urci_prusecik_usecek (a,b,c,d);
zacmazani^.dalsi^.souradnice:=prusecik;
odkaz:=zacmazani^.dalsi^.dalsi;
zacmazani^.dalsi^.dalsi:=konmazani^.dalsi;
konmazani^.dalsi:=nil;
while odkaz^.dalsi<>nil do
begin
smazat:=odkaz;
odkaz:=odkaz^.dalsi;
dispose (smazat)
end;
upravit:=false;
end;
end;
if pocet_bodu (zac^.dalsi)<=4
then exit
else zac:=zac^.dalsi;
end;
end;
procedure zvetsi_polygony (hlava: Tpolygony); {zvetsi vsechny polygony o polomer obra}
var posuvnik_v_polygonech: Tpolygony;
begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
zvetsi_polygon (posuvnik_v_polygonech);
procisti_polygon (posuvnik_v_polygonech^.z_info);
procisti_polygon (posuvnik_v_polygonech^.z_info);
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
if vypisy=true
then begin
writeln;
writeln ('zvetsene polygony: ');
vypis_z_polygony (hlava);
end;
end;
function dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol: Tbod; polygon: Tbody; polomer: real): boolean; {urci, jestli ma bod "vrchol" vzdalenost od vsech hran zvetseneho polygonu alespon polomer}
var posuvnik: Tbody;
a,b: Tbod;
begin
dostatecna_vzdalenost_bodu_od_vsech_hran:=true;
posuvnik:=polygon;
if posuvnik^.dalsi=nil then exit;
while posuvnik^.dalsi^.dalsi<>nil do
begin
a:=posuvnik^.souradnice;
b:=posuvnik^.dalsi^.souradnice;
if vzdalenost_bodu_od_usecky (a,b,vrchol)<polomer
then begin
dostatecna_vzdalenost_bodu_od_vsech_hran:=false;
exit;
end
else posuvnik:=posuvnik^.dalsi;
end;
end;
function dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol:Tbod; polygon:Tbody; polomer: real): boolean; {urci, jestli ma bod "vrchol" vzdalenost od puv. bodu polygonu alespon polomer*2}
var posuvnik:Tbody;
a,b: Tbod;
begin
posuvnik:=polygon;
a:= vrchol;
while posuvnik^.dalsi<>nil do
begin
b:=posuvnik^.souradnice;
if vzdalenost_bodu (a,b)<polomer*2
then begin
dostatecna_vzdalenost_bodu_od_vsech_bodu:=false;
exit;
end
else posuvnik:=posuvnik^.dalsi;
end;
dostatecna_vzdalenost_bodu_od_vsech_bodu:=true;
end;
function otestuj_dva_polygony (polygon1, polygon2: Tpolygony): boolean; {otestuje, jestli 2 polygony patri do stejne komponenty}
var puv1, puv2, n1, n2: Tbody;
vrchol, a,b: Tbod;
begin
otestuj_dva_polygony:=false;
puv1:=polygon1^.info;
puv2:=polygon2^.info;
n1:=polygon1^.z_info;
n2:=polygon2^.z_info;
while n1^.dalsi<>nil do {cyklus, ktery kontroluje, zdali nejaky bod ze zvets. polygonu neni ve zvets. polygonu}
begin
vrchol:=n1^.souradnice;
if je_bod_uvnitr (vrchol, n2)=true
then begin
otestuj_dva_polygony:=true;
exit;
end
else n1:=n1^.dalsi;
end;
n1:=polygon1^.z_info;
while n2^.dalsi<>nil do {to samé pro druhý polygon}
begin
vrchol:=n2^.souradnice;
if je_bod_uvnitr (vrchol, n1)=true
then begin
otestuj_dva_polygony:=true;
exit;
end
else n2:=n2^.dalsi;
end;
n2:=polygon2^.z_info;
while puv1^.dalsi<>nil do {zjisti, zdali vzdalenost vsech bodu puvodniho polygonu je dostatecna od druheho puv. polygonu}
begin
vrchol:=puv1^.souradnice;
if (dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol, n2, polomer) = false) OR
(dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol, puv2, polomer) = false)
then begin
otestuj_dva_polygony:=true;
exit;
end
else puv1:=puv1^.dalsi;
end;
puv1:=polygon1^.info;
while puv2^.dalsi<>nil do {to samé pro druhý polygon}
begin
vrchol:=puv2^.souradnice;
if (dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol, n1, polomer) = false) OR
(dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol, puv1, polomer) = false)
then begin
otestuj_dva_polygony:=true;
exit;
end
else puv2:=puv2^.dalsi;
end;
puv2:=polygon2^.info;
otestuj_dva_polygony:=false;
end;
procedure urci_komponenty (var hlava: Tpolygony);
var posuvnik1, posuvnik2, prejmenovavac: Tpolygony;
nove_cislo, stare_cislo: integer;
begin
posuvnik1:=hlava;
if posuvnik1^.dalsi=nil
then exit
else posuvnik2:=hlava^.dalsi;
while posuvnik1^.dalsi^.dalsi<>nil do
begin
posuvnik2:=posuvnik1^.dalsi;
while posuvnik2^.dalsi<>nil do
begin
if otestuj_dva_polygony (posuvnik1, posuvnik2) = true
then begin
nove_cislo:=posuvnik1^.cislo;
stare_cislo:=posuvnik2^.cislo;
posuvnik2^.cislo:=nove_cislo;
prejmenovavac:=hlava;
while prejmenovavac^.dalsi<>nil do
begin
if prejmenovavac^.cislo=stare_cislo
then prejmenovavac^.cislo:=nove_cislo;
prejmenovavac:=prejmenovavac^.dalsi;
end;
end;
posuvnik2:=posuvnik2^.dalsi;
end;
posuvnik1:=posuvnik1^.dalsi;
end;
end;
procedure vypis_komponenty (hlava: Tpolygony);
var komponenty: Tpolygony;
begin
komponenty:=hlava;
while komponenty^.dalsi<>nil do
begin
write (komponenty^.cislo, ' ');
komponenty:=komponenty^.dalsi;
end;
end;
function cislo_obsazeno (hlava:Tpolygony; cislo:integer): boolean;
var posuvnik_v_polygonech:Tpolygony;
begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
if posuvnik_v_polygonech^.cislo=cislo
then begin
cislo_obsazeno:=true;
exit;
end;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
cislo_obsazeno:=false;
end;
function cislo_max (hlava: Tpolygony): integer;
var posuvnik_v_polygonech: Tpolygony;
max: integer;
begin
posuvnik_v_polygonech:=hlava;
max:=1;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
if max<posuvnik_v_polygonech^.cislo
then max:=posuvnik_v_polygonech^.cislo;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
cislo_max:=max;
end;
procedure prejmenuj_komponentu (var hlava: Tpolygony; stare, nove: integer); {hleda polygony s cislem komponenty "stare", prepise cislo na "nove"}
var posuvnik_v_polygonech: Tpolygony;
begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
begin
if posuvnik_v_polygonech^.cislo=stare
then posuvnik_v_polygonech^.cislo:=nove;
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
end;
procedure prejmenuj_komponenty (var hlava: Tpolygony); {prejmenuje komponenty, aby byla vyuziva vsechna cisla od 1 do "pocet komponent"}
var stare, nove, i, hranice: integer;
begin
stare:=2;
hranice:=cislo_max (hlava);
for i:=1 to hranice do
begin
nove:=i;
stare:=i+1;
while (cislo_obsazeno (hlava, nove)=false) AND (stare<=hranice) do
begin
prejmenuj_komponentu (hlava, stare, nove);
inc (stare);
end;
end;
if vypisy=true
then begin
writeln ('komponenty souvislosti: ');
vypis_komponenty(hlava);
end;
end;
function najdi_extremy (hlava: Tpolygony): Tbod; {.x-bude maximum, .y bude minimum, najde nejmensi a nejvetsi x-ovou souradnici v polygonu}
var minimum, maximum: real;
posuvnik: Tbody;
begin
posuvnik:=hlava^.info;
minimum:=sirka_lesa;
maximum:=0;
while posuvnik^.dalsi<>nil do
begin
if posuvnik^.souradnice.x<minimum
then minimum:=posuvnik^.souradnice.x;
if posuvnik^.souradnice.x>maximum
then maximum:=posuvnik^.souradnice.x;
posuvnik:=posuvnik^.dalsi;
end;
najdi_extremy.x:=maximum;
najdi_extremy.y:=minimum;
end;
procedure najdi_problem (hlava: Tpolygony; var projde: boolean; var cislo_nepruchozi: integer; pocet_komponent: integer); {hleda komponentu, ktera ma od obou hranic lesa vzdalenost mensi nez 2*polomer}
var posuvnik: Tpolygony;
komponenta,i: integer;
extremy: Tbod;
k_min, k_max: real;
begin
for i:=1 to pocet_komponent do
begin
projde:=true;
komponenta:=i;
posuvnik:=hlava;
k_min:=sirka_lesa;
k_max:=0;
while posuvnik^.dalsi<>nil do
begin
if posuvnik^.cislo=komponenta
then begin
extremy:=najdi_extremy (posuvnik);
if extremy.x>k_max
then k_max:=extremy.x;
if extremy.y<k_min
then k_min:=extremy.y;
posuvnik:=posuvnik^.dalsi;
end
else posuvnik:=posuvnik^.dalsi;
end;
if (k_min<0+2*polomer) AND (k_max>sirka_lesa-2*polomer)
then begin
projde:=false;
cislo_nepruchozi:=komponenta;
exit;
end;
end;
end;
procedure vyrob_vystup (hlava: Tpolygony); {vypisuje pozadovana data do souboru vystup.txt}
var komponenta, pocet_komponent, i: integer;
posuvnik_v_polygonech: Tpolygony;
begin
assign (vystup, 'vystup.txt');
rewrite (vystup);
komponenta:=1;
pocet_komponent:=cislo_max(hlava);
write (vystup, 'Zjisteny vysledek pro les sirky ');
write (vystup, sirka_lesa:4:2);
write (vystup, ' a obra s polomerem ');
write (vystup, polomer:4:2);
writeln (vystup, ':');
for i:=1 to pocet_komponent do
begin
posuvnik_v_polygonech:=hlava;
write (vystup, 'Komponenta souvislosti cislo ');
write (vystup, i);
writeln (vystup, ':');
while posuvnik_v_polygonech^.dalsi<>nil do
begin
if posuvnik_v_polygonech^.cislo = i
then polygon_do_souboru (posuvnik_v_polygonech^.info);
posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
end;
posuvnik_v_polygonech:=hlava;
end;
writeln (vystup);
if projde=true
then writeln (vystup, 'Vysledek vypoctu: Obr muze zadanym lesem projit.')
else begin
write (vystup, 'Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: ');
writeln (vystup, cislo_nepruchozi);
end;
close (vystup);
end;
{***Zacatek samotneho tela programu***}
begin
Clrscr;
priprav_data;
nacti_data (hlava, sirka_lesa, polomer);
if sirka_lesa<polomer*2
then begin
assign (vystup, 'vystup.txt');
rewrite (vystup);
writeln (vystup, 'Obr je sirsi nez les, nemuze tedy projit.');
close (vystup);
end
else begin
zvetsi_polygony (hlava);
urci_komponenty (hlava);
if vypisy = true
then writeln;
prejmenuj_komponenty (hlava);
pocet_komponent:= cislo_max (hlava);
najdi_problem (hlava, projde, cislo_nepruchozi, pocet_komponent);
if vypisy = true
then if projde=true
then writeln ('Obr projde lesem.')
else writeln ('Obr lesem neprojde, problemova komponenta: c.', cislo_nepruchozi);
vyrob_vystup (hlava);
end;
end.
ještě sem dám nějaké vstupy a výstupy
Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75]
[9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25]
[8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]
Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr muze zadanym lesem projit.
Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1
Obrázek:
ještě sem dám nějaké vstupy a výstupy
Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75]
[9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25]
[8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]
Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr muze zadanym lesem projit.
Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1
Obrázek:
ještě sem dám nějaké vstupy a výstupy
Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75]
[9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25]
[8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]
Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr muze zadanym lesem projit.
Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1
Obrázek:
ještě sem dám nějaké vstupy a výstupy
Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75]
[9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25]
[8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]
Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr muze zadanym lesem projit.
Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25]
[6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75]
[8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]
Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1
Obrázek:
Zobrazeno 47 zpráv z 47.