2012-01-31 39 views
6

Tôi đang cố gắng lấy ra một CATransform3D sẽ vẽ một hình tứ giác với 4 điểm góc đến một điểm tứ khác với 4 điểm góc mới. Tôi đã dành một chút thời gian nghiên cứu này và có vẻ như các bước liên quan đến việc chuyển đổi Quad ban đầu thành một Square, và sau đó chuyển đổi Square đó sang Quad mới. phương pháp của tôi trông như thế này (mã mượn từ here):Trả về CATransform3D để lập bản đồ tứ giác sang tứ giác

- (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; 

} 

Sau khi tính cả các ma trận, nhân chúng lại với nhau, và gán cho quan điểm trong câu hỏi, tôi kết thúc với một cái nhìn biến, nhưng nó là một cách hoang dại không chính xác. Trong thực tế, nó dường như bị cắt như một hình bình hành bất kể tôi làm gì. Tôi đang thiếu gì?

CẬP NHẬT 2/1/12

Có vẻ như lý do tôi đang chạy vào các vấn đề có thể là tôi cần phải thích ứng cho FOV và chiều dài tiêu cự vào ma trận mô hình điểm (đó là ma trận duy nhất tôi có thể thay đổi trực tiếp trong Quartz.) Tôi không có bất kỳ may mắn tìm tài liệu trực tuyến về cách tính ma trận thích hợp, mặc dù.

+0

Cập nhật: Tôi đã thử chuyển một vài thuật toán ngay bây giờ và kết thúc bằng một hình bình hành mỗi lần. Phải có thứ tôi quên, nhưng tôi thua. – sevenflow

+0

Đây là một cách khác để đạt được điều này: http://stackoverflow.com/questions/9470493/transforming-a-rectangle-image-into-a-quadrilateral-using-a-catransform3d Hãy cho tôi biết nếu điều này có ích. – MonsieurDart

Trả lời

3

tôi đã có thể đạt được điều này bằng cách porting và kết hợp cong vênh quad và mã homography từ hai URL này:

UPDATE: Tôi đã mở nguồn một lớp nhỏ thực hiện điều này: https://github.com/dominikhofmann/DHWarpView

+1

Xin chào, bạn có thể cung cấp thêm một chút thông tin về mã nào chính xác mà bạn đã chuyển và kết hợp không? Tôi hiện đang cố gắng giải quyết vấn đề chính xác giống như bạn, nhưng tôi không nhận được bất cứ nơi nào. Cảm ơn! – KPM

+0

Chào mừng bạn đến với Stack Overflow! Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. –

+0

Cảm ơn bạn đã phản hồi. Tôi đã mở nguồn cho lớp tôi đã viết để thực hiện điều này – sevenflow

Các vấn đề liên quan