读取stl文件解析成mc op

#include "stdafx.h"
#include <Windows.h>

double t[300000][3];
char temp[MAX_PATH];
double x1, y1, z1, x2, y2, z2, x3, y3, z3;
double maxx = 0, maxy = 0, maxz = 0;
bool redo[200][200][200];
typedef struct {
	int x, y, z;
} point_int;
void fill(point_int a, point_int b, point_int c) {
	point_int center;
	center.x = (a.x+b.x+c.x) / 3;
	center.y = (a.y + b.y + c.y) / 3;
	center.z = (a.z + b.z + c.z) / 3;
	redo[a.x + 100][a.y + 100][a.z + 100] = 1;//避免越界 +100
	redo[b.x + 100][b.y + 100][b.z + 100] = 1;
	redo[c.x + 100][c.y + 100][c.z + 100] = 1;
	if (center.x==a.x && center.y == a.y && center.z==a.z) return;
	if (center.x ==b.x && center.y == b.y && center.z == b.z) return;
	if (center.x == c.x && center.y == c.y && center.z == c.z) return;
	fill(a,b,center);
	fill(b,c,center);
	fill(a,c,center);
}


int main(int argc, char ** argv)
{
	printf("%d", argc);
	if (argc != 2) return 0;
	FILE *f;
	f = fopen(argv[1], "r");
	fscanf(f, "%s %s", temp, temp);
	int i = 0;
	for (i = 0;; i++) {
		fscanf(f, "%s %s", temp, temp);
		if (strcmp(temp, "normal") != 0)break;
		fscanf(f, "%lf %lf %lf\n", &x1, &y1, &z1);

		fscanf(f, "%s %s\n%s", temp, temp, temp);
		fscanf(f, "%lf %lf %lf\n", &x1, &y1, &z1);
		fscanf(f, "%s", temp);
		fscanf(f, "%lf %lf %lf\n", &x2, &y2, &z2);
		fscanf(f, "%s", temp);
		fscanf(f, "%lf %lf %lf\n", &x3, &y3, &z3);
		fscanf(f, "%s %s", temp, temp);
		t[i][0] = x1;
		t[i][1] = y1;
		t[i][2] = z1;
		maxx = maxx > t[i][0] ? maxx : t[i][0];
		maxy = maxy > t[i][1] ? maxy : t[i][1];
		maxz = maxz > t[i][2] ? maxz : t[i][2];
		i++;
		t[i][0] = x2;
		t[i][1] = y2;
		t[i][2] = z2;
		maxx = maxx > t[i][0] ? maxx : t[i][0];
		maxy = maxy > t[i][1] ? maxy : t[i][1];
		maxz = maxz > t[i][2] ? maxz : t[i][2];
		i++;
		t[i][0] = x3;
		t[i][1] = y3;
		t[i][2] = z3;
		maxx = maxx > t[i][0] ? maxx : t[i][0];
		maxy = maxy > t[i][1] ? maxy : t[i][1];
		maxz = maxz > t[i][2] ? maxz : t[i][2];
	}
	double r = 0;
	r = r < maxx ? maxx : r;
	r = r < maxy ? maxy : r;
	r = r < maxz ? maxz : r;
	int dx, dy, dz, size = 100;
	printf("input [dx dy dz](0 0 100):");
	scanf("%d %d %d", &dx, &dy, &dz);
	printf("input size scale(max size):");
	scanf("%d", &size);

	printf("input the block name:");
	scanf("%s", temp);
	freopen("d:\\out.txt", "w", stdout);

	memset(redo, 0, sizeof(redo));

	//scale
	for (int j = 0; j < i; j++) {
		for (int k = 0; k < 3; k++) {
			t[j + k][0] = t[j+k][0] / r * size;
			t[j + k][1] = t[j+k][1] / r * size;
			t[j + k][2] = t[j+k][2] / r * size;
			//printf("setblock  %.0lf %.0lf %.0lf %s\n", t[j][0], t[j][1], t[j][2],temp);
		}
		point_int a, b, c;
		a.x = t[j][0];
		a.y = t[j][1];
		a.z = t[j][2];

		b.x = t[j+1][0];
		b.y = t[j+1][1];
		b.z = t[j+1][2];

		c.x = t[j+2][0];
		c.y = t[j+2][1];
		c.z = t[j+2][2];

		fill(a, b, c);

	}

	//for (int j = 0; j < i; j++)
	//	redo[(int)t[j][0] + 100][(int)t[j][1] + 100][(int)t[j][2] + 100] = 1;
	for (int a = 0; a < 200; a++)
		for (int b = 0; b< 200; b++)
			for (int c = 0; c < 200; c++)
				if (redo[a][b][c])
					printf("setblock %d %d %d %s\n", a - 100 + dx, c - 100 + dz, b - 100 + dy, temp);
	return 0;
}


你可能感兴趣的:(读取stl文件解析成mc op)