У меня проблемы с поиском точки преобразования для отображения пикселей. Допустим, у меня есть массив из 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;
}
Вот изображение с применением этого метода . Однако есть пиксели, которые не были заполнены, потому что ни один из пикселей исходного изображения не преобразован в эти пиксели на преобразованном изображении. Чтобы обойти это, начинайте с каждого пикселя на преобразованном изображении и работайте задом наперед, но мне трудно понять, как это сделать.