Wypełnianie obszaru kolorem

0
for (int i=0; i< 350; i++){
    linia.add(new Punkt(i, 2*i)); /*Linia jest listą obiektów Punkt (zawierających int x i y), a y= 2*x funkcją liniową (wykres to linia na skos) */

}

for (int i=0; i< 20/*linia.size()*/; i++){
			
   for (int x = 0; x<linia.get(i).x; x++){

	for (int y=0; y<linia.get(i).y; y++ ){

	diskImage.setRGB(x, y, 255);

	}
   }	
}

Co zrobiłem źle, że zamiast trójkąta kolorem 255 wypełnia się prostokąt ?

0

Nie rozumiem pytania, wypełniasz kolejno kolorem 255 dwadzieścia prostokątów. Każdy kolejny prostokąt zawiera poprzedni, więc naprawdę wypełniasz tylko ostatni prostokąt (dla i = 19).

0

Jak wobec tego za pomocą funkcji setRGB wypełnić trójkąt którego wierzchołkami są : A (0; 0), B (linia.get(0).x; linia.get(0).y), C (0; linia.get(19).y) ?

0

Jak dokładnie brzmi pytanie:

  1. Jak wypełnić trójkąt za pomocą funkcji setRGB?
  2. Jak wypełnić trójkąt?
    Odpowiedź na drugie pytanie jest prosta: tworzysz obiekt p klasy Polygon https://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html i wywołujesz metodę fillPolygon(p).
    Pierwsze jest trochę trudniejsze.
0

Chodzi mi o pierwsze, ponieważ chcę zmieniać na inny kolor każdego z pikseli, które zawierają się w tym trójkącie.

colour = diskImage.getRGB(x, y);
diskImage.setRGB(x, y, 255 -colour);

Nazywa się to chyba nałożeniem maski.

0

Ręce opadają. Przecież napisałeś, że chcesz zmienić kolor każdego piksela na 255. Podany sposób z klasą Polygon to zapewnia.

0

Chodziło mi o to co powyżej, ale chciałem najpierw spytać o pętlę.
Chyba mam w niej błąd, bo 255-color daje mi czarno-białe paski w obszarze prostokąta.

1

Nie nadążam za Tobą, poszczególne posty są mało zrozumiałe i sprzeczne ze sobą. Nie wiem jaki masz kod, nie wiem co chcesz osiągnąć. Narysuj sobie trójkąt na kartce, napisz równania boków, pętla będzie wyglądać mniej więcej tak:

for(int i=minY,i<=maxY,i++)
{
    for(int j = ...;j<=...;j++)
    {
    }
}

Zamiast kropek wpisz wyrażenia wynikające z równań boków trójkąta.

1

Najprostrze rozwiązanie - możesz zrobić pętlę po całym trójkącie (ekstremach punktów/prostokącie zawierającym konkretnie), i sprawdzać dla każdego punktu czy leży wewnątrz trójkąta:

float sign (fPoint p1, fPoint p2, fPoint p3)
{
    return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}

bool pointInTriangle (fPoint pt, fPoint v1, fPoint v2, fPoint v3)
{
    bool b1, b2, b3;

    b1 = sign(pt, v1, v2) < 0.0f;
    b2 = sign(pt, v2, v3) < 0.0f;
    b3 = sign(pt, v3, v1) < 0.0f;

    return ((b1 == b2) && (b2 == b3));
}

(Skopiowane z SO. Kod tutaj korzysta pośrednio z właściwości współrzędnych barycentrycznych, które być może Ci się przydadzą i podczas kolorowania trójkąta wewnątrz - np. do interpolacji - i i tak je będziesz musiał liczyć).

Wada: nieoptymalne rozwiązanie.

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