Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Vlastně se nejedná o matici, ale o "šachovnici" (paletu), ale v principu je to jedno a to samé. Zkrátka jde o dva cykly, jeden vypisuje souřadnice pro osu x a druhý pro osu y. Polohuju čtverce, které na obrazovce budou vypadat podobně jako šachovnice. Ta šachovnice má mít pravidelné strany. Nejdříve zpracovávám y a pak v zanořeném cyklu x. Myslel jsem si že mi bude stačit obyčejný modulo na to, abych jen zjistil jestli po dělení strany palety číslem c zbude 0. Ale nefunguje.
Jazyk AHK
msgBox - okno které vrací zprávu
colors - pole obsahující 14 hodnot
mod - funkce mod dělí šířku palety céčkem a vrací zbytek
; komentář
x=0 ; souřadnice může být téměř libovolná v rámci obrazovky
y=0 ; souřadnice může být téměř libovolná v rámci obrazovky
palWidth=4
http://paste.ofcode.org/eZZx6a3KThY7TgtcepHui6
Problém je v tom že to prakticky vůbec nefunguje, prostě to nedává tu šachovnici.
Offline
Edit: kód jsem o něco poupravil, ale ještě je v něm problém, viz příspěvek níže
Offline
↑ buff:
Ty opravdu umíš "perfektně" definovat problém.
Četl jsem to asi třikrát, ale o co ti jde jsem nepochopil.
Pokud v tom příkladu v příspěvku 2 má být pravda jenom když šířka se rovná c (a tak to tam máš), tak nemusíš dělat žádné cykly ani počítat modulo.
Jen taková poznámka: píšeš "4/3 je dělitelné jenže nechci aby výsledek byl pravda", ale 4/3 není dělitelné beze zbytku.
Offline
Zapomeň na to co jsem napsal (já to radši i smažu aby to nikdo další nečetl.
Část kódu jsem opravil, takže už to vypadá jako paleta, ale je tam ještě jedna chyba.
Takže aktuální stav:
http://paste.ofcode.org/328b9YHf39286yiqdUf5mRN
testovací hodnoty:
padding = 2
tileSize = 14
palleteSize = 4
xOrigin = 200
yOrigin = 200
colors = pole se 14 položkami
Pokouším se vytvořit paletu o 4x4 čtverečků. něco podobného:
http://wireframesketcher.com/blog/image … picker.png
Klíčová proměnná je cn a ta označuje kolik kroků jsem udělal během vytváření nového řádku.
Co to dělá? Po vypsání prvních čtyř čtverečků do první řady vypisuje:
A5
0
B1 ... a ukáže jeden čtvereček ale na nesprávném místě, totiž pod tím čtvrtým čtverečkem na konci první řady. Takže výsledný obrázek je:
x x x x
o o o x
(x znamená čtvereček, o je volné místo)
pak pokračuju
1
b2
a dále se opakuje vzorec popsaný výše, takže další čtvereček:
x x x x
x ... atd.
pak by to pokračovalo
x x x x
x x x x
a dále
x x x x
x x x x
o o o x
a dále
x x x x
x x x x
x x x x
a tím to hasne.
Kdyby to bylo správně tak by ve výsledku mělo být:
x x x x
x x x x
x x x x
x x
tj. 14 položek
Je jasné že ten čtvereček co se vytváří vpravo místo vlevo tam nemá být, jenže jsem nepřišel proč to tak je. Matematicky v tom žádnou chybu nenacházím a to si vypisuju i ten vzorec pro výpočet souřadnice x.
http://paste.ofcode.org/328b9YHf39286yiqdUf5mRN
Offline
Nyní si můžete stáhnout pokus.exe je to ten algoritmus, co jsem zde odkazoval ale zkompilovaný pomocí AHK:
http://sourceforge.net/projects/autots/ … e/download
Po spuštění se vám hned začnou vypisovat hlášky a ty čtverečky přesně podle kódu níže:
Zdrojový kód:
http://paste.ofcode.org/328b9YHf39286yiqdUf5mRN
Offline
↑ buff:
Ten tvůj programovací jazyk neovládám (ani se v něm nevyznám)
Jestli to má vypadat nějakjako na obrázku níže, (barvy jsem si vymyslel) tak v eDelphi by program vypadal nějak takto: (přečti si komentáře za // .. a třeba to pochopíš)
Offline
Takhle to nejde, to musí být dynamické aby se daly změnit parametry
Spíš jsem očekával analýzu mého kódu než sepsání jiného kódu v jiném jazyce...
Ten ahk jazyk není těžký na analýzu, ani jsem nepoužil třídy, ale hold logika někde selhala
Offline
Tam se mění všechno, počet barev v poli colors
šířka palety a šířka tileSize se vypočítává z počtu barev...
při pátém kroku (pátý čtverec)
x := xOrigin + tileSize*xc + padding*xc
má vyjít:
x = 200 + 14*1 + 3*1
přitom zpráva ukazuje shodné hodnoty jako u prvního čtverce ale výsledek je jiný:
nahoře první čtverec, dole pátý čtverec
cn počítá kdy se má provést "zalomení" čini začít nový řádek.
Offline
Už jsem přišel na to kde je problém, teď to jen vyřešit.
První část opravy je tedy toto:
if ( cn=palleteSize+1 )
cn:=0
if ( cn=0 )
{
msgBox, A %xc%
...
dokud cn:=0 bylo uvnitř toho hlavního if, tak se krok pět nezpracoval a jeden tile byl tedy přeskočen. Pětka se vytiskla znova vpravo jen na jinou y souřadnici a šestka ze pak zařadilo na místo pětky zleva.
Offline
Konečně jsem se z toho vymotal!
colors := [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
padding:=2
xOrigin:=200
yOrigin:=200
palleteSize:=4
tileSize:=14
Gui, Toolbar:Show,
palWidth:=padding
if ( Mod(palWidth, 2) <> 0 )
palWidth++ ; create odd palette width
c:=0
xc:=0
yc:=0
x := xOrigin
y := yOrigin
cn:=0
for key, color in % colors
{
if ( key=="count" )
continue
c++
cn++
xc++
if ( cn=palleteSize+1 )
{
cn:=1
xc:=1
yc++
y := yOrigin + tileSize*yc + padding*yc
}
x := xOrigin + tileSize*xc + padding*xc
if (!x)
x := "0"
if (!y)
y := "0"
Gui, palette_%c%: -Caption +ToolWindow +AlwaysOnTop +OwnerToolbar
;color:=colorsDb[color["colorName"]][color["colorKey"]]?colorsDb[color["colorName"]][color["colorKey"]]:color["colorName"]
Gui, palette_%c%: Color, Black
Gui, palette_%c%:Show, NA X%x% Y%y% W%tileSize% H%tileSize%
} ; end of for key,colorTakže jsem úplně vypustil blok else, to byla hlavní příčina problémů. x přiřazovat vždy, plynule s navyšováním c. Potom bylo třeba dát cn:=1 místo cn:=0.
Offline
↑ Honzc:
To je detail, to mohu vyřešit později jestli to bude vadit. Hlavně že se mi tu paletu povedlo vytvořit. Sice na tom ještě musím něco dodělat, ale základ je hotov.
Offline