Нахождение точки на карте текстуры - PullRequest
0 голосов
/ 12 марта 2020

У меня проблемы с поиском точки преобразования для отображения пикселей. Допустим, у меня есть массив из 4 точек, представляющих углы изображения по часовой стрелке, начиная с верхнего левого угла. Они не должны быть в прямоугольнике, и края могут пересекаться. У меня есть:

float[][] transform = {
                {10, 0},
                {450, 30},
                {110, 300},
                {0, 150}
};

Я хочу создать метод, который принимает точку (float []) на экране и возвращает точку с x и y между 0 и 1, которая представляет точку в преобразовании , Я использую это для создания текстурированного многоугольника, используя метод, аналогичный Affine Transform.

У меня есть 2 изображения: одно для исходного изображения, а другое с размерами ограничительной рамки преобразованного изображения, который я буду использовать для рисования. Я уже сделал метод для прохождения каждого пикселя исходного изображения и сопоставления его с местом в преобразовании:

public static float[] getPoint(float[][] transform, float[] point)
{   
    float x1 = lerp(transform[0][0], transform[1][0], point[0]);
    float x2 = lerp(transform[3][0], transform[2][0], point[0]);
    float y1 = lerp(transform[0][1], transform[1][1], point[0]);
    float y2 = lerp(transform[3][1], transform[2][1], point[0]);

    float x = lerp(x1, x2, point[1]);
    float y = lerp(y1, y2, point[1]);
    return new float[] {x, y};
}
public static float lerp(float a, float b, float scale)
{
    return a + (b-a)*scale;
}

Вот изображение с применением этого метода . Однако есть пиксели, которые не были заполнены, потому что ни один из пикселей исходного изображения не преобразован в эти пиксели на преобразованном изображении. Чтобы обойти это, начинайте с каждого пикселя на преобразованном изображении и работайте задом наперед, но мне трудно понять, как это сделать.

...