Graphics2D - rysowanie linii

0

Czy za pomocą Graphics2D da się narysować linię np. [1, 1], [10, 10] przekazując do metody argumenty w ten sposób: g2d.drawLine(10, 10, 1, 1)?

Bo mi rysuje dwie kropki w [10, 10] i [8, 8]. Co dziwne, gdy wywołam g2d.drawLine(10, 10, 3, 3) rysuje mi to samo.
Wywołanie g2d.drawLine(20, 20, 5, 10) rysuje 3 kropki w [20, 20], [16, 17], [8, 12].

Nie mogę znaleźć logicznego wyjaśnienia. Bug? Gdy x1 jest mniejsze od x2, wtedy rysuje normalnie.
Rysuję na obiekcie typu BufferedImage.

0

Mi zawsze dobrzy rysuje.. jaki system, jaka wersja jvm?

0

Microsoft Windows XP [Version 5.1.2600]

Java 1.6.0_13

0

JVM: Java HotSpot Client VM (build 11.3-b02, mixed mode, sharing)

0

Też nie miałem problemów. Możesz wyjaśnić zdanie

Rysuję na obiekcie typu BufferedImage.
Rysujesz wpierw obrazek drawImage(...), a na nim linię drawLine(...)?

0

Nie. Mam swoja klasę dziedziczącą po JPanel, w niej obiekt typu BufferedImage. Najpierw rysuję linie na BufferedImage, a później ten obraz na panelu. Inne linie (gdy x1 jest mniejszy od x2) rysuje prawidłowo, więc błędu w sposobie pisania raczej nie ma.

0

Problem rozwiązany :-D

Obraz BufferedImage był binarny (BufferedImage.TYPE_BYTE_BINARY). Zmieniłem kolor rysowania na niebieski i zdziwiło mnie, że dalej rysuje na czarno i mnie olśniło. Dlaczego na binarnym nie rysuje całej linii, tylko jej szczątki (teraz już wiem co to za punkty) - nie wiem. Ktoś wie? Z ciekawości pytam.

0
wpisałem nick napisał(a)

Problem rozwiązany :-D

Obraz BufferedImage był binarny (BufferedImage.TYPE_BYTE_BINARY). Zmieniłem kolor rysowania na niebieski i zdziwiło mnie, że dalej rysuje na czarno i mnie olśniło. Dlaczego na binarnym nie rysuje całej linii, tylko jej szczątki (teraz już wiem co to za punkty) - nie wiem. Ktoś wie? Z ciekawości pytam.

Algorytm używa rozmycia - zamiast zaznaczyć 1 pixel na kolor 255,255,255 to on zaznaczy najbliższe na kolor 255/(1-1/4)),255/(1-1/4),255/(1-1/4) (dane poglądowe - jest to oczywiście liczone w zależności od kątu pod jakim przebiega linia). Nie ma dzięki temu ostrych pixeli. w TYPE_BYTE_BINARY nie ma miejsca na na wartości pośrednie no i tyle. Zobacz czy rysowanie linij pod kątem równym wielokrotnosci 90stopni tez daje takie efekty. Możesz się pobawić setRenderingHints i może da się wyłączyć wygładzanie itp.

0
abc napisał(a)
wpisałem nick napisał(a)

Problem rozwiązany :-D

Obraz BufferedImage był binarny (BufferedImage.TYPE_BYTE_BINARY). Zmieniłem kolor rysowania na niebieski i zdziwiło mnie, że dalej rysuje na czarno i mnie olśniło. Dlaczego na binarnym nie rysuje całej linii, tylko jej szczątki (teraz już wiem co to za punkty) - nie wiem. Ktoś wie? Z ciekawości pytam.

Algorytm używa rozmycia - zamiast zaznaczyć 1 pixel na kolor 255,255,255 to on zaznaczy najbliższe na kolor 255/(1-1/4)),255/(1-1/4),255/(1-1/4) (dane poglądowe - jest to oczywiście liczone w zależności od kątu pod jakim przebiega linia). Nie ma dzięki temu ostrych pixeli. w TYPE_BYTE_BINARY nie ma miejsca na na wartości pośrednie no i tyle. Zobacz czy rysowanie linij pod kątem równym wielokrotnosci 90stopni tez daje takie efekty. Możesz się pobawić setRenderingHints i może da się wyłączyć wygładzanie itp.

Jesteś pewny tego co piszesz? Czarny to 0, 0, 0, więc i tak by wyszło 0. Poza tym jak rysuję linię z [10, 10] do [1, 1], to przecież wszystkie punkty są w takim samym położeniu względem pikseli ekranu.
Rysowanie pod kątem n*90 stopni działa prawidłowo. Renderingiem się nie bawiłem, wygładzanie jest raczej wyłączone.

0
wpisałem nick napisał(a)
abc napisał(a)
wpisałem nick napisał(a)

Problem rozwiązany :-D

Obraz BufferedImage był binarny (BufferedImage.TYPE_BYTE_BINARY). Zmieniłem kolor rysowania na niebieski i zdziwiło mnie, że dalej rysuje na czarno i mnie olśniło. Dlaczego na binarnym nie rysuje całej linii, tylko jej szczątki (teraz już wiem co to za punkty) - nie wiem. Ktoś wie? Z ciekawości pytam.

Algorytm używa rozmycia - zamiast zaznaczyć 1 pixel na kolor 255,255,255 to on zaznaczy najbliższe na kolor 255/(1-1/4)),255/(1-1/4),255/(1-1/4) (dane poglądowe - jest to oczywiście liczone w zależności od kątu pod jakim przebiega linia). Nie ma dzięki temu ostrych pixeli. w TYPE_BYTE_BINARY nie ma miejsca na na wartości pośrednie no i tyle. Zobacz czy rysowanie linij pod kątem równym wielokrotnosci 90stopni tez daje takie efekty. Możesz się pobawić setRenderingHints i może da się wyłączyć wygładzanie itp.

Jesteś pewny tego co piszesz? Czarny to 0, 0, 0, więc i tak by wyszło 0. Poza tym jak rysuję linię z [10, 10] do [1, 1], to przecież wszystkie punkty są w takim samym położeniu względem pikseli ekranu.
Rysowanie pod kątem n*90 stopni działa prawidłowo. Renderingiem się nie bawiłem, wygładzanie jest raczej wyłączone.

samo to że rysowanie pod kątem n*90 stopni działa prawidłowo, oznacza to że coś w tym jest. dane były poglądowe - tak się tego nie liczy. Chodzi o to, że zaznaczając zamiast na czarno jeden pixel - zaznaczysz na ciemno szary cztery najbliższe (nie koniecznie 4 - zależy jaki kąt, akurat przy wielokrotnosci 90 stopni zaznacza sie jeden pixel na czarno) wizualnie będzie wyglądało o wiele lepiej.
Jeśli chcesz rysowac na TYPE_BYTE_BINARY linie pod różnymi kątami do osi X, to zaimplementuj prosty Algorytm Bresenhama.

1 użytkowników online, w tym zalogowanych: 0, gości: 1