• 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
Posts: 108
Joined: Fri 20/06/2008 4:07 pm
Has thanked: 5 times
Been thanked: 5 times

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

Postby rungxanhonline » Thu 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.
Image
Image
Image
TIẾN HÀNH
Tạo mới một Project. Thêm vào một Form gồm các control sau:
Image

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
[vb]Public Type POINT
X As Single
Y As Single
End Type
[/vb]
Thêm 1 module mRotate chứa các hàm và thủ tục để xử lý việc xoay ảnh.
[vb]Option Explicit
Option Base 1
'Sử dụng API để vẽ
Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Const PI As Double = 3.14159265358979

'Chuyển từ độ sang radian vì trong vb dùng đơn vị đo độ là radian
Public Function D2R(ByVal Angle As Single) As Single
D2R = Angle / 180 * PI
End Function

'Xoay một điểm quanh một điểm cho trước, xem phần lý thuyết đồ họa
Public Function RotatePoint(pSource As POINT, pOrigin As POINT, pAngle As Single) As POINT
Dim matrixM(2, 2) As Double
Dim matrixTR(1, 2) As Double
Dim matrixPoint(1, 2) As Double
Dim matrixRPoint() As Double
Dim matrixMultiplication() As Double
Dim i As Integer, j As Integer

'Xác định ma trận M
matrixM(1, 1) = Cos(D2R(pAngle)): matrixM(1, 2) = Sin(D2R(pAngle))
matrixM(2, 1) = -Sin(D2R(pAngle)): matrixM(2, 2) = Cos(D2R(pAngle))

'Xác định ma trận tr
matrixTR(1, 1) = pOrigin.X * (1 - Cos(D2R(pAngle))) + pOrigin.Y * Sin(D2R(pAngle))
matrixTR(1, 2) = -pOrigin.X * Sin(D2R(pAngle)) + pOrigin.Y * (1 - Cos(D2R(pAngle)))

'Ma trận chứa toạ độ điểm cần xoay
matrixPoint(1, 1) = pSource.X: matrixPoint(1, 2) = pSource.Y

'Thực hiện phép nhân ma trận P*M
ReDim matrixMultiplication(UBound(matrixPoint, 1), UBound(matrixM, 2)) As Double
matrixMultiplication = mMatrix.matrixMultiplication(matrixPoint, matrixM)
'Thực hiện phép cộng ma trận P*M + tr
ReDim matrixRPoint(UBound(matrixMultiplication, 1), UBound(matrixMultiplication, 2)) As Double
matrixRPoint = mMatrix.MatrixSum(matrixMultiplication, matrixTR)

RotatePoint.X = matrixRPoint(1, 1)
RotatePoint.Y = matrixRPoint(1, 2)
End Function

'Xoay Hình Ảnh
Public Function RotatePicture(ByVal ShowPicture As PictureBox, ByVal SourcePicture As PictureBox, pOrigin As POINT, ByVal pAngle As Single)
Dim lngX As Long, lngY As Long
Dim lngWidth As Long, lngHeight As Long
Dim lngColor As Long
Dim pResult As POINT
Dim pSource As POINT

lngWidth = SourcePicture.Width
lngHeight = SourcePicture.Height

With ShowPicture
.AutoRedraw = True
.Cls
End With

lngX = 1
While lngX <= lngWidth
lngY = 1
While lngY <= lngHeight
lngColor = GetPixel(SourcePicture.hdc, lngX, lngY)
If lngColor <> SourcePicture.BackColor Then
pSource.X = lngX: pSource.Y = lngY
pResult = RotatePoint(pSource, pOrigin, pAngle)
ShowPicture.PSet (pResult.X, pResult.Y), lngColor
End If
lngY = lngY + 1
Wend
lngX = lngX + 1
Wend
ShowPicture.Refresh
End Function
[/vb]
VÀ ĐÂY LÀ KẾT QUẢ
Image
Attachments
Picture.zip
Xoay ảnh
(204.73 KiB) Downloaded 948 times
Last edited by rungxanhonline on Mon 16/04/2012 9:43 am, edited 2 times in total.



rungxanhonline
Thành viên tích cực
Thành viên tích cực
Posts: 108
Joined: Fri 20/06/2008 4:07 pm
Has thanked: 5 times
Been thanked: 5 times

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

Postby rungxanhonline » Fri 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
Posts: 13
Joined: Wed 18/04/2012 9:12 pm

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

Postby thangboss00 » Fri 11/05/2012 7:46 pm

hay lấm bạn ơi!

User avatar
Zeroplus
Guru
Guru
Posts: 546
Joined: Sat 16/04/2011 11:31 pm
Location: Gò Dầu - Tây Ninh
Has thanked: 6 times
Been thanked: 98 times
Contact:

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

Postby Zeroplus » Fri 11/05/2012 9:03 pm

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


Return to “[VB] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests