Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno JavaFX - Jak rozdělit oblouk (Arc) na pětiny?

Dobrý den,

Potřebuji rozdělit Arc.

Když např. zadám

...
Arc arc = new Arc(700, 700, 500, 500, 90, 90);
arc.setFill(Color.TRANSPARENT);
arc.setStroke(Color.BLACK);
...

jak ho rozdělím na pětiny? U čáry je to jednoduché, ale tady to nelze pouze vydělit.

Každá část má 18 stupňů, ale jak vypočítám, kde na oblouku jsou odděleny jednotlivé části.

Prosím Vás o radu,

Děkuji

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
package sample; import javafx.application.Application; import javafx.scene.Group; import javafx.sce…
MaSo 24.02.2019 11:45
MaSo
Asi jsme to nepochopili dva, protože mi to taky přijde naprosto primitivní.
Wikan 24.02.2019 11:47
Wikan
Já jsem to pochopil tak, že přes to chce malovat něco jiného, např. úsečky. Ale zřejmě to byl ten p…
touchwood 24.02.2019 18:05
touchwood
Omlouvám se, ale dnes jsem nemohl. Ano, šlo mi o kreslení úseček. Ale proto potřebuji znát dvě souř…
MichalDM 24.02.2019 23:53
MichalDM
Souřadnice bodu na kružnici pro daný střed (x0, y0) úhel (alfa) a poloměr kružnice (r) máš zde: [41…
touchwood 25.02.2019 07:37
touchwood
Prosím tě, jak to mám zadat? Tohle vůbec nevychází double x = 700 + (500 * Math.cos(1.617)); doub…
MichalDM 25.02.2019 23:37
MichalDM
Co má být za úhel těch 1.617? Je to něco přes 92 stupňů.
Wikan 26.02.2019 06:22
Wikan
Proč je tam teda fí(1.617)? Když v kódu, co jsem výše napsal, změním sin na cos, tak tam můžu dosad…
MichalDM 26.02.2019 08:55
MichalDM
Vysvětlím to pootočení: Každý úhel "někde" začíná. U matematických funkcí sin/cos je to jasné, úzus…
touchwood 26.02.2019 17:31
touchwood
Takhle lze rozdělit 90° oblouk (čtvrt kruhu) na 5 částí. Omlouvám se, ale výpočet výše je chybný, pr…
MichalDM 26.02.2019 22:34
MichalDM
popsal jsi toho spousty, ale nic jsi vlastně nesdělil, kromě toho, že funkce Arc zřejmě maluje v obr…
touchwood 27.02.2019 07:47
touchwood
Tak jsem udělal chybu. Kód výše sice přesně vyznačí část kruhu, ale dělící čáry nakreslí špatně. Ten… poslední
MichalDM 05.03.2019 23:47
MichalDM

package sample;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
import javafx.scene.shape.StrokeType;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        Arc arc = new Arc(700, 700, 500, 500, 90, 18);
        arc.setFill(Color.TRANSPARENT);
        arc.setStroke(Color.BLACK);
        arc.setType(ArcType.OPEN);
        arc.setStrokeWidth(1);
        arc.setStrokeType(StrokeType.INSIDE);


        Arc arc2 = new Arc(700, 700, 500, 500, 108, 18);
        arc2.setFill(Color.TRANSPARENT);
        arc2.setStroke(Color.GREEN);
        arc2.setType(ArcType.OPEN);
        arc2.setStrokeWidth(1);
        arc2.setStrokeType(StrokeType.INSIDE);

        Arc arc3 = new Arc(700, 700, 500, 500, 126, 18);
        arc3.setFill(Color.TRANSPARENT);
        arc3.setStroke(Color.RED);
        arc3.setType(ArcType.OPEN);
        arc3.setStrokeWidth(1);
        arc3.setStrokeType(StrokeType.INSIDE);


        // atd...

        stage.setScene(new Scene(new Group(arc, arc2, arc3), 700, 700));
        stage.show();


    }

    public static void main(String[] args) {
        launch(args);
    }
}

Nebo jsem neco nepochopil?

Omlouvám se, ale dnes jsem nemohl.

Ano, šlo mi o kreslení úseček. Ale proto potřebuji znát dvě souřadnice. První je automaticky střed a druhé je pozice "místa" na oblouku, kde jsou rozděleny jednotlivé části.

Když si nakreslím úsečku pod požadovaným úhlem a v místě, kde se dotýká oblouku, udělám kolmici na spodní hranu, tak mi vyjde pravoúhlý trojúhelník. U něho znám všechny úhly, délku přepony a zbytek dopočítám

Arc arc = new Arc(700, 700, 500, 500, 90, 90);
arc.setFill(Color.TRANSPARENT);
arc.setStroke(Color.BLACK);
double a = 500 * Math.sin(72);
double b = Math.sqrt((500 * 500) - (a * a));
Line line = new Line(700, 700, 700 - b, 700 - a);

Děkuji

Vysvětlím to pootočení: Každý úhel "někde" začíná. U matematických funkcí sin/cos je to jasné, úzus uvádí nejvíce pravý bod na jednotkové kružnici (0° odpovídá ose X). Ovšem kde má 0° funkce, kterou používáš pro vykreslení oblouku, to nevím. Teoreticky by to mělo být totožné, ale nevím to, a právě proto jsem ti to napsal.

Takhle lze rozdělit 90° oblouk (čtvrt kruhu) na 5 částí. Omlouvám se, ale výpočet výše je chybný, protože metodě sin je nutné zadat parametr v radiánech.

Arc arc = new Arc(600, 600, 400, 400, 0, 90);
arc.setFill(Color.TRANSPARENT);
arc.setStroke(Color.BLACK);
double a = 400 * Math.sin(Math.toRadians(72));
double b = 400 * Math.sin(Math.toRadians(18));
Line line1 = new Line(600, 600, 600, 200);
Line line2 = new Line(600, 600, 600 + a, 600 - b);
Line line3 = new Line(600, 600, 600 + b, 600 + a);
Line line4 = new Line(600, 600, 600 - a, 600 + b);
Line line5 = new Line(600, 600, 600 - b, 600 - a);
Line line6 = new Line(600, 600, 1000, 600);

Takhle vytvořím čtvrtinu "koláče" rozdělenou na pětiny.
Co se týče tvého pootočení, určuje to pátý parametr a funguje to jak u minutové ručičky. Takže v příkladu výše, je to celé něco jako "část hodin" od 0 do 15.
Pokud to chcete jinak otočené, tak je nutné, v kódu výše, změnit

"15-30"

Arc arc = new Arc(600, 600, 400, 400, 90, 90);
a = 400 * Math.sin(Math.toRadians(54));
b = 400 * Math.sin(Math.toRadians(36));
Line line1 = new Line(600, 600, 1000, 600);
Line line6 = new Line(600, 600, 600, 1000);

"30-45"

Arc arc = new Arc(600, 600, 400, 400, 180, 90);
a = 400 * Math.sin(Math.toRadians(36));
b = 400 * Math.sin(Math.toRadians(54));
Line line1 = new Line(600, 600, 600, 1000);
Line line6 = new Line(600, 600, 200, 600);

"45-60"

Arc arc = new Arc(600, 600, 400, 400, 270, 90);
a = 400 * Math.sin(Math.toRadians(18));
b = 400 * Math.sin(Math.toRadians(72));
Line line1 = new Line(600, 600, 200, 600);
Line line6 = new Line(600, 600, 600, 200);

Doufám, že jsem tam neudělal chybu.

A teď mi, prosím Vás, řekněte, jak bych využil ty vzorce respektive, jestli by to šlo zjednodušit.

Děkuji

Tak jsem udělal chybu. Kód výše sice přesně vyznačí část kruhu, ale dělící čáry nakreslí špatně. Tenhle kód je už doufám správný.


Arc arc = new Arc(600, 600, 400, 400, 0, 90);
arc.setFill(Color.TRANSPARENT);
arc.setStroke(Color.BLACK);
Line line1 = new Line(600, 600, 600, 200);
double a = 400 * Math.cos(Math.toRadians(18));
double b = 400 * Math.sin(Math.toRadians(18));
Line line2 = new Line(600, 600, 600 + a, 600 - b);
a = 400 * Math.cos(Math.toRadians(36));
b = 400 * Math.sin(Math.toRadians(36));
Line line3 = new Line(600, 600, 600 + a, 600 - b);
a = 400 * Math.cos(Math.toRadians(54));
b = 400 * Math.sin(Math.toRadians(54));
Line line4 = new Line(600, 600, 600 + a, 600 - b);
a = 400 * Math.cos(Math.toRadians(72));
b = 400 * Math.sin(Math.toRadians(72));
Line line5 = new Line(600, 600, 600 + a, 600 - b);
Line line6 = new Line(600, 600, 1000, 600);

"15-30"

Arc arc = new Arc(600, 600, 400, 400, 90, 90);
Line line1 = new Line(600, 600, 1000, 600);
Line line6 = new Line(600, 600, 600, 1000);
Line line2,3,4,5 = new Line(600, 600, 600 + b, 600 + a);

"30-45"

Arc arc = new Arc(600, 600, 400, 400, 180, 90);
Line line1 = new Line(600, 600, 600, 1000);
Line line6 = new Line(600, 600, 200, 600);
Line line2,3,4,5 = new Line(600, 600, 600 - a, 600 + b);

"45-60"

Arc arc = new Arc(600, 600, 400, 400, 270, 90);
Line line1 = new Line(600, 600, 200, 600);
Line line6 = new Line(600, 600, 600, 200);
Line line2,3,4,5 = new Line(600, 600, 600 - b, 600 - a);

A tímhle bych to konečně uzavřel. Díky všem.

Zpět do poradny Odpovědět na původní otázku Nahoru