• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Kỹ thuật xoay hình quanh một điểm

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
rungxanhonline
Thành viên tích cực
Thành viên tích cực
Bài viết: 108
Ngày tham gia: T.Sáu 20/06/2008 4:07 pm
Has thanked: 5 time
Been thanked: 5 time

Kỹ thuật xoay hình quanh một điểm

Gửi bàigửi bởi rungxanhonline » T.Năm 12/04/2012 10:06 am

Tên bài viết: Kỹ thuật xoay hình quanh một điểm
Tác giả: daovanbao_kt@yahoo.com
Cấp độ bài viết: Chưa đánh giá
Tóm tắt: Sử dụng kỹ thuật xoay hình trong đồ họa máy tính


Mình đã tìm trên diễn đàn nhưng chưa thấy một bài viết cụ thể về xoay hình ảnh quanh một điểm. Nên mình viết bài này mong nó sẽ hữu ích với những bạn đang cần. Như chúng ta đã biết một hình ảnh là tập hợp các điểm ảnh được sắp xếp theo một trật tự nhất định. Do vậy việc xoay hình ảnh quay quanh một điểm cũng chính là việc xoay các điểm ảnh của hình ảnh đó quanh điểm xoay. Từ đó mình đưa ra kỹ thuật sau:
    Xác định các điểm ảnh chứa hình ảnh
    Xoay các điểm ảnh quanh điểm xoay bằng phép xoay quanh một điểm bất kỳ trong kỹ thuật đồ họa máy tính
    Vẽ lại các điểm ảnh đã xoay lên Picturebox
PHÉP XOAY MỘT ĐIỂM QUANH MỘT ĐIỂM BẤT KỲ (Nguồn: GT Lý thuyết đồ họa
Thực chất phép quay quanh một điểm bất kỳ chính là:
    Phép tịnh tiến của điểm từ điểm quay tới gốc tọa độ (0,0)
    Phép quay quanh gốc toạ độ (0,0)
    Phép tịnh tiến điểm vừa quay quanh gốc tọa độ tới điểm quay.
Hình ảnh
Hình ảnh
Hình ảnh
TIẾN HÀNH
Tạo mới một Project. Thêm vào một Form gồm các control sau:
Hình ảnh

Thêm 1 module mMatrix xử lý các phép toán ma trận (ở đây mình chỉ viết cho 2 toán tử cộng và nhân).
  1. Option Explicit
  2. Option Base 1
  3. 'Code: <!-- e --><a href="mailto:manhbaosoft@gmail.com">manhbaosoft@gmail.com</a><!-- e -->
  4. 'Tổng 2 ma trận
  5. Public Function MatrixSum(arrMatrix1() As Double, arrMatrix2() As Double) As Double()
  6.     Dim i As Integer, j As Integer
  7.     Dim MS() As Double
  8.    
  9.     ReDim MS(UBound(arrMatrix1, 1), UBound(arrMatrix1, 2)) As Double
  10.     i = 1
  11.     While i <= UBound(arrMatrix1, 1)
  12.         j = 1
  13.         While j <= UBound(arrMatrix1, 2)
  14.             MS(i, j) = arrMatrix1(i, j) + arrMatrix2(i, j)
  15.             j = j + 1
  16.         Wend
  17.         i = i + 1
  18.     Wend
  19.     MatrixSum = MS
  20. End Function
  21.  
  22. 'Nhân 2 ma trận
  23. Public Function matrixMultiplication(arrMatrix1() As Double, arrMatrix2() As Double) As Double()
  24.     Dim i As Integer, j As Integer, k As Integer
  25.     Dim MS() As Double
  26.    
  27.     ReDim MS(UBound(arrMatrix1, 1), UBound(arrMatrix2, 2)) As Double
  28.     i = 1
  29.     While i <= UBound(arrMatrix1, 1)
  30.         j = 1
  31.         While j <= UBound(arrMatrix2, 2)
  32.             MS(i, j) = 0
  33.             k = 1
  34.             While k <= UBound(arrMatrix1, 2)
  35.                 MS(i, j) = Val(MS(i, j)) + Val(arrMatrix1(i, k)) * Val(arrMatrix2(k, j))
  36.                 k = k + 1
  37.             Wend
  38.             j = j + 1
  39.         Wend
  40.         i = i + 1
  41.     Wend
  42.     matrixMultiplication = MS
  43. End Function
  44.  

Trong quá trình tính toán cần lưu ý một số tính chất cơ bản của ma trận:
    Phép cộng: 2 ma trận phải cùng kích thước tức là có cùng số cột và hàng
    Phép nhân: [ A ]mxp X [ B ]pxn =[ C ]mxn thỏa số cột của ma trận A bằng số hàng của ma trận B
Xem chi tiết về ma trận toán học: http://vi.wikipedia.org/wiki/Ma_tr%E1%BA%ADn_(to%C3%A1n_h%E1%BB%8Dc)
http://www.miislita.com/information-retrieval-tutorial/matrix-tutorial-2-matrix-operations.html

Thêm 1 module mType chứa các kiểu dữ liệu tự định nghĩa
  1. Public Type POINT
  2.     X As Single
  3.     Y As Single
  4. End Type
  5.  

Thêm 1 module mRotate chứa các hàm và thủ tục để xử lý việc xoay ảnh.
  1. Option Explicit
  2. Option Base 1
  3. 'Sử dụng API để vẽ
  4. Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  5. Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  6. Public Const PI As Double = 3.14159265358979
  7.  
  8. 'Chuyển từ độ sang radian vì trong vb dùng đơn vị đo độ là radian
  9. Public Function D2R(ByVal Angle As Single) As Single
  10.     D2R = Angle / 180 * PI
  11. End Function
  12.  
  13. 'Xoay một điểm quanh một điểm cho trước, xem phần lý thuyết đồ họa
  14. Public Function RotatePoint(pSource As POINT, pOrigin As POINT, pAngle As Single) As POINT
  15.     Dim matrixM(2, 2) As Double
  16.     Dim matrixTR(1, 2) As Double
  17.     Dim matrixPoint(1, 2) As Double
  18.     Dim matrixRPoint() As Double
  19.     Dim matrixMultiplication() As Double
  20.     Dim i As Integer, j As Integer
  21.    
  22.     'Xác định ma trận M
  23.    matrixM(1, 1) = Cos(D2R(pAngle)): matrixM(1, 2) = Sin(D2R(pAngle))
  24.     matrixM(2, 1) = -Sin(D2R(pAngle)): matrixM(2, 2) = Cos(D2R(pAngle))
  25.    
  26.    'Xác định ma trận tr
  27.    matrixTR(1, 1) = pOrigin.X * (1 - Cos(D2R(pAngle))) + pOrigin.Y * Sin(D2R(pAngle))
  28.     matrixTR(1, 2) = -pOrigin.X * Sin(D2R(pAngle)) + pOrigin.Y * (1 - Cos(D2R(pAngle)))
  29.    
  30.     'Ma trận chứa toạ độ điểm cần xoay
  31.    matrixPoint(1, 1) = pSource.X: matrixPoint(1, 2) = pSource.Y
  32.    
  33.     'Thực hiện phép nhân ma trận P*M
  34.    ReDim matrixMultiplication(UBound(matrixPoint, 1), UBound(matrixM, 2)) As Double
  35.     matrixMultiplication = mMatrix.matrixMultiplication(matrixPoint, matrixM)
  36.     'Thực hiện phép cộng ma trận P*M + tr
  37.    ReDim matrixRPoint(UBound(matrixMultiplication, 1), UBound(matrixMultiplication, 2)) As Double
  38.     matrixRPoint = mMatrix.MatrixSum(matrixMultiplication, matrixTR)
  39.    
  40.     RotatePoint.X = matrixRPoint(1, 1)
  41.     RotatePoint.Y = matrixRPoint(1, 2)
  42. End Function
  43.  
  44. 'Xoay Hình Ảnh
  45. Public Function RotatePicture(ByVal ShowPicture As PictureBox, ByVal SourcePicture As PictureBox, pOrigin As POINT, ByVal pAngle As Single)
  46.     Dim lngX As Long, lngY As Long
  47.     Dim lngWidth As Long, lngHeight As Long
  48.     Dim lngColor As Long
  49.     Dim pResult As POINT
  50.     Dim pSource As POINT
  51.    
  52.     lngWidth = SourcePicture.Width
  53.     lngHeight = SourcePicture.Height
  54.    
  55.     With ShowPicture
  56.         .AutoRedraw = True
  57.         .Cls
  58.     End With
  59.    
  60.     lngX = 1
  61.     While lngX <= lngWidth
  62.         lngY = 1
  63.         While lngY <= lngHeight
  64.             lngColor = GetPixel(SourcePicture.hdc, lngX, lngY)
  65.             If lngColor <> SourcePicture.BackColor Then
  66.                 pSource.X = lngX: pSource.Y = lngY
  67.                 pResult = RotatePoint(pSource, pOrigin, pAngle)
  68.                 ShowPicture.PSet (pResult.X, pResult.Y), lngColor
  69.             End If
  70.             lngY = lngY + 1
  71.         Wend
  72.         lngX = lngX + 1
  73.     Wend
  74.     ShowPicture.Refresh
  75. End Function
  76.  

VÀ ĐÂY LÀ KẾT QUẢ
Hình ảnh
Tập tin đính kèm
Picture.zip
Xoay ảnh
(204.73 KiB) Đã tải 941 lần
Sửa lần cuối bởi rungxanhonline vào ngày T.Hai 16/04/2012 9:43 am với 2 lần sửa.



rungxanhonline
Thành viên tích cực
Thành viên tích cực
Bài viết: 108
Ngày tham gia: T.Sáu 20/06/2008 4:07 pm
Has thanked: 5 time
Been thanked: 5 time

Re: Kỹ thuật xoay hình quanh một điểm

Gửi bàigửi bởi rungxanhonline » T.Sáu 13/04/2012 6:17 am

Hình như không ai quan tâm tới vấn đề này thì phải.

thangboss00
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Tư 18/04/2012 9:12 pm

Re: Kỹ thuật xoay hình quanh một điểm

Gửi bàigửi bởi thangboss00 » T.Sáu 11/05/2012 7:46 pm

hay lấm bạn ơi!

Hình đại diện của người dùng
Zeroplus
Guru
Guru
Bài viết: 546
Ngày tham gia: T.Bảy 16/04/2011 11:31 pm
Đến từ: Gò Dầu - Tây Ninh
Has thanked: 6 time
Been thanked: 98 time
Liên hệ:

Re: Kỹ thuật xoay hình quanh một điểm

Gửi bàigửi bởi Zeroplus » T.Sáu 11/05/2012 9:03 pm

Mình cũng đang cần tìm hiểu ;) Cảm ơn bạn


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách