Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 01 / triangles.cpp
blob: f85e73c6fe1e562a46a8c795e36736caa7071b3a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>

struct Point
{
	int x;
	int y;
};

void readPoint(Point& p)
{
	std::cin >> p.x >> p.y;
}

void printPoint(const Point& p)
{
	std::cout << p.x << " " << p.y <<;
}

double getDist(const Point& p1, const Point& p2)
{
	double dx = p1.x - p2.x;
	double dy = p1.y - p2.y;

	return sqrt(dx*dx + dy*dy);
}

struct Triangle
{
	Point p1;
	Point p2;
	Point p3;
};

void readTriangle(Triangle& tr)
{
	readPoint(tr.p1);
	readPoint(tr.p2);
	readPoint(tr.p3);
}
void printTriangle(const Triangle& tr)
{
	printPoint(tr.p1);
	std::cout << " ";
	printPoint(tr.p2);
	std::cout << " ";
	printPoint(tr.p3);
	std::cout << std::endl;
}

double getArea(const Triangle& tr)
{
	double sideA = getDist(tr.p1, tr.p2);
	double sideB = getDist(tr.p2, tr.p3);
	double sideC = getDist(tr.p3, tr.p1);

	double halfPer = (sideA + sideB + sideC) / 2;

	return sqrt(halfPer*(halfPer - sideA)*(halfPer - sideB)*(halfPer - sideC));
}

void swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
void swap(Triangle& tr1, Triangle& tr2)
{
	Triangle temp = tr1;
	tr1 = tr2;
	tr2 = temp;
}

void selectionSort(int* areas,  Triangle* triangles, unsigned size)
{
	for (unsigned i = 0; i < size - 1; i++)
	{
		//findMin
		int minElementIndex = i;
		for (unsigned j = i + 1; j < size; j++)
		{
			if (areas[j] < areas[minElementIndex])
				minElementIndex = j;
		}
		if (minElementIndex != i)
		{
			swap(areas[i], areas[minElementIndex]);
			swap(triangles[i], triangles[minElementIndex]);
		}
	}
}

int* calculateAreas(const Triangle* arr, int n)
{
	int* areas = new int[n];

	for (int i = 0; i < n; i++)
		areas[i] = getArea(arr[i]);

	return areas;
}

int main()
{
	int n;
	std::cin >> n;

	Triangle* triangles = new Triangle[n];
	
	for (int i = 0; i < n; i++)
		readTriangle(triangles[i]);

	int* areas = calculateAreas(triangles,n);

	selectionSort(areas, triangles, n);

	for (int i = 0; i < n; i++)
		printTriangle(triangles[i]);

	delete[] triangles, areas;

}