2012-01-31 3 views
6

Я пытаюсь получить CATransform3D, который будет отображать квадрат с четырьмя угловыми точками на другой квад с четырьмя новыми угловыми точками. Я потратил немного времени на изучение этого, и кажется, что шаги включают преобразование исходного Квадрата в Квадрат, а затем преобразование этого Квадрата в новый Квад. Мои методы выглядеть следующим образом (код заимствованные из here):Возврат CATransform3D для отображения четырехугольника в четырехугольник

- (CATransform3D)quadFromSquare_x0:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { 

    float dx1 = x1 - x2, dy1 = y1 - y2; 
    float dx2 = x3 - x2, dy2 = y3 - y2; 
    float sx = x0 - x1 + x2 - x3; 
    float sy = y0 - y1 + y2 - y3; 
    float g = (sx * dy2 - dx2 * sy)/(dx1 * dy2 - dx2 * dy1); 
    float h = (dx1 * sy - sx * dy1)/(dx1 * dy2 - dx2 * dy1); 
    float a = x1 - x0 + g * x1; 
    float b = x3 - x0 + h * x3; 
    float c = x0; 
    float d = y1 - y0 + g * y1; 
    float e = y3 - y0 + h * y3; 
    float f = y0; 

    CATransform3D mat; 

    mat.m11 = a; 
    mat.m12 = b; 
    mat.m13 = 0; 
    mat.m14 = c; 

    mat.m21 = d; 
    mat.m22 = e; 
    mat.m23 = 0; 
    mat.m24 = f; 

    mat.m31 = 0; 
    mat.m32 = 0; 
    mat.m33 = 1; 
    mat.m34 = 0; 

    mat.m41 = g; 
    mat.m42 = h; 
    mat.m43 = 0; 
    mat.m44 = 1; 

    return mat; 

} 

- (CATransform3D)squareFromQuad_x0:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { 

    CATransform3D mat = [self quadFromSquare_x0:x0 y0:y0 x1:x1 y1:y1 x2:x2 y2:y2 x3:x3 y3:y3]; 

    // invert through adjoint 

    float a = mat.m11,  d = mat.m21, /* ignore */   g = mat.m41; 
    float b = mat.m12,  e = mat.m22, /* 3rd col*/   h = mat.m42; 
    /* ignore 3rd row */ 
    float c = mat.m14,  f = mat.m24; 

    float A =  e - f * h; 
    float B = c * h - b; 
    float C = b * f - c * e; 
    float D = f * g - d; 
    float E =  a - c * g; 
    float F = c * d - a * f; 
    float G = d * h - e * g; 
    float H = b * g - a * h; 
    float I = a * e - b * d; 

    // Probably unnecessary since 'I' is also scaled by the determinant, 
    // and 'I' scales the homogeneous coordinate, which, in turn, 
    // scales the X,Y coordinates. 
    // Determinant = a * (e - f * h) + b * (f * g - d) + c * (d * h - e * g); 
    float idet = 1.0f/(a * A   + b * D   + c * G); 

    mat.m11 = A * idet;  mat.m21 = D * idet;  mat.m31 = 0; mat.m41 = G * idet; 
    mat.m12 = B * idet;  mat.m22 = E * idet;  mat.m32 = 0; mat.m42 = H * idet; 
    mat.m13 = 0  ;  mat.m23 = 0  ;  mat.m33 = 1; mat.m43 = 0  ; 
    mat.m14 = C * idet;  mat.m24 = F * idet;  mat.m34 = 0; mat.m44 = I * idet; 

    return mat; 

} 

После вычисления обеих матриц, умножения их вместе, и сопоставляя точки зрения в вопросе, я в конечном итоге в преобразованном виде, но это дико неправильно. На самом деле, кажется, он сдвигается, как параллелограмм, независимо от того, что я делаю. Что мне не хватает?

UPDATE 2/1/12

Кажется, причиной я бег в проблемы может быть то, что мне нужно, чтобы приспособить для FOV и фокусного расстояния в матрицу вида модели (которая является единственной матрицей I может быть изменен непосредственно в Quartz.) Мне не повезло найти документацию в Интернете о том, как рассчитать правильную матрицу.

+0

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

+0

Вот еще один способ добиться этого: http://stackoverflow.com/questions/9470493/transforming-a-rectangle-image-into-a-quadrilateral-using-a-catransform3d Сообщите мне, если это поможет. – MonsieurDart

ответ

3

мне удалось достичь этого путем переноса и объединения квадро коробление и код гомография из этих двух ссылок:

UPDATE: Я с открытым исходным кодом небольшой класс, который делает это: https://github.com/dominikhofmann/DHWarpView

+1

Привет, не могли бы вы дать немного больше информации о том, какой код вы портировали и комбинировали? В настоящее время я пытаюсь решить ту же проблему, что и вы, но я никуда не денусь. Благодаря! – KPM

+0

Добро пожаловать в переполнение стека! Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259) включить основные части ответа здесь и предоставить ссылку для справки. –

+0

Спасибо за отзыв. Я открыл исходный класс, который я написал, чтобы выполнить это – sevenflow

Смежные вопросы