2012-10-17 50 views
7

Tôi đang cố gắng tạo các thành phần tùy chỉnh trong Android bằng cách sử dụng Surfaceview và vẽ canvas. Các thành phần có kích thước lớn và có thể xoay bằng cách chạm vào. Xem xét việc tạo ra một hình ảnh xem các cạnh trên, phải, dưới và trái của nó có thể mở rộng bằng cách chạm và kéo cạnh được yêu cầu. Tôi đang sử dụng RectF để giữ giới hạn của thành phần, Đối với xoay tôi đang sử dụng phương pháp canvas.rotate(angle, bounds.centerX(),bounds.centerY()). Vấn đề là trong khi thay đổi kích thước cạnh trên, các cạnh Cho, Phải và Dưới phải được cố định và tôi không thể sửa lỗi nếu góc xoay khác 0 độ. Tôi cần một giải pháp toán học để tìm ra tọa độ x, y của một hình chữ nhật xoay đối với giới hạn hình chữ nhật thực tế.Tọa độ hình chữ nhật với sự tôn trọng góc quay

Tôi có thể giải thích nó với sự trợ giúp của một số hình ảnh. Hình sau đây hiển thị hai hình chữ nhật có giới hạn cũng được biết và hiển thị bằng các màu tương ứng. Hãy xem xét Rect xanh như các thành phần ban đầu giới hạn, tức là. xoay quanh -45 độ, Trung tâm là (10,10). Bây giờ sẽ tái kích thước Cạnh trên của hình chữ nhật và hiển thị trong hình tiếp theo 2.

Figure 1

Từ Hình 2 nó được hiểu rằng vị trí Y được giảm xuống 4 từ 6. xoay Hình chữ nhật cũng được hiển thị bằng màu hồng. Hãy nhớ rằng tôi đang thay đổi kích thước trong khi thành phần ở góc quay -45 độ, vì vậy trong khi kéo Cạnh trên Hình chữ nhật Vị trí trái, phải và dưới không được thay đổi. Vì vậy, các nhân Hình 2 hồng Rectangle nên có Left, Right, và dưới phối giống như Hình 1 của Xanh Rectangle. So sánh các hình chữ nhật đạt được và dự kiến ​​sẽ được trình bày trong Hình 3.

Figure 2

Trong hình 3 hình chữ nhật màu vàng là dự kiến ​​/ Bắt buộc ra đặt. Hình chữ nhật thu được Hình chữ nhật Màu hồng được dịch chuyển lên trên so với Hình chữ nhật xoay màu xanh lá cây và thay đổi phụ thuộc vào Góc quay.

  • Tôi có xoay góc = -45 độ
  • Bounds của thực tế (Không tái kích thước) hình chữ nhật.
  • Giới hạn hình chữ nhật thực (Không phải kích thước lại) ở Xoay = -45 độ.
  • Giới hạn của hình chữ nhật có kích thước lại.
  • Giới hạn của hình chữ nhật có kích thước lại khi xoay = -45 độ.

Làm cách nào để tính Bounds/Trung tâm của hình chữ nhật màu vàng. Vì vậy mà tôi có thể thực hiện việc thay đổi kích thước của các thành phần của tôi một cách chính xác? Hãy cho tôi biết là có bất kỳ toán học nào có thể được áp dụng không?

Những điểm cần thiết/tọa độ được đánh dấu là vòng tròn màu đỏ trong hình 3.

Figure 3

+0

Chỉ cần xoay, công thức cơ bản là: X_ = x * cos (góc) - y * sin (góc); y_ = y * sin (góc) + y * cos (góc); http://en.wikipedia.org/wiki/Rotation_(mathematics) – user1410657

Trả lời

0

Tất cả các màu sắc trong câu trả lời này đề cập đến con số của bạn 3.

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn biết cách tính tất cả chi tiết về hình chữ nhật màu hồng cũng như hình chữ nhật màu xanh lá cây. Vì vậy, chỉ cần lấy sự khác biệt giữa một góc của hình chữ nhật màu hồng và góc tương ứng của hình chữ nhật màu xanh lá cây. Thêm sự khác biệt đó (vectơ hai phần tử, tức là xy khác biệt riêng biệt) vào giữa hình chữ nhật màu hồng sẽ cung cấp cho bạn trung tâm mong muốn của hình tam giác màu vàng.

Nếu bạn cần tính kích thước của hình chữ nhật màu hồng, bạn có thể muốn làm như vậy trong hệ tọa độ không được xoay. Chụp hình chữ nhật màu xanh của bạn cùng với các tọa độ của điểm mà bạn muốn mở rộng hình chữ nhật và xoay chúng lại + 45 °. Sau đó, bạn có thể mở rộng chiều cao của hình chữ nhật với giá trị mà bạn mong muốn, mà sẽ cho bạn hình chữ nhật màu xanh, và từ đó bằng cách xoay hình chữ nhật màu hồng.

1

Điều quan trọng là: "Tôi không thể sửa lỗi nếu góc xoay khác 0 độ."

Giả sử hình chữ nhật của bạn được xoay 10 độ.

1) xoay chuột phối hợp xung quanh một số điểm trên màn hình bằng -10 độ

2) xoay trung tâm của hình chữ nhật bằng -10 độ

... bây giờ bạn làm giảm vấn đề để một hình chữ nhật ở 0 độ. Hình chữ nhật di chuyển, có, con chuột di chuyển, nhưng chúng có liên quan với nhau như chúng cần.

3) Bây giờ thực hiện thao tác hình chữ nhật. Trung tâm hình chữ nhật sẽ dịch chuyển.

4) Xoay trung tâm hình chữ nhật mới bằng 10 độ

Bằng cách này bạn không cần phải suy nghĩ về nó và bạn luôn được làm việc trong tọa độ un-xoay.

Point tại [x, y] quay bằng góc a sẽ kết thúc tại [x*cos(a) - y*sin(a), x*sin(a) + y*cos(a)] điểm

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