Hallo,
ich würde gerne ein Dreieck auf ein BufferedImage Zeichnen, ohne dabei java.awt.Graphics zu benutzen. Das heißt jetzt also, dass alles was ich habe die Methode img.setRGB() (also die Methode um ein einzelnes Pixel anzusteuern) und die Koordinaten der Eckpunkte der Dreiecks sind. Mein erster Lösungsansatz sah ungefähr so aus:
Leider ist dieser Code nicht effizient genug und er zeichnet auch kein 100% korrekten Dreiecke.
Es währe super, wenn mir jemand sagen könnte, wie man so etwas besser machen könnte.
ich würde gerne ein Dreieck auf ein BufferedImage Zeichnen, ohne dabei java.awt.Graphics zu benutzen. Das heißt jetzt also, dass alles was ich habe die Methode img.setRGB() (also die Methode um ein einzelnes Pixel anzusteuern) und die Koordinaten der Eckpunkte der Dreiecks sind. Mein erster Lösungsansatz sah ungefähr so aus:
Java:
public static void fill_triangle(int[][] c, BufferedImage img, int[] rgb) {
Arrays.sort(c, new Comparator<int[]>() {
@Override
public int compare(int[] o2, int[] o1) {
return Integer.compare(o2[1], o1[1]);
}
});
double f1 = (double)(c[0][0] - c[1][0]) / (double)(c[1][1] - c[0][1]);
double f2 = (double)(c[0][0] - c[2][0]) / (double)(c[2][1] - c[0][1]);
double f3 = (double)(c[1][0] - c[2][0]) / (double)(c[2][1] - c[1][1]);
//double f4 = (double)(c[0][2] - c[1][2]) / (double)(c[0][0] - c[1][0]);
//double f5 = (double)(c[0][2] - c[2][2]) / (double)(c[0][0] - c[2][0]);
int i1 = 1; int i2 = 1; int rx1 = 0; int rx2 = 0; int ry = 0;
while(c[0][1] + i1 <= c[2][1] ) {
if(c[0][1] + i1 <= c[1][1]) {
rx1 = c[0][0]-(int)((i1-1) * f1);
ry = c[0][1] + (i1-1);
}
else {
rx1 = (int)(c[1][0]-((i2-1) * f3));
ry = c[0][1] + (i1-1);
i2++;
}
rx2 = c[0][0]-(int)((i1-1) * f2);
i1++;
DVL(rx1, rx2, ry, img, rgb);
}
if(c[0][1] == c[1][1] && c[1][1] == c[2][1]) {
DVL(c[0][0], c[1][0], c[0][1], img, rgb);
DVL(c[1][0], c[2][0], c[0][1], img, rgb);
DVL(c[0][0], c[2][0], c[0][1], img, rgb);
}
else if(c[0][1] == c[1][1]) {
DVL(c[0][0],c[1][0],c[0][1], img, rgb);
}
}
public static void DVL(int x1, int x2, int y, BufferedImage img, int[] rgb) {
int i = 0;
if (x1 < x2) {
while(i + x1 <= x2) {
if(x1 + i < DISPLAY.screenSizeL[0] && x1 + i >= 0 && y >= 0 && y < DISPLAY.screenSizeL[1]) {
img.setRGB(x1 + i, y, Color.HSBtoRGB(rgb[0], rgb[1], rgb[2]));
}
i++;
}
}
else if (x1 > x2) {
while(i + x2 <= x1) {
if(x2 + i < DISPLAY.screenSizeL[0] && x2 + i >= 0 && y >= 0 && y < DISPLAY.screenSizeL[1]) {
img.setRGB(x2 + i, y, Color.HSBtoRGB(rgb[0], rgb[1], rgb[2]));
}
i++;
}
}
else {
if(x2< DISPLAY.screenSizeL[0] && x2 >= 0 && y >= 0 && y < DISPLAY.screenSizeL[1]) {
img.setRGB(x2, y, Color.HSBtoRGB(rgb[0], rgb[1], rgb[2]));
}
}
}
Leider ist dieser Code nicht effizient genug und er zeichnet auch kein 100% korrekten Dreiecke.
Es währe super, wenn mir jemand sagen könnte, wie man so etwas besser machen könnte.