Search…

Các Thao Tác Kinh Điển với Mảng 2 Chiều và Ứng Dụng

20/09/20202 min read
Ứng dụng mảng 2 chiều vào thực tế thông qua ví dụ xoay ảnh.

Sử dụng framework STDIO Picture Handling để nạp ảnh và ứng dụng các kiến thức xử lý mảng 2 chiều.

Giao diện STDIO Picture Handling

Giao diện stdio picture handling

Cách hoạt động

Framework hỗ trợ xử lý mảng 2 chiều và 1 chiều

Sau khi chạy chương trình, nhấn nút "Run" để xoay hình ảnh, việc xây dựng nút "Run" bên trong dựa trên ý tưởng của bài viết.

Ý tưởng

Điểm ảnh (pixel - viết tắt px) là đơn vị nhỏ nhất tạo nên hình ảnh, thường mang 1 màu duy nhất (với sự pha trộn các màu cơ bản). Xem mỗi điểm ảnh trong ảnh là 1 giá trị trong mảng, để xoay được ảnh phải thay đổi cách duyệt mảng.

Để dễ hiểu hơn, khởi tạo mảng 2 chiều và thực hiện quá trình Flip +90, hoặc Flip -90 thông qua vòng lặp.

Flip ảnh.

Code flip ảnh

Phần code khai báo mảng

#include <stdio.h>

int main()
{
	int height = 3;
	int width = 5;

	int a[3][5];

	a[0][0] = 8;
	a[0][1] = 7;
	a[0][2] = 6;
	a[0][3] = 2;
	a[0][4] = 8;

	a[1][0] = 5;
	a[1][1] = 4;
	a[1][2] = 1;
	a[1][3] = 5;
	a[1][4] = 3;

	a[2][0] = 2;
	a[2][1] = 3;
	a[2][2] = 1;
	a[2][3] = 4;
	a[2][4] = 9;	

	return 0;
}

Để xoay +90, sử dụng vòng lặp for, với i = height - 1j < width

// Flip +90
for (j = 0; j < width; j++)
{
	for (i = height - 1; i >= 0; i--)
	{
		printf("%d", a[i][j]);			
	}
	printf("\n");
}

Sau khi vòng lặp bên trong thực hiện, i = { 2, 1, 0 } và mỗi lần kết thúc vòng lặp i, thì vòng for ngoài sẽ tăng lên 1 giá trị, với j = { 0, 1, 2, 3, 4 }

// Flip -90
for (j = width - 1; j >= 0; j--)
{
	for (i = 0; i < height; i++)
	{
		printf("%d", a[i][j]);			
	}
	printf("\n");
}

Tiếp tục thực hiện việc xoay -90, với i = height và j = width -1 hiện việc xoay với j = { 4, 3, 2, 1, 0 }i = { 0, 1, 2 }

Áp dụng vào STDIO Picture Handling framework

int* YourCode(int* input, int width, int height, int &out_width, int &out_height)
{
	int size = width * height;

	int* pic;
	pic = new int[size];

	int p = 0; // pic	
	int i = 0;
	int j = 0;
	
	// Flip +90
	for (j = 0; j < width; j++)
	{
		for (i = height - 1; i >= 0; i--)
		{
			*(pic + p) = *(input + (i*width + j));
			p++;
		}
	}

	out_width = height;
	out_height = width;

	return pic;
}

Kết quả

Kết quả sau khi flip mảng 2 chiều.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024