Я пытаюсь заполнить треугольник, используя горизонтальные линии, и я не могу понять, что не так с моим текущим методом.Прежде чем кто-то скажет просто использовать fillPolygon, я не могу это использовать.Мне нужно заполнить его, используя строки.Кажется, что в одних ситуациях все работает нормально, а в других - полностью.
Вот так это должно выглядеть.Но затем я попытался применить свой метод к вращающемуся трехмерному кубу и ...
Я понятия не имею, что не так.Кроме того, красные границы также являются одним из моих методов треугольника.Они отлично работают, и заполненные треугольники и выделенные треугольники имеют одинаковые введенные вершины.
public void filledTri(int x1,int y1,int x2,int y2,int x3,int y3){
int[] xs = {x1,x2,x3};
int[] ys = {y1,y2,y3};
//Sort vertices in vertical order so A/1 is highest and C/3 is lowest
int I,tempx,tempy;
for(int i=1;i<3;i++){
I = i-1;
tempx = xs[i];
tempy = ys[i];
while(I>=0&&tempy<ys[I]){
xs[I+1] = xs[I];
ys[I+1] = ys[I];
I--;
}
xs[I+1] = tempx;
ys[I+1] = tempy;
}
//Set left and right edges
linepts ab = new linepts(xs[0],ys[0],xs[1],ys[1]),
ac = new linepts(xs[0],ys[0],xs[2],ys[2]);
linepts[] lines = {ab.getEndX() < ac.getEndX() ? ab : ac,
ab.getEndX() > ac.getEndX() ? ab : ac,
new linepts(xs[1],ys[1],xs[2],ys[2])};
//Fill triangle
int startY = ys[0],endY = ys[2];
for(int y=startY;y<=endY;y++){
if(y>ys[1])
horizontalLine((int)Math.round(lines[2].getX(y)),
y,
(int)Math.round(lines[1].getX(y)));
else
horizontalLine((int)Math.round(lines[0].getX(y)),
y,
(int)Math.round(lines[1].getX(y)));
}
getX (int y) возвращает мне координату x, где линия проходит через значение y.Если это горизонтальная линия, она просто возвращает начало линии x
Точка A является самой высокой на экране и самым низким значением, B является серединой, а C является самой низкой на экране и самым высоким значением
Я использую буферизованное изображение на jframe, чтобы нарисовать его, если это поможет.