Ejemplo n.º 1
0
Archivo: HAP3.c Proyecto: nilqed/qepcad
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}