이거 두개는 구글신한테 가져온거인건 둘째치고 조교형아가 써도 된댔는데다 내가 쓴거 아니니 문제는 없어..
혹시 그냥 절망하고 있는 뉴비 도와줄 형들 복사 붙여넣기 하면 될것같아...
그리고 문제의 코드
//lsys.c
#include \"bmpfile.h\"
#include \"stdlib.h\"
#include \"stdio.h\"
#include \"string.h\"
#include \"math.h\"
rgb_pixel_t pixelW = {255, 255, 255, 0};
rgb_pixel_t pixelB = {0, 0, 0, 0};
typedef struct
{
double x;
double y;
double rate;
double heading;
} state;
typedef struct
{
state **array;
int top;
} stack;
stack *makeStack();
state *pop(stack *stk);
void push(stack *stk, state *pt);
state *makeState(double x, double y, double rate, double heading);
void evaluate(char piece, int numberOfRules, char *rule, char **ruleDes, double turningRadian, int depth, int currentDepth, double *maxX, double *maxY, double *minX, double *minY, state *currentState, stack *stk);
void draw(char piece, int numberOfRules, char *rule, char **ruleDes, double turningRadian, int depth, int currentDepth, state *currentState, stack *stk, bmpfile_t *bmpFile);
int main()
{
int i;
double CX = 0, CY = 0;
int numberOfFiles;
scanf(\"%d\", &numberOfFiles);
bmpfile_t *bmp;
bmpfile_t *temp[numberOfFiles];//these files will later be merged together to create a bigger one
bmp = bmp_create(300 * numberOfFiles, 300, 32);
for (i = 0; i < numberOfFiles; i++) {
temp[i] = bmp_create(300, 300, 32);
for (CX = 0; CX < 300; CX++)
for (CY = 0; CY < 300; CY++)
bmp_set_pixel(temp[i], CX, CY, pixelB);
}
// clear the bmp to all black
for (CX = 0; CX < 300 * numberOfFiles; CX++)
for (CY = 0; CY < 300; CY++)
bmp_set_pixel(bmp, CX, CY, pixelB);
for (i = 0; i < numberOfFiles; i++) {
//reading the input
int depth;
scanf(\"%d\", &depth);
double turningAngle;
scanf(\"%lf\", &turningAngle);
double turningRadian = turningAngle * M_PI/180;
double initialHeading;
scanf(\"%lf\\n\", &initialHeading);
double headingRadian = initialHeading * M_PI/180;
// printf(\"radians:%lf, %lf\\n\", turningRadian, headingRadian);
char c;
int j = 0;
char *axiom = (char *)malloc(sizeof(char) * 2);
while ((c = getchar()) != \'\\n\') {
*(axiom + j) = c;
*(axiom + j + 1) = \'\\0\';
realloc(axiom, sizeof(axiom) + 1);
j++;
}
printf(\"%s\\n\", axiom);
int numberOfRules;
scanf(\"%d\\n\", &numberOfRules);
char rule[numberOfRules];
char *ruleDes[numberOfRules];;
for (j = 0; j < numberOfRules; j++) {
ruleDes[j] = (char *)malloc(sizeof(char) * 50);
scanf(\"%c -> %s\\n\", &rule[j], ruleDes[j]);
/* int k = 0;
c = 0;
ruleDes[j] = (char *)malloc(sizeof(char) * 2);
while ((c = getchar()) != \'\\n\') {
realloc(ruleDes[j], sizeof(ruleDes[j]) + 1);
*(ruleDes[j] + k) = c;
*(ruleDes[j] + k + 1) = \'\\0\';
k++;
*/ // printf(\"%d: %c, %s\\n\", j, rule[j], ruleDes[j]);
// }
}
printf(\"depth : %d, turningAngle : %lf, initialHeading: %lf, axiom : %s, numberOfRules : %d\\n\", depth, turningAngle, initialHeading, axiom, numberOfRules);
for (j = 0; j < numberOfRules; j++) {
printf(\"%c -> %s\\n\", rule[j], ruleDes[j]);
}
//getting other things ready
stack *stk = makeStack();
int currentDepth = 0;
double maxX, maxY, minX, minY;
maxX = maxY = minX = minY = 0;
state *currentState = makeState(0, 0, 1, headingRadian);
//first checking the axiom in order to get ready
for (j = 0; j < strlen(axiom); j++) {
evaluate(axiom[j], numberOfRules, rule, ruleDes, turningRadian, depth, currentDepth, &maxX, &maxY, &minX, &minY, currentState, stk);
}
printf(\"x : %lf, y : %lf, rate : %lf\\n\", currentState->x, currentState->y, currentState->rate);
printf(\"maxX: %lf, maxY: %lf, minX: %lf, minY:%lf\\n\", maxX, maxY, minX, minY);
// printf(\"x : %lf, y : %lf, rate : %lf\\n\", currentState->x, currentState->y, currentState->rate);
//free up the state and make a new one with real values
free(currentState);
currentState = makeState(-minX/(maxX-minX) * 300, -minY/(maxY-minY) * 300, 300*300/((maxX-minX) * (maxY-minY)), headingRadian);
printf(\"x : %lf, y : %lf\\n\", -minX/(maxX-minX) * 300, -minY/(maxY-minY) * 300);
printf(\"x : %lf, y : %lf, rate : %lf\\n\", currentState->x, currentState->y, currentState->rate);
//
//
//draw real bmp file. seperately
for (j = 0; j < strlen(axiom); j++) {
draw(axiom[j], numberOfRules, rule, ruleDes, turningRadian, depth, currentDepth, currentState, stk, temp[i]);
}
printf(\"after x : %lf, y : %lf, rate : %lf\\n\", currentState->x, currentState->y, currentState->rate);
//
char fileName[10];
sprintf(fileName, \"TEMP%d.bmp\", i + 1);
bmp_save(temp[i], fileName);
//
//cleaning up
free(axiom);
for (j = 0; j < numberOfRules; j++) {
free(ruleDes[j]);
}
free(currentState);
free(stk);
}
bmp_save(bmp, \"OUTPUT.BMP\");
// free bmp object
bmp_destroy(bmp);
for (i = 0; i < numberOfFiles; i++) {
bmp_destroy(temp[i]);
}
return 0;
}
stack *makeStack()
{
stack *temp = malloc(sizeof(stack));
temp->array = (state **)malloc(10000000000);
temp->top = -1;
return temp;
}
state *pop(stack *stk)
{
state *temp = malloc(sizeof(state));
temp = stk->array[stk->top];
// free(stk->array[stk->top]);
(stk->top)--;
return temp;
}
void push(stack *stk, state *pt)
{
(stk->top)++;
stk->array[stk->top] = malloc(sizeof(state *));
*((stk->array) + stk->top) = pt;
}
state *makeState(double x, double y, double rate, double heading)
{
state *temp = malloc(sizeof(state));
temp->x = x;
temp->y = y;
temp->rate = rate;
temp->heading = heading;
return temp;
}
void evaluate(char piece, int numberOfRules, char *rule, char **ruleDes, double turningRadian, int depth, int currentDepth, double *maxX, double *maxY, double *minX, double *minY, state *currentState, stack *stk) {
//safety
if (depth < currentDepth)
return;
if (currentDepth != depth) {
int i;
for (i = 0; i < numberOfRules; i++) {
if (*(rule + i) == piece) {
int p;
for (p = 0; p < strlen(*(ruleDes + i)); p++)
evaluate(ruleDes[i][p], numberOfRules, rule, ruleDes, turningRadian, depth, (currentDepth + 1), maxX, maxY, minX, minY, currentState, stk);
return;
}
}
}
if (piece == \'F\') {
(currentState->x) += cos(currentState->heading);
(currentState->y) += sin(currentState->heading);
if ((currentState->x) > *maxX)
*maxX = (currentState->x);
else if ((currentState->x) < *minX)
*minX = (currentState->x);
if ((currentState->y) > *maxY)
*maxY = (currentState->y);
else if ((currentState->y) < *minY)
*minY = (currentState->y);
// printf(\"current (%lf, %lf), minmax (%lf, %lf, %lf, %lf)\\n\", currentState->x, currentState->y, *maxX, *minX, *maxY, *minY);
} else if (piece == \'f\') {
(currentState->x) += cos(currentState->heading);
(currentState->y) += sin(currentState->heading);
if ((currentState->x) > *maxX)
*maxX = (currentState->x);
else if ((currentState->x) < *minX)
*minX = (currentState->x);
if ((currentState->y) > *maxY)
*maxY = (currentState->y);
else if ((currentState->y) < *minY)
*minY = (currentState->y);
// printf(\"current (%lf, %lf), minmax (%lf, %lf, %lf, %lf)\\n\", currentState->x, currentState->y, *maxX, *minX, *maxY, *minY);
} else if (piece == \'+\') {
(currentState->heading) += turningRadian;
} else if (piece == \'-\') {
(currentState->heading) -= turningRadian;
} else if (piece == \'[\') {
push(stk, currentState);
} else if (piece == \']\') {
currentState = pop(stk);
}
}
void draw(char piece, int numberOfRules, char *rule, char **ruleDes, double turningRadian, int depth, int currentDepth, state *currentState, stack *stk, bmpfile_t *bmpFile) {
//safety
if (depth < currentDepth)
return;
if (currentDepth != depth) {
int i;
&nb
댓글 0