
JavaFX - Jak vybarvit uzavřenou oblast?
Dobrý den,
Potřeboval bych vybarvit uzavřenou oblast.
Když např. nakreslím (obrázek v příloze) pomocí kódu,
Arc arc = new Arc(500, 500, 500, 500, 0, 20);
arc.setType(ArcType.OPEN);
arc.setStroke(Color.BLACK);
arc.setFill(Color.TRANSPARENT);
Arc arc1 = new Arc(400, 400, 500, 500, 0, 20);
arc1.setType(ArcType.OPEN);
arc1.setStroke(Color.BLACK);
arc1.setFill(Color.TRANSPARENT);
Line line = new Line(1000, 500, 900, 400);
Line line1 = new Line(970, 330, 870, 230);
jak vybarvím vnitřek?
V malování bych jednoduše použil fill with color, ale tady vůbec netuším.
Jak to, prosím Vás, udělám?
Děkuji
PS. Nešlo by k tomu využít CSS?
Nakreslíš tvar pomocou Path a nastavíš výplň vo vlastnosti fill.
To vypadá slibně.
Tohle se prozatím shoduje s proměnnou line v kódu výše.
Napsal jsem pouze tohle, protože nevím jak dál respektive jak nakreslit oblouk pomocí ArcTo, aby se shodoval s arc1?
Prosím o radu? Tu třídu jsem vážně nepochopil.
Díky
Zkusil bych tohle:
Jak jsem říkal, tu třídu jsem moc nepochopil a tvůj kód (pokud ho přidám k původnímu) zobrazí tohle - obrázek v příloze
Není potřeba nastavit XAxisRotation? Výchozí hodnota je 0.0, ale při změně se oblouk nemění. I když, podle dokumentace by měl.
Asi jsem si spletl body:
Aha, ty vlastně udáváš jenom koncové body.
Pomocí tohoto kódu nakreslím to samé, co v zadání a navíc to obarvím - obrázek3.
Jenže, když např. nakreslíš, pomocí tohohle kódu - obrázek 4.
tak obarvit všechny různými barvami, pomocí Path, je obrovský problém respektive napsat takový kód je strašně zdlouhavé.
Neexistuje, prosím Vás, nějaká jednodušší alternativa?
Díky
A proč to neuděláš cyklem?
Aha. Já se pořád cyklu vyhýbám, ale v tomhle případě je to ideální.
V příkladu výše kreslím pouze 10 line, tak jsem to předělal na 20, kvůli tomu cyklu. Všechny začínají na specifickém místě kružnice a končí ve středu.
To je však zhola k ničemu. Pomocí Path se kruh nakreslí "sám", takže je zbytečné do Pane (ve kterém to celé je) dávat Circle ani Line.
Navíc, Circle vůbec nepotřebuji a Line jsem nahradil vlastní třídou (Position), která pouze obsahuje x a y specifických bodů na kružnici.
Na rychlo jsem napsal náhodnou barvu. Tu bych teď neřešil, problém je, jak mám napsat ten cyklus. V každé 1/20 musím spojit obloukem bod v poli s následujícím bodem - 0 a 1, 1 a 2, 2 a 3 atd.
Problémem je 20 část, která spojuje 19 a 0 bod. V takovém případě to pochopitelně zhavaruje, protože prvek position[20] neexistuje.
Proto, v příkladu výše používám dvě podmínky, což je absurdní, jenom kvůli jedné situaci. Podmínka v hlavičce byla sice zbytečná, ale i tak mně to přijde zbytečně složité.
Je to možné, prosím Vás, nějak zjednodušit?
Děkuji
To nevím proč se tomu vyhýbáš. Pokud se něco v kódu opakuje, je téměř vždy lepší to napsat cyklem. Ale taky to pak nesmíš psát takhle zbytečně složitě.
Nevím, odněkud jsem měl vštípenou potřebu se vyhýbat cyklu, ale to teď není podstatné.
Zjednodušil jsem kód nejvíce co jsem byl schopen.
Váš kód vypadá mnohem jednodušeji, ale nepochopil jsem metodu step respektive proč je zrovna 20.
Navíc, nejde to ani spustit, protože tenhle řádek je špatný
Má tam být addAll, ale hlavně proměnná radiusX a radiusY neexistují.
Jak to má být, prosím Vás, správně?
Děkuji
Má tam být jenom radius.
Ten kruh máš rozdělený do 20 části, ne?
Pak si z toho můžeš udělat jednoduchou znovupoužitelnou metodu:
Vlastně jo. Mají 18%, ale je jich 20.
Ano, změnit na radius jsem to už předtím zkoušel, ale nakreslilo to pěkný patvar, protože, v předchozím kódu, je špatně vypočítané lineX a lineY
Díky, ale ještě poslední otázka. Zde je pro všechny části shodný střed, ale jak musím kód upravit, aby mě uprostřed vznikl další kruh r=100, do kterého by to nezasahovalo.
Něco obdobného, jak jsem řešil na začátku. Dvě LineTo a dvě ArcTo, až na to, že ArcTo by nebyli stejně velké.
Díky
A nechceš náhodou nakreslit terč na šipky?
http://www.hameister.org/JavaFX_Dartboard.html
Sorry, ale byl jsem zaneprázdněn a pak se to snažil vyřešit. Ale to není podstatné.
Šlo mi o nakreslení tohohle - obrázek
Levý "oblouk je nakreslený pomocí
V konstruktoru to volám
Abych to vysvětlil. Pouze levý horní oblouk je nakreslený pomocí metody a zbylé jsou pomocí čar a oblouků pro znázornění. Nakreslení všech oblouků je však složité, protože střed velké a malé "kružnice" je vždy rozdílný a nelze ho nějak odvodit. Proto jsem to chtěl vytvořit čtyřikrát na jednom místě a pak posunout a otočit. To by bylo ale zbytečně složité a ani se mi to nepodařilo.
Mnohem jednoduší by to bylo tzv. překlopit přes čáry, které jsou zde znázorněné. Navíc mně přijde cyklus nesmyslný. Lepší by bylo, kdybych zavolal metodu pouze jednou a pak to třikrát "naklonoval". Jak to, prosím Vás, udělám?
Děkuji
Odvodit musí jít, jak jinak bys to dokázal nakreslit?
Mně to naopak přijde jako ideální příklad, kdy ho použít.
Dobře. A jak by jste napsal metodu, která by nakreslila všechny čtyři, zadáním specifickým parametrů, a nebyla složitá.
Ano, cyklus je jednoduchý. Ale musíte uznat, že metoda rozhodně jednoduchá není. A volat ji čtyřikrát, přitom mají všechny stejný tvar, pouze rozdílnou pozici a otočení, mně přijde nesmyslné.
Klonování jsem nikdy nepoužíval, ale proto tam přece je? Ne?
Díky
Nikdo neříká, že máš vzít současnou metodu bez úprav a pustit ji čtyřikrát.
Jaké klonování máš na mysli?
Klonování není v tomhle případě vhodné, lepší je tohle.
Problémem je, že to na konci zhavaruje, protože přidávám duplicitní objekty.
A tady jsem opět u otázky, jak to dostat na požadované místo?
Tak jsem trochu upravil kód.
Jenže, jednak nevím, jak rozumně pojmenovat proměnné a jak bych to zjednodušil.
Máte, prosím Vás, nějaký nápad?
Děkuji
PS. Proměnné, začínající height, určují % výšku obrazovky, znázorněnou číslem na konci - height50 = 50% z height