Word HAP3(Word U, Word w_l, Word B) { Word Sol,u,I,w_u,r,c1,c2; Step1: /* Initialization. */ if (U == NIL) { Sol = LIST1(NIL); goto Return; } ADV(U,&u,&U); FIRST2(u,&I,&r); Sol = LIST1(LIST2(I,LIST2(B,AD2D_Infy))); while(U != NIL) { ADV(U,&u,&U); FIRST2(u,&I,&w_u); r = VECTOR_SUM(r,w_u); Sol = COMP(LIST2(I,LIST2(B,AD2D_Infy)),Sol); } while(r != NIL) { ADV(r,&c1,&r); ADV(w_l,&c2,&w_l); if (c1 != 0 && c2 == 0) { Sol = AD2D_FAIL; goto Return; } } Sol = LIST1(Sol); Return: /* Prepare to return. */ return Sol; }
VECTOR make_wall(VECTOR a, VECTOR b, VECTOR c, float width) { float m1, m2, n1, n2; VECTOR norm1, norm2, p, p1, p2; m1 = VECTOR_SLOPE(VECTOR_DIFF(a, b)); m2 = VECTOR_SLOPE(VECTOR_DIFF(b, c)); norm1 = USCALE_VECTOR(NORMALIZED_NORMAL(a, b), width); norm2 = USCALE_VECTOR(NORMALIZED_NORMAL(b, c), width); p1 = VECTOR_SUM(a, norm1); p2 = VECTOR_SUM(b, norm2); n1 = p1.y - m1 * p1.x; n2 = p2.y - m2 * p2.x; p.x = (n2 - n1) / (m1 - m2); p.y = m1 * p.x + n1; return p; }
int main() { int exit = 0, a_flag = -1;//, val = 0; NODE *head = NULL; VECTOR a, b; VECTOR p = vector(320.0, 240.0), v; float alpha = 0.0; int snum; LINE_LOOP *map = load_map("map.txt", &snum, 0.2); init(); a = vector(0.0, 0.0); b = vector(1.0, 0.0); head = (NODE *)malloc(sizeof(NODE)); head->val = val; head->a = a; head->b = b; head->n = NORMALIZED_NORMAL(a, b); head->parent = NULL; head->left = NULL; head->right = NULL; val++; compile_map(head, map, snum); while(!exit) { if(key[KEY_ESC]) { exit = 1; } if(key[KEY_SPACE]) { printf("\n"); key[KEY_SPACE] = 0; } if(key[KEY_LEFT]) { alpha -= 0.03; } if(key[KEY_RIGHT]) { alpha += 0.03; } if(key[KEY_W]) { p.y -= SPEED; } if(key[KEY_S]) { p.y += SPEED; } if(key[KEY_A]) { p.x -= SPEED; } if(key[KEY_D]) { p.x += SPEED; } v = vector(20.0 * cos(alpha), 20.0 * sin(alpha)); if(mouse_b == 1) { a.x = mouse_x; a.y = mouse_y; a_flag = 1; } if(mouse_b == 2 && a_flag > 0) { b.x = mouse_x; b.y = mouse_y; a_flag = 0; add_node(head, &val, a, b); val++; } clear_to_color(buffer, makecol(128, 128, 128)); //draw_tree(buffer, p, v, head, 320, 240, 10, makecol(128, 0, 0)); first = 1; traverse_tree(buffer, head, p, v); printf("\n\n"); if(a_flag == 0) vector_line(buffer, a, b, makecol(0, 0, 128)); if(a_flag == 1) vector_line(buffer, a, vector(mouse_x, mouse_y), makecol(0, 0, 128)); circlefill(buffer, mouse_x, mouse_y, 2, 0); vector_point(buffer, p, 10, makecol(0, 128, 0)); vector_line(buffer, p, VECTOR_SUM(p, v), makecol(0, 0, 0)); vector_line(buffer, p, VECTOR_SUM(p, USCALE_VECTOR(VECTOR_NORMAL(v), 200.0)), makecol(0, 0, 0)); vector_line(buffer, p, VECTOR_SUM(p, USCALE_VECTOR(VECTOR_NORMAL(v), -200.0)), makecol(0, 0, 0)); blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); } free_map(map, snum); destroy_tree(head); destroy_bitmap(buffer); return 0; }
int main() { int exit = 0; init(); BITMAP *cursor_bmp = load_bitmap("cursor.bmp", NULL); VECTOR temp_shape[100]; LINE_LOOP loop[1000]; int n = 0, sn = 0, timeout = 100, i, j; while(!exit) { if(keypressed()) { if(key[KEY_ESC]) { exit = 1; } if(key[KEY_C] && n > 2 && sn < 1000) { loop[sn].point = (VECTOR *)malloc(n * sizeof(VECTOR)); for(i = 0; i < n; i++) loop[sn].point[i] = temp_shape[i]; loop[sn].n = n; loop[sn].closed = 1; sn++; n = 0; } if(key[KEY_V] && n > 1 && sn < 1000) { loop[sn].point = (VECTOR *)malloc(n * sizeof(VECTOR)); for(i = 0; i < n; i++) loop[sn].point[i] = temp_shape[i]; loop[sn].n = n; loop[sn].closed = 0; sn++; n = 0; } } VECTOR cursor; cursor.x = (mouse_x / 5) * 5; cursor.y = (mouse_y / 5) * 5; timeout--; if(mouse_b == 1 && timeout < 1 && n < 100) { int error_flag = 0; timeout = 100; if(n > 0) if(sq_dist(cursor, temp_shape[n - 1]) < 25) error_flag = 1; if(n > 1) if(fabs(VECTOR_SLOPE(VECTOR_DIFF(temp_shape[n - 1], temp_shape[n - 2])) - VECTOR_SLOPE(VECTOR_DIFF(temp_shape[n - 1], cursor))) < 0.2 || (temp_shape[n - 1].x == temp_shape[n - 2].x && temp_shape[n - 2].x == cursor.x)) error_flag = 1; if(!error_flag) { temp_shape[n] = cursor; n++; } } clear_to_color(buffer, makecol(128, 128, 128)); if(sn > 0) for(j = 0; j < sn; j++) vector_loop(buffer, loop[j].point, loop[j].n, loop[j].closed, 0); vector_loop(buffer, temp_shape, n, -2, 0); if(n > 1) { vector_loop(buffer, temp_shape, n, 0, 0); vector_line(buffer, temp_shape[n - 1], temp_shape[0], makecol(128, 0, 0)); } if(n > 0) { vector_line(buffer, temp_shape[n - 1], cursor, makecol(0, 128, 128)); vector_line(buffer, cursor, temp_shape[0], makecol(0, 128, 128)); } draw_sprite(buffer, cursor_bmp, cursor.x - 4, cursor.y - 5); blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); } clear_keybuf(); clear_to_color(buffer, makecol(128, 128, 128)); float wall_width = 20.0; LINE_LOOP *final_shape; final_shape = (LINE_LOOP *)malloc(sn * sizeof(LINE_LOOP)); if(sn > 0) for(j = 0; j < sn; j++) { if(loop[j].n > 2 && !loop[j].closed) { VECTOR norm; int pn = loop[j].n; final_shape[j] = new_shape(pn * 2, 0); for(i = 0; i < pn; i++) final_shape[j].point[i] = loop[j].point[i]; norm = NORMALIZED_NORMAL(loop[j].point[0], loop[j].point[1]); final_shape[j].point[pn] = VECTOR_SUM(loop[j].point[0], USCALE_VECTOR(norm, wall_width)); norm = NORMALIZED_NORMAL(loop[j].point[pn - 2], loop[j].point[pn - 1]); final_shape[j].point[pn * 2 - 1] = VECTOR_SUM(loop[j].point[pn - 1], USCALE_VECTOR(norm, wall_width)); for(i = 1; i < pn - 1; i++) final_shape[j].point[pn + i] = make_wall(loop[j].point[i - 1], loop[j].point[i], loop[j].point[i + 1], wall_width); } if(loop[j].n > 2 && loop[j].closed) { int pn = loop[j].n; final_shape[j] = new_shape(pn, 1); for(i = 0; i < pn; i++) final_shape[j].point[i] = loop[j].point[i]; } if(loop[j].n == 2) { final_shape[j] = new_shape(4, 0); VECTOR norm = USCALE_VECTOR(NORMALIZED_NORMAL(loop[j].point[0], loop[j].point[1]), wall_width); final_shape[j].point[0] = loop[j].point[0]; final_shape[j].point[1] = loop[j].point[1]; final_shape[j].point[2] = VECTOR_SUM(loop[j].point[0], norm); final_shape[j].point[3] = VECTOR_SUM(loop[j].point[1], norm); } } draw_map_sketch(buffer, final_shape, sn); save_map("map.txt", final_shape, sn); blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); readkey(); free_map(final_shape, sn); for(i = 0; i < sn; i++) free(loop[i].point); destroy_bitmap(cursor_bmp); destroy_bitmap(buffer); return 0; }
int main() { int exit = 0, i; GLuint fbo, canvas, brush; init(); VECTOR arm[ARM_NUMBER], arm_normal[ARM_NUMBER], center = vector(SCREEN_W / 2, SCREEN_H / 2), p, p1, p2; for(i = 0; i < ARM_NUMBER; i++) { arm[i].x = cos(i * 2.0 * M_PI / ARM_NUMBER); arm[i].y = sin(i * 2.0 * M_PI / ARM_NUMBER); arm_normal[i] = VECTOR_NORMAL(arm[i]); } glGenFramebuffersEXT(1, &fbo); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); canvas = empty_texture(SCREEN_W, SCREEN_H); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, canvas, 0); brush = load_texture("brush.bmp", AGL_TEXTURE_MIPMAP, GL_RGB8); glBindTexture(GL_TEXTURE_2D, brush); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); while(!exit) { if(key[KEY_ESC]) { exit = 1; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); if(mouse_b == 1) { glBindTexture(GL_TEXTURE_2D, brush); glColor3ub(rand() % 128, rand() % 128, rand() % 128); glBegin(GL_QUADS); p = vector(center.x - mouse_x, center.y - mouse_y); for(i = 0; i < ARM_NUMBER; i++) { p1 = VECTOR_SUM(USCALE_VECTOR(arm[i], p.x), USCALE_VECTOR(arm_normal[i], -p.y)); p2 = VECTOR_SUM(USCALE_VECTOR(arm[i], p.x), USCALE_VECTOR(arm_normal[i], p.y)); my_rect(vector(center.x + p1.x, center.y + p1.y), 5.0); my_rect(vector(center.x + p2.x, center.y + p2.y), 5.0); } glEnd(); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, canvas); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex2f(SCREEN_W, 0.0); glTexCoord2f(1.0, 0.0); glVertex2f(SCREEN_W, SCREEN_H); glTexCoord2f(0.0, 0.0); glVertex2f(0.0, SCREEN_H); glEnd(); glBindTexture(GL_TEXTURE_2D, brush); glColor3ub(255, 0, 0); glBegin(GL_QUADS); my_rect(vector(mouse_x, mouse_y), 10.0); glEnd(); allegro_gl_flip(); } return 0; }