levelz-c 0.1.0
Loading...
Searching...
No Matches
matrix.h
1#ifndef LEVELZ_MATRIX_H
2#define LEVELZ_MATRIX_H
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7
8#include "coordinate.h"
9
36
46CoordinateMatrix2D* create2DCoordinateMatrix(int minX, int maxX, int minY, int maxY, Coordinate2D* start) {
47 CoordinateMatrix2D* matrix = (CoordinateMatrix2D*) malloc(sizeof(CoordinateMatrix2D));
48 matrix->minX = minX;
49 matrix->maxX = maxX;
50 matrix->minY = minY;
51 matrix->maxY = maxY;
52 matrix->start = start;
53 return matrix;
54}
55
61int CoordinateMatrix2D_size(CoordinateMatrix2D* matrix) {
62 return ((matrix->maxX + 1) - matrix->minX) * ((matrix->maxY + 1) - matrix->minY);
63}
64
70Coordinate2D** CoordinateMatrix2D_coordinates(CoordinateMatrix2D* matrix) {
71 int size = CoordinateMatrix2D_size(matrix);
72 Coordinate2D** coordinates = (Coordinate2D**) malloc(size * sizeof(Coordinate2D));
73
74 int minX = matrix->minX + matrix->start->x;
75 int minY = matrix->minY + matrix->start->y;
76 int maxX = matrix->maxX + matrix->start->x;
77 int maxY = matrix->maxY + matrix->start->y;
78
79 int index = 0;
80 for (int x = minX; x <= maxX; x++) {
81 for (int y = minY; y <= maxY; y++) {
82 coordinates[index] = createCoordinate2D(x, y);
83 index++;
84 }
85 }
86
87 return coordinates;
88}
89
96Coordinate2D* CoordinateMatrix2D_coordinateAt(CoordinateMatrix2D* matrix, int index) {
97 int x = matrix->minX + (index % (matrix->maxX - matrix->minX));
98 int y = matrix->minY + (index / (matrix->maxX - matrix->minX));
99 return createCoordinate2D(x, y);
100}
101
107char* CoordinateMatrix2D_toString(CoordinateMatrix2D* matrix) {
108 if (matrix == 0) return 0;
109
110 int size = snprintf(NULL, 0, "(%d, %d, %d, %d)^%s", matrix->minX, matrix->maxX, matrix->minY, matrix->maxY, Coordinate2D_toString(matrix->start));
111 char* str = (char*) malloc(size);
112 sprintf(str, "(%d, %d, %d, %d)^%s", matrix->minX, matrix->maxX, matrix->minY, matrix->maxY, Coordinate2D_toString(matrix->start));
113 return str;
114}
115
121CoordinateMatrix2D* CoordinateMatrix2D_fromString(const char* str) {
122 if (str == 0) return 0;
123
124 char* str0 = (char*) malloc(strlen(str) + 1);
125 strcpy(str0, str);
126
127 int minX, minY, maxX, maxY;
128 double x, y;
129
130 char* token = strtok(str0, "()[]^, \t");
131 int i = 0;
132 while (token != 0) {
133 switch (i) {
134 case 0: minX = atoi(token); break;
135 case 1: maxX = atoi(token); break;
136 case 2: minY = atoi(token); break;
137 case 3: maxY = atoi(token); break;
138 case 4: x = atof(token); break;
139 case 5: y = atof(token); break;
140 }
141
142 token = strtok(0, "()[]^, \t");
143 i++;
144 }
145
146 free(str0);
147 Coordinate2D* start = createCoordinate2D(x, y);
148 return create2DCoordinateMatrix(minX, maxX, minY, maxY, start);
149}
150
185
197CoordinateMatrix3D* create3DCoordinateMatrix(int minX, int maxX, int minY, int maxY, int minZ, int maxZ, Coordinate3D* start) {
198 CoordinateMatrix3D* matrix = (CoordinateMatrix3D*) malloc(sizeof(CoordinateMatrix3D));
199 matrix->minX = minX;
200 matrix->maxX = maxX;
201 matrix->minY = minY;
202 matrix->maxY = maxY;
203 matrix->minZ = minZ;
204 matrix->maxZ = maxZ;
205 matrix->start = start;
206 return matrix;
207}
208
214int CoordinateMatrix3D_size(CoordinateMatrix3D* matrix) {
215 return ((matrix->maxX + 1) - matrix->minX) * ((matrix->maxY + 1) - matrix->minY) * ((matrix->maxZ + 1) - matrix->minZ);
216}
217
223Coordinate3D** CoordinateMatrix3D_coordinates(CoordinateMatrix3D* matrix) {
224 int size = CoordinateMatrix3D_size(matrix);
225 Coordinate3D** coordinates = (Coordinate3D**) malloc(size * sizeof(Coordinate3D));
226
227 int minX = matrix->minX + matrix->start->x;
228 int minY = matrix->minY + matrix->start->y;
229 int minZ = matrix->minZ + matrix->start->z;
230 int maxX = matrix->maxX + matrix->start->x;
231 int maxY = matrix->maxY + matrix->start->y;
232 int maxZ = matrix->maxZ + matrix->start->z;
233
234 int index = 0;
235 for (int x = minX; x <= maxX; x++) {
236 for (int y = minY; y <= maxY; y++) {
237 for (int z = minZ; z <= maxZ; z++) {
238 coordinates[index] = createCoordinate3D(x, y, z);
239 index++;
240 }
241 }
242 }
243
244 return coordinates;
245}
246
253Coordinate3D* CoordinateMatrix3D_coordinateAt(CoordinateMatrix3D* matrix, int index) {
254 int x = matrix->minX + (index % (matrix->maxX - matrix->minX));
255 int y = matrix->minY + ((index / (matrix->maxX - matrix->minX)) % (matrix->maxY - matrix->minY));
256 int z = matrix->minZ + (index / ((matrix->maxX - matrix->minX) * (matrix->maxY - matrix->minY)));
257 return createCoordinate3D(x, y, z);
258}
259
265char* CoordinateMatrix3D_toString(CoordinateMatrix3D* matrix) {
266 if (matrix == 0) return 0;
267
268 int size = snprintf(NULL, 0, "(%d, %d, %d, %d, %d, %d)^%s", matrix->minX, matrix->maxX, matrix->minY, matrix->maxY, matrix->minZ, matrix->maxZ, Coordinate3D_toString(matrix->start));
269 char* str = (char*) malloc(size);
270 sprintf(str, "(%d, %d, %d, %d, %d, %d)^%s", matrix->minX, matrix->maxX, matrix->minY, matrix->maxY, matrix->minZ, matrix->maxZ, Coordinate3D_toString(matrix->start));
271 return str;
272}
273
279CoordinateMatrix3D* CoordinateMatrix3D_fromString(char* str) {
280 if (str == 0) return 0;
281
282 char* str0 = (char*) malloc(strlen(str) + 1);
283 strcpy(str0, str);
284
285 int minX, minY, maxX, maxY, minZ, maxZ;
286 double x, y, z;
287
288 char* token = strtok(str0, "()[]^, \t");
289 int i = 0;
290 while (token != 0) {
291 switch (i) {
292 case 0: minX = atoi(token); break;
293 case 1: maxX = atoi(token); break;
294 case 2: minY = atoi(token); break;
295 case 3: maxY = atoi(token); break;
296 case 4: minZ = atoi(token); break;
297 case 5: maxZ = atoi(token); break;
298 case 6: x = atof(token); break;
299 case 7: y = atof(token); break;
300 case 8: z = atof(token); break;
301 }
302
303 token = strtok(0, "()[]^, \t");
304 i++;
305 }
306
307 free(str0);
308 Coordinate3D* start = createCoordinate3D(x, y, z);
309 return create3DCoordinateMatrix(minX, maxX, minY, maxY, minZ, maxZ, start);
310}
311
312#endif
Definition coordinate.h:11
double y
Definition coordinate.h:20
double x
Definition coordinate.h:15
Definition coordinate.h:108
double x
Definition coordinate.h:112
double z
Definition coordinate.h:122
double y
Definition coordinate.h:117
Definition matrix.h:13
int maxY
Definition matrix.h:29
int minY
Definition matrix.h:25
int minX
Definition matrix.h:17
Coordinate2D * start
Definition matrix.h:34
int maxX
Definition matrix.h:21
Definition matrix.h:154
int maxZ
Definition matrix.h:178
Coordinate3D * start
Definition matrix.h:183
int maxX
Definition matrix.h:162
int minY
Definition matrix.h:166
int minZ
Definition matrix.h:174
int maxY
Definition matrix.h:170
int minX
Definition matrix.h:158