Autor Wątek: Dlugosc krzywej  (Przeczytany 1519 razy)

Offline lastseeds

  • Użytkownik

# Luty 20, 2011, 21:32:47
Powiedzmy ze rysuje sobie w paincie krzywą.... da się jakoś policzyć jej dlugosc(wzory chyba odpadaja), procz iterowania po wszystkich pixelach?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Luty 20, 2011, 22:02:31
krzywą rysujesz pixelami (linia to też pixele), więc po prostu zliczaj ile pikseli stawiasz

Offline Kos

  • Użytkownik
    • kos.gd

# Luty 20, 2011, 22:12:36
@up - Nie do końca. :)

Odległość między sąsiednimi pikselami to 1, odległość między pikselami stykającymi się rogiem to sqrt(2).

Jeśli mamy prosty odcinek idący pod kątem, nie wiem, 30 stopni, to fajnie byłoby by nasze podejście było w stanie policzyć poprawnie jego długość - a zliczaniem pikseli dostaniemy sporą nadwyżkę.

Zakładam, że masz tą krzywą zapisaną w takiej postaci, że jesteśmy w stanie iterować po jej "kolejnych" pikselach? Potrzebujemy tego, by jednoznacznie wiedzieć jak przebiega, jeśli np. przecina samą siebie.

Zacznijmy od czegoś takiego: bierzemy co N-ty piksel i liczymy jego faktyczną odległość od poprzedniego. Tutaj dla prostej linii dostaniemy kosmicznie lepsze wyniki niż zliczając piksele. Co ciekawe, im rzadziej będziemy próbkować, tym lepiej, bo więcej możliwych kątów damy radę odwzorować. Licząc piksele po kolei mamy tylko 0 stopni i 45, licząc co drugi możemy już "zrozumieć" prostą mającą nachylenie 22.5 stopni, itd.

Ale jeśli krzywa się wykręca, to odwrotnie - musimy próbkować częściej, by nie przegapić szczegółów! Zatem tak źle, i tak niedobrze...

Proponuję iterować zatem po pikselach i patrzeć, jak dla kolejnych pikseli zmienia się wektor kierunkowy od "ostatniego liczonego piksela". Jeśli wektor odchyli się za dużo - mówimy "stop", liczymy odległość aktualnego od "ostatnio liczonego", i tak do końca krzywej. Wtedy linia prosta zostanie policzona jako 1 odcinek (czyli dokładnie), a wygibasy będą liczone co piksel lub co kilka. To już powinno dać w miarę sensowne wyniki.

Offline maciek_slon

  • Użytkownik

# Luty 20, 2011, 22:18:54
Jeśli podejść do problemu literalnie, z pytania, czyli rysujesz w Paincie przy użyciu narzędzia krzywa, to:
- rysujesz krzywą beziera o 4 punktach kontrolnych (początek, koniec, i dwa wyciągacze)
- skoro tak, to znając współrzędne tych punktów ze wzoru możńa policzyć jej długość ;P

Ale to takie rozwiązanie dość mocno naciągane ;P Bo ten paint to był zapene tylko taki o, przykład na przykład ;-)

Offline yorp

  • Użytkownik
    • ProfessionGG Project

# Luty 21, 2011, 22:17:26
jezeli nie jestes wstanie liczyc tego zanim krzywa zostanie narysowana (pobieranie wsp. myszki) tylko masz bitmape, to przyszlo mi cos takiego na mysl, zebys skalowal proporcjonalnie wycinek, az do momentu, kiedy powstanie z tego prosta. Potem zliczasz dlugosc jadac od lewej do prawej, a jak wiemy np. ze narysowana jest tylko krzywa, badz znamy jej kolor, to mozna sprobowac zrobic b/w i znalezc pierwszy pixel od lewej, ostatni od prawej i policzyc odleglosc. Nie wiem oczywiscie czy zadziala, ale skoro skala jest proporcjonalna to powinno. Dla zawijajacych sie krzywych, bierzesz mniejsze wycinki.

Innym sposobem, jest obliczenie, jezeli wiemy, ze np. krzywa jest budowana z lukow, wspolczynnika przegiecia na lewej i prawej krawedzi i wyliczyc matematycznie. Tak dla kazdego luku (luk mozna wykryc po tym ze zmienia przegiecie).

Ostatnim sposobem, ktory przyszedl mi na mysl, to zliczenie reszt z dzielenia, czyli odwrocenie algorytmu interpolujacego linie. W ten sposob powinnismy moc, dla kazdego typu krzywych obliczyc dlugosc bardzo dokladnie. (narysuj sobie siatke na kartce papieru i pociagnij jakakolwiek linie, zapalasz te pixele w ktorych znajduje sie linia, zobacz sobie ze dla gestej siatki jestes w stanie szybko wyznaczyc katy i dalej liczyc matematycznie ).

Offline lastseeds

  • Użytkownik

# Luty 21, 2011, 23:27:58
dziekowa