eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › circle midpoint + windowing, reverse, REAKTYWACJA
Ilość wypowiedzi w tym wątku: 32

  • 1. Data: 2015-10-08 13:51:10
    Temat: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>

    witam,
    jakiś czas temu zaimplementowałem okienkowanie i rysowanie okręgu o dużym promieniu,
    którego nie obsługuje poprawnie standardowe API,
    conajmniej Java SDK oraz API Javy w Androidzie, sadzę że w przypadku wielu innych API
    w innych językach jest podobnie.

    Przypomnę interesują mnie przypadki rysowania wycinku łuku i jego okienkowania.
    Opracowałem sprawny algorytm ustalania które ćwiartki należy rysować, które z nich w
    pelni a które tylko częściowo. Samo rysowanie odbywa się juz w oktetach,
    (ćwiarki są dzielona na pół).

    Czasami pojawiają się drobne problemy ze zgraniem pikseli, czyli w pewnych
    przypadkach wystepuje maksymalnie blad o 1 piksel. Widoczne to jest przy kacie 45
    stopni.

    Błąd wynika z pozycjonowania oktetu a nie ze sposobu jego rysowania.
    Z racji tego że punkty startowe sa wyliczane jako double a orginalny midpoint jest
    int więc w tym musiał bym szukać problemu. Sama juz procedura rysowania jest bardzo
    podobna do midpoint.

    Moim zdaniem najlepszym doraźnym rozwiazaniem problem było by rysowanie
    okretów w przeciwnym kierunku niż to ma miejsce w orginalnym midpoincie.
    Obliczenie punktu przy kącie 45 stopni polegało by na przemnozeniu raduisa
    przez stałą. Oktety korzystały by z tych samych danych początkowych więc musiały by
    być idealnie dopasowane i symetryczne.

    Ponadto takie podejście jest bardziej korzystne jeśli chcemy rysować to co widoczne
    jest wewnątrz okna, bo okno obcina gore-dol-lewo-prawi zostawiając
    fragment koła pomiędzy, więc często obszary przy kącie 45 stopni są widoczne.

    Macie jakieś pomysły jak odwrócić prodecure midpoint,
    aby działała w przeciwnym kierunku?

    Nie jestem pewien czy ze punktem wyjścia do opracowania mojej prodecury była by
    orginalna procedura midpoint czy ta zoptymalizowana.




  • 2. Data: 2015-10-09 13:16:53
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>

    > Macie jakieś pomysły jak odwrócić prodecure midpoint,
    > aby działała w przeciwnym kierunku?
    >
    > Nie jestem pewien czy ze punktem wyjścia do opracowania mojej prodecury była by
    orginalna procedura midpoint czy ta zoptymalizowana.

    Chyba będę musiał dokładnie przeanalizować procedure midpoint 0-45 stopni
    I opracuję swoją działającą na 45-0, zobaczę wtedy jakie bedą rezultaty.

    Patrząc na mój kod dla dwóch klas rysujących koło i wycinek koła w oknie,
    to mam 8 metod do midpoint, czyli na każdy oktet z osobna, bo tak chyba najszybciej i
    najprościej w przypadku wycinków koła o dużym promieniu. Pozostaje mi tylko opracować
    8 nowych metod które rysują w przeciwnym kierunku tzn od wartosci 45 do wartosci
    granicznych.

    Wydaje mi się to proste, podstawowa różnica polega na innej inicjalizacji zmiennej
    decyzyjnej d oraz inkrementowaniu zmiennych decyzyjnych
    z przeciwnym znakiem jak to jest w orginalnej procedurze.


  • 3. Data: 2015-10-09 19:40:43
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: firr <p...@g...com>

    W dniu piątek, 9 października 2015 13:16:55 UTC+2 użytkownik Radoslaw Jocz napisał:
    > > Macie jakieś pomysły jak odwrócić prodecure midpoint,
    > > aby działała w przeciwnym kierunku?
    > >
    > > Nie jestem pewien czy ze punktem wyjścia do opracowania mojej prodecury była by
    orginalna procedura midpoint czy ta zoptymalizowana.
    >
    > Chyba będę musiał dokładnie przeanalizować procedure midpoint 0-45 stopni
    > I opracuję swoją działającą na 45-0, zobaczę wtedy jakie bedą rezultaty.
    >
    to jest akurat dobry pomysl, sam to odkladalem a w koncu trzaba to zrobic.. zwłaszcza
    ze akurat nie ma nic do roboty


  • 4. Data: 2015-10-10 15:23:11
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>

    On Friday, October 9, 2015 at 6:40:45 PM UTC+1, firr wrote:
    > W dniu piątek, 9 października 2015 13:16:55 UTC+2 użytkownik Radoslaw Jocz napisał:
    > > > Macie jakieś pomysły jak odwrócić prodecure midpoint,
    > > > aby działała w przeciwnym kierunku?
    > > >
    > > > Nie jestem pewien czy ze punktem wyjścia do opracowania mojej prodecury była by
    orginalna procedura midpoint czy ta zoptymalizowana.
    > >
    > > Chyba będę musiał dokładnie przeanalizować procedure midpoint 0-45 stopni
    > > I opracuję swoją działającą na 45-0, zobaczę wtedy jakie bedą rezultaty.
    > >
    > to jest akurat dobry pomysl, sam to odkladalem a w koncu trzaba to zrobic..
    zwłaszcza ze akurat nie ma nic do roboty

    pomysł w tym zły w tym sensie że startujesz od punktu obliczonego jako liczba
    rzeczywista

    x i y inicjalizuje tak:
    x = 0.70710678118654752440084436210485D * r;
    y = 0.70710678118654752440084436210485D * r;

    d inicjalizuje tak:
    double d = x*x+y*y-r*r;

    inkrementacje w petli

    if (d>=0) {
    x--; d-= 2*x+3;
    } else {
    x--; y++; d-= 2*(x-y)+5;
    }

    ale sa mniej stabilne niz te
    ktore napisalem wczeniej tzn na podstawie orginalnego midpoint 0-45

    przy katach 45 stopni dzialaja dobrze ale przy 0,90,180,270 juz gorzej,
    poki co zostane przy starym rozwiazaniu, a przy malych raduisach r<1000 bede uzywal
    te z API bo wtedy sa wystarczająco lub bardzo dokładne.

    W Javie SDK i Androidzie te funkcje sa kiepsko zrobione,
    sadzę że to nie wyjątek. Same już parametry to tych procedur w API
    sa bezsensowne co świadczy że nie są dopracowane.

    Java SDK:
    drawOval(int x, int y, int width, int height) - bezsens
    drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) - jeszcze
    większy bezsens

    Android Java:
    drawCircle(float cx, float cy, float radius, Paint paint) - bezsens na potęgę
    public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean
    useCenter, Paint paint) - bezsens
    public void drawArc (float left, float top, float right, float bottom, float
    startAngle, float sweepAngle, boolean useCenter, Paint paint) - bezsens






  • 5. Data: 2015-10-10 15:39:08
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>

    > W Javie SDK i Androidzie te funkcje sa kiepsko zrobione,
    > sadzę że to nie wyjątek. Same już parametry to tych procedur w API
    > sa bezsensowne co świadczy że nie są dopracowane.
    >
    > Java SDK:
    > drawOval(int x, int y, int width, int height) - bezsens
    > drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) -
    jeszcze większy bezsens
    >
    > Android Java:
    > drawCircle(float cx, float cy, float radius, Paint paint) - bezsens na potęgę
    > public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean
    useCenter, Paint paint) - bezsens
    > public void drawArc (float left, float top, float right, float bottom, float
    startAngle, float sweepAngle, boolean useCenter, Paint paint) - bezsens

    dlaczego sa błędnie zaprojektowane,
    w Javie SDK parametry to inty, ponadto wewnatrz też sa inty,
    stwarza to niemożność użycie przy dużym promieniu i pozycji środka daleko po za
    ekranem
    ponadto od razu za jednym zamachem chciali obsluzyć elipsę ale nawet okrąg spaprali.
    wycinek koła podobnie ale dodatkowo kąty sa jako inty, co jest też sporym
    ograniczeniem

    Android podobnie, dodatkowo floaty jako współrzędne to bezsens,
    mam wrażenie że wewnetrznie i tak działa na intach, przynajmniej co do pozycjonowania
    środka okręgu.

    Dodatkowo przeważnie nie ma w argumentach środka okręgu i promienia bezpośredno, co
    wymaga dodatkowych drobnych obliczeń ale to już najmniejszy problem.


  • 6. Data: 2015-10-10 17:02:04
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: firr <p...@g...com>

    zajrzalemikipedii i ten midpoint jest bardzo prosty, powiedzmy ze kolo ma promien 100

    [ultraszybki tutorial]

    r = 100
    zaczynamy od punktu

    pierwszy punkt:

    1) y= 0, x=100

    drugi punkt :

    zawsze robimy y++,
    x zwiekszamy albo o zero albo o minus jeden

    2) y = 1, x = 100 lub x = 99

    to ktora opcje wybrac liczymy w ifie z
    rownania okregu x*x > r*r - y*y

    i tyle, nie wiem co prawda ktore sciezki sie wybiera czy te x*x ktore sa wieksze czy
    te ktore mniejsze czy tez ew liczy sie roznice
    delta = x*x - (r*r - y*y) i bierze punkt w zaleznosci od tego po ktorej stronie ta
    roznica jest mniejsza ale to sa detale

    voila

    w twoim wypadku tych wielkich lukow mozna postawic ten poczatkowy punkt midpointem
    po czym jechac po kolei (uwazajac oczywiscie czy to jedna cwiartka czy dwie i jak
    pre-ustawic x i y).. taki midopint jak ja wyzej pisze wydaje mi sie po prostu regułą
    bez stanu, (bez jakiejs tam pamieci algorytmu jak mi sie ew wczesniej wydawalo) tak
    ze
    wszystko jest super proste, po prostu jest to regula na na x dla danego y oraz r,
    cale przyspieszenie wynika z tego ze nie trzeba liczyc pierwiastka wystarczy porownac
    kwadraty (i ew z rozwiniecia tych paru mnozonek i dodawan by zaoszczedzic z jedno lub
    ze dwa, juz w to nie che mi sie wczytywac)






  • 7. Data: 2015-10-10 17:48:49
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>


    > wszystko jest super proste, po prostu jest to regula na na x dla danego y oraz r,
    > cale przyspieszenie wynika z tego ze nie trzeba liczyc pierwiastka wystarczy
    porownac
    > kwadraty (i ew z rozwiniecia tych paru mnozonek i dodawan by zaoszczedzic z jedno
    lub ze dwa, juz w to nie che mi sie wczytywac)

    wiem to doskonale,
    problem z orginalnym midpointem jest taki ze jest dobry dla pelnych kół,
    w całości lub w większości wyswietlanych, przec co mają mały promień.

    wyobraź sobie promien 1,000,000 pikseli w oknie 640x480 czy chcesz iterowac te
    miliony niewidocznych punktów ???

    mia mam zamiaru obliczać sqrt, dla porownan potegi dlugosci wystarcza,
    I na tym polega midpoint,
    ponadto zakłada dzialania na intach wiec jest przenosny w 100%
    problem polega na tym ze ja chce okienkowac koła lub wycinki koła o dużym promieniu,
    z maksymalnym błędem +- 1 piksel na całym obwodzie co już dawno mi się udało,

    teraz tylko się zastanawiałem czy mogłbym idealnie to rysować co do piksela,
    oczywiście orginalny midpoint odpada


  • 8. Data: 2015-10-10 18:30:22
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: "M.M." <m...@g...com>

    On Saturday, October 10, 2015 at 5:48:51 PM UTC+2, Radoslaw Jocz wrote:
    > > wszystko jest super proste, po prostu jest to regula na na x dla danego y oraz r,
    > > cale przyspieszenie wynika z tego ze nie trzeba liczyc pierwiastka wystarczy
    porownac
    > > kwadraty (i ew z rozwiniecia tych paru mnozonek i dodawan by zaoszczedzic z jedno
    lub ze dwa, juz w to nie che mi sie wczytywac)
    >
    > wiem to doskonale,
    > problem z orginalnym midpointem jest taki ze jest dobry dla pelnych kół,
    > w całości lub w większości wyswietlanych, przec co mają mały promień.
    >
    > wyobraź sobie promien 1,000,000 pikseli w oknie 640x480 czy chcesz iterowac te
    miliony niewidocznych punktów ???
    > [...]

    Przeskalować przed rysowaniem?


    Pozdrawiam


  • 9. Data: 2015-10-10 18:30:43
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: firr <p...@g...com>

    W dniu sobota, 10 października 2015 17:48:51 UTC+2 użytkownik Radoslaw Jocz napisał:
    > > wszystko jest super proste, po prostu jest to regula na na x dla danego y oraz r,
    > > cale przyspieszenie wynika z tego ze nie trzeba liczyc pierwiastka wystarczy
    porownac
    > > kwadraty (i ew z rozwiniecia tych paru mnozonek i dodawan by zaoszczedzic z jedno
    lub ze dwa, juz w to nie che mi sie wczytywac)
    >
    > wiem to doskonale,
    > problem z orginalnym midpointem jest taki ze jest dobry dla pelnych kół,
    > w całości lub w większości wyswietlanych, przec co mają mały promień.
    >
    > wyobraź sobie promien 1,000,000 pikseli w oknie 640x480 czy chcesz iterowac te
    miliony niewidocznych punktów ???
    >
    > mia mam zamiaru obliczać sqrt, dla porownan potegi dlugosci wystarcza,
    > I na tym polega midpoint,
    > ponadto zakłada dzialania na intach wiec jest przenosny w 100%
    > problem polega na tym ze ja chce okienkowac koła lub wycinki koła o dużym
    promieniu, z maksymalnym błędem +- 1 piksel na całym obwodzie co już dawno mi się
    udało,
    >
    > teraz tylko się zastanawiałem czy mogłbym idealnie to rysować co do piksela,
    > oczywiście orginalny midpoint odpada

    moze spróbuj napisac midpoint ktory bedzie
    rysowac łuk od punktu A do punktu B, chyba
    nie powinno byc takie trudne - pozniej zostanie wyznaczyc A i B


  • 10. Data: 2015-10-10 19:05:40
    Temat: Re: circle midpoint + windowing, reverse, REAKTYWACJA
    Od: Radoslaw Jocz <r...@g...com>


    > moze spróbuj napisac midpoint ktory bedzie
    > rysowac łuk od punktu A do punktu B, chyba
    > nie powinno byc takie trudne - pozniej zostanie wyznaczyc A i B

    tak wlasnie jakis czas temu zrobilem,
    same procedury midpoint sa proste,
    natomiast odpowiednie i optymalne wyznaczenie punktow przeciecia z oknem
    oraz wyznaczenie oktetow itd to juz bardzie skaplikowane,
    ale to juz mam za soba,

    bede musiał kiedys później napisac odpowiedniego testcase za pomoca ktorego
    dowiem się dokładnie jak wyeliminowac błąd +-1 piksel który mnie denerwuje,

    być może ide poprostu złą ścieżką,
    moze powinienem w niektórych przypadkach reprezentować liczby rzeczywiste za pomocą
    całkowitych long to by wyelminowało problemy z zaokrągleniem, rzutowaniem itp.
    jednak do obliczeń double u mnie jest standardowe podobniej jak klasam Math w Javie a
    zależy mi na dokładności obliczeń.

    Bedę jeszcze próbował w ogóle wyeliminowanić obliczenia sqrt przy okienkowaniu,
    w moim kodzie maksymalnie 4 trzeba liczyć dla każdgo okregu lub jego wycinku.

    Kąty wycinku koła lub przecięcia okręgu z oknem można wyznaczyć za pomocą
    2 liczb całkowitych dx / dy.
    Ja też tak robię, robię nawet w pewnym miejscu w kodzie porownywanie kata za pomocą
    takich par liczb, działa do dla każdego zakresu kąta,



strony : [ 1 ] . 2 ... 4


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: