2011-01-31 45 views
5

Tôi không có nghĩa là xưng là thiên tài khi nói đến lập trình và vấn đề hiện tại của tôi khiến tôi bối rối.Tính ma trận chuyển đổi 2D từ ma trận 2D ban đầu và kết quả

Tôi đã tìm thấy câu hỏi này Trying to derive a 2D transformation matrix using only the images mà dường như để trả lời ít nhất một phần câu hỏi của tôi nhưng hình ảnh đó sẽ hiển thị các giải pháp không còn có sẵn: S

Tôi đang làm việc trong C# và không sử dụng WPF như không phải của tôi đầu vào hoặc đầu ra cần được hiển thị đồ họa.

Trong chương trình của tôi, tôi có 2 tứ giác, cho phép gọi chúng là đầu vào và đầu ra tứ giác.

Quad đầu vào có các đồng số (2,1), (2,3), (4,4), (3,1) từ dưới cùng bên trái theo chiều kim đồng hồ.

Quad đầu ra có thể có bất kỳ co-ords nào và sẽ được liệt kê lại theo thứ tự từ dưới cùng bên trái theo chiều kim đồng hồ.

Với 8 cặp phối hợp này, có thể tính toán ma trận chuyển đổi mà tôi có thể áp dụng cho bất kỳ cặp phối hợp đơn nào không?

Tôi không quá nóng trên Ma trận nhưng tôi sẵn sàng tìm hiểu nếu chỉ đúng hướng.

Nhiều Cảm ơn

Josh

+1

Tôi không nghĩ có quá nhiều sự tham gia ma trận ở đây; bạn đang yêu cầu một hàm đẳng hình để chiếu một điểm trong một tứ giác tới một điểm trong tứ giác thứ hai. Nó không nên quá khó ... bạn chỉ cần tìm ra cách các điểm trong đa giác thứ nhất và thứ hai ánh xạ với nhau. –

+0

Bạn cũng có thể muốn xem http://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle –

Trả lời

2

Google hoặc hop nhanh, bỏ qua và tìm thấy google this. Tôi nghĩ rằng nó chắc chắn sẽ giải quyết vấn đề của bạn.

Như tôi đã đề cập trong nhận xét, bạn đang yêu cầu một hàm đẳng hình để chiếu một điểm trong một tứ giác đến một điểm trong tứ giác thứ hai. Thay vì làm việc nó ra bằng tay tôi đã tìm thấy các thuật toán dưới đây.

viết bài thuật toán ở đây cho hậu thế:

Hãy p00, p10, P11, P01 và là đỉnh của tứ giác đầu tiên liệt kê theo thứ ngược.

Cho q00, q10, q11 và q01 là các đỉnh của tứ giác thứ hai được liệt kê trong thứ tự ngược chiều kim đồng hồ.

Xác định P10 = p10-p00, P11 = P11-p00, P01 = P01-p00, Q10 = q10-q00, Q11 = q11-q00, và Q01 = Q01-q00.

Tính a và b sao cho Q11 = aQ10 + bQ01.

Đây là tập hợp của hai phương trình tuyến tính trong hai ẩn số.

Tương tự, tính c và d sao cho P11 = cP10 + dP01.

Nó chỉ ra rằng a> = 0, b> = 0, a + b> 1, c> = 0, d> = 0, và c + d> 1.

Bất kỳ điểm p trong tứ giác có thể được viết như p = (1-xy) p00 + xp10 + yp01 trong đó x = 0, y = 0, (1 - d) x + c (y - 1) = 0 và d (x - 1) + (1 - c) y = 0.

Bất kỳ điểm q nào trong tứ giác có thể được viết là q = (1-uv) q00 + uq10 + vq01 trong đó u = 0, v = 0, (1 - b) u + a (v -1) = 0 và b (u - 1) + (1 - a) v = 0.

Ánh xạ phối cảnh liên quan (u, v) với (x, y) là u = m0x n0 + n1x + n2y và v = m1y n0 + n1x + n2y trong đó m0 = quảng cáo (1 - c - d), m1 = bc (1 - c - d), n0 = cd (1 - a - b), n1 = d (a - c + bc - quảng cáo), và n2 = c (b - d - bc + ad).

có hiệu quả các p-tứ giác được ánh xạ tới một “tiêu chuẩn” một, < (0, 0), (1, 0), (0, 1), (c, d)>

và q -quadrilateral được ánh xạ tới < (0, 0), (1, 0), (0, 1), (a, b)>.

Ánh xạ (x, y) đến (u, v) liên quan đến hai điều này.

Bạn có thể xác minh rằng

• (x, y) = (0, 0) được ánh xạ tới (u, v) = (0, 0)

• (x, y) = (1, 0) được ánh xạ tới (u, v) = (1, 0)

• (x, y) = (0, 1) được ánh xạ tới (u, v) = (0, 1)

• (x, y) = (c, d) được ánh xạ tới (u, v) = (a, b)

Tôi sẽ cung cấp cho một câu trả lời khác mô tả cách tôi giải quyết ví dụ trong các nhận xét - câu trả lời này là quá dài.

+0

Đó là rực rỡ Kirk, cảm ơn nhiều bạn đã chia sẻ kiến ​​thức của bạn. –

+0

Công cụ tuyệt vời, Kirk. –

+0

Ok guys, tôi đã thực hiện điều này vào mã tốt nhất là tôi biết làm thế nào và nó không có vẻ là làm việc cho tôi. Tôi hiện đang sử dụng một ứng dụng mẫu mà tôi tự định nghĩa tất cả các tọa độ và sử dụng các phép biến đổi đơn giản, tôi không nhận được kết quả mà tôi cần. Nếu ví dụ tôi sử dụng hình vuông 10x10 từ 0,0 cho ban đầu và hình vuông 20x20 cũng từ 0,0 khi tôi nhập đồng co 5,5 dưới dạng X và Y cho chữ cái đầu tiên, tôi sẽ nhận được 10, 10 cho kết quả, tại thời điểm tôi nhận được 5,5 vẫn còn. Khi tôi làm điều này, các giá trị của A, B, C, D là 1 khi tôi có cảm giác không nên như vậy. Có ai biết tôi đã đi sai không? –

2

Tiêu đề của câu hỏi của bạn là sai lầm, bởi vì nó ngụ ý rằng bạn có các ma trận ban đầu và cuối cùng. Những gì bạn thực sự có, mặc dù, là hai bộ điểm: điểm bắt đầu và điểm kết thúc.

Trước tiên, như bạn đã đề cập, có thể tính ma trận chuyển đổi, nhưng không nhất thiết phải là ma trận chuyển đổi. Đối với bất kỳ chuyển đổi cụ thể, có nhiều (vô hạn?) Cách để thực hiện nó.

Lưu ý rằng sau đây chỉ là một số suy nghĩ. Tôi đã không thực sự làm điều này. Tôi giả sử rằng bạn có hai bộ điểm, AB và bạn biết chắc chắn rằng B là kết quả của việc áp dụng một số chuyển đổi cho A.

Vấn đề là tầm thường nếu phép chuyển đổi duy nhất được phép là bản dịch. Trong trường hợp đó, bạn chỉ có thể lấy khoảng cách giữa các điểm dưới cùng bên trái. Nghĩa là, nếu các điểm ban đầu là A[0] thông qua A[3] và các điểm mới là B[0] đến B[3] thì chuyển đổi chỉ là bản dịch X, Y: ((B[0].X - A[0].X), (B[0].Y - A[0].Y)).

Nếu tỷ lệ được phép là tốt, sau đó bạn có thể tìm bản dịch và sau đó mở rộng tỷ lệ. Mặc dù để đơn giản hóa, trước tiên bạn sẽ muốn dịch sang nguồn gốc. Trong thực tế, hầu hết điều này trở nên đơn giản hơn nếu bạn dịch sang nguồn gốc đầu tiên.

Nếu xoay vòng được phép, mọi thứ trở nên khó khăn hơn một chút. Cho tứ giác, trước tiên bạn phải xoay điều để các điểm có cùng hướng với bản gốc. Điều này sẽ yêu cầu bạn tính toán khoảng cách giữa các điểm và sử dụng các tỷ lệ để tìm ra điểm nào là phía dưới bên trái. Sau đó xoay vào vị trí thích hợp.

Trường hợp xoay, chia tỷ lệ và dịch phải đơn giản để giải quyết.

Cắt là phức tạp hơn một chút. Bạn có thể phát hiện cắt, nhưng tôi không có ý tưởng hay về cách phát hiện số lượng cắt. Tuy nhiên, tôi nghĩ rằng nếu bạn giải quyết trường hợp xoay/tỷ lệ/dịch, thì giải pháp cắt sẽ trở nên rõ ràng hơn một chút.

+0

Tôi thích nửa đầu câu trả lời của bạn. Việc đọc câu hỏi của tôi là tập hợp tọa độ thứ hai có thể là tập hợp tọa độ bất kỳ * nào; xoay, quy mô, cắt đều nằm trên bàn. Sẽ không có bất kỳ vòng quay 'thực' nào (hơn 90 độ), bởi vì đây chỉ là hai tứ giác được xác định bởi góc dưới cùng bên trái. –

+0

@Kirk: Bạn có thể muốn kiểm tra ý nghĩa của "tứ giác". Nó chỉ là một hình dạng 4 mặt. Vì vậy, có * có thể * là quay thực. –

+0

Nó không thực sự công bằng để giả sử tôi không biết ý nghĩa của tứ giác, phải không? Quan điểm của tôi là cho 2 tứ giác, cả hai được xác định * chỉ * theo 4 tọa độ, và nơi tọa độ được sắp xếp theo chiều kim đồng hồ từ 'phía dưới bên trái', làm cách nào bạn có thể xác định bất kỳ 'vòng quay' nào? Nếu bạn biết góc nào từ Q1 được ánh xạ tới góc nào trong Q2, thì bạn có thể có 'xoay vòng', nhưng khi bạn không có thông tin đó thì xoay vòng là một khái niệm không liên quan. –

1

Để giải quyết trường hợp mẫu - chuyển điểm (5,5) từ hình vuông (0,0) - (10,10) vào hình vuông (0,0) - (20,20) - bạn đang bật đúng đường nhưng dừng lại quá sớm hoặc bị lạc. Thuật toán không đơn giản nhất nhưng nó hoàn toàn có thể sử dụng được khi bạn hiểu bạn đang đi đâu.

Khi giao dịch với 'hình vuông' vuông góc với x & trục y, thì có a = b = c = d = 1.

Hãy gọi các điểm của quad p1, p2, p3 và p4 của bạn. Bây giờ hãy nghĩ về a như mô tả mối quan hệ giữa p2 và p3 (tương ứng với p1) và b như mô tả mối quan hệ tương tự giữa p4 và p3 (tương ứng với p1). Rất cách đơn giản, bạn muốn làm việc ra ab nơi

  • tọa độ x của p1 + a * length of side p1-p2 = tọa độ x của p3, và
  • tọa độ y của p1 + b * length of side p1-p4 = Tọa độ y của p3.

tức là bắt đầu từ dưới cùng bên trái, tôi cần thêm bao nhiêu cạnh dưới cùng để đến tọa độ x của góc trên cùng bên phải và tương tự cho toạ độ y. Mặc dù đó là một ngụm, khi bạn đang đối phó với một hình vuông kết quả chính xác ở đây chắc chắn là 1 và 1. Khi bạn di chuyển ra khỏi ô vuông vuông góc thì nó không đơn giản nhưng điều này rất dễ hình dung.

Khi bạn giải quyết này

  • p =(1-x-y)p00 + xp10 + yp01, nơi
  • x >= 0
  • y >= 0
  • (1 - d)x + c(y - 1) = 0
  • d(x - 1)+(1 - c)y = 0

bằng cách sử dụng một điểm (5,5), bạn sẽ nhận được một giá trị của x = 1/2, y = 1/2. Lưu ý rằng đây không phải là tọa độ x và y của điểm của bạn. Thay vào đó chúng đại diện cho nơi mà điểm của bạn sẽ ngồi nếu tứ giác được chiếu lên một hình vuông có kích thước (1,1). Trong trường hợp này, chúng có nghĩa là điểm của bạn được định vị bằng 1/2 chiều ngang (theo chiều ngang) và 1/2 chiều lên (theo chiều dọc) đa giác của bạn - tức là nó nằm ở chính giữa.

Cắm các giá trị a,b,c,d,xy vào phương trình lớn (theo liên kết thay vì cố gắng đọc nó ở đây!), bạn cũng nhận được (u, v) = (1/2, 1/2), trong đó u & v đại diện cho cùng một khái niệm ở trên nhưng trong ô vuông thứ hai. Điều này là chính xác vì điểm kết quả được mong đợi ở giữa đa giác thứ hai.

Cuối cùng, khi bạn cắm vào u, v của bạn vào phương trình

  • q =(1-u-v)q00 + uq10 + vq01

bạn sẽ nhận được điểm q = (10,10), đó là những gì bạn mong đợi.

Tôi không biết & chưa nghĩ đến việc giải các phương trình đồng thời trong mã, tôi chắc chắn có một cách nhưng nó có thể không đơn giản nhưng tiếc là tôi sẽ phải để nó cho bạn. Tôi đã làm điều này trên một mảnh giấy và tất cả đều đã được giải quyết; Tuy nhiên, toán học của tôi hơi có chút gì đó để làm bất cứ điều gì hơn là một ví dụ tầm thường hơn.

+0

Xin chào Kirk, tôi nghĩ rằng tôi đã bị lạc và dừng lại sớm vì thực tế đó. Tôi sẽ xem về việc triển khai mã này sau này vào ngày hôm nay khi bộ não của tôi hoạt động tốt hơn một chút. –

+0

@Josh Tôi khuyên bạn nên chạy qua nó trên giấy đầu tiên để bạn thấy nó hoạt động như thế nào; sau đó thử triển khai nó trong mã. –

+0

Cảm ơn bạn đã đề xuất, tôi đã chạy nó nhanh chóng trên giấy với một vài kịch bản khác nhau và dường như nó hoạt động tốt. Tôi thực hiện nó trong mã và dường như có tất cả làm việc cho tôi cho các kịch bản tương tự nhưng mã dường như giảm hơn với các biến thể phức tạp hơn của các tham số đầu vào và đầu ra. Tôi sẽ xem xét lại nó trong một vài ngày khi tâm trí của tôi cảm thấy tươi hơn một chút và tôi sẽ đi từ đó. Chúc mừng một lần nữa. –

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