LoginSignup
0
0

More than 5 years have passed since last update.

unko 描画 アルゴリズム

Posted at

unko 描画 アルゴリズム

algo.cpp

void algo_unko(int x1, int y1, int x2, int y2, void *data, AlgoPixel proc)
{
  int mx, my, rx, ry;
  int x, y;

  int mx2, my2;

  mx = (x1 + x2) / 2;
  mx2 = (x1 + x2 + 1) / 2;
  my = (y1 + y2) / 2;
  my2 = (y1 + y2 + 1) / 2;
  rx = ABS(x1 - x2);
  ry = ABS(y1 - y2);

  if (rx == 1) { algo_line(x2, y1, x2, y2, data, proc); rx--; }
  if (rx == 0) { algo_line(x1, y1, x1, y2, data, proc); return; }

  if (ry == 1) { algo_line(x1, y2, x2, y2, data, proc); ry--; }
  if (ry == 0) { algo_line(x1, y1, x2, y1, data, proc); return; }

  rx /= 2;
  ry /= 2;

  proc(mx, my - ry, data);  // center top

  int unkoy = ABS(y1 - y2) / 3;

  int unko_hedgh = unkoy * 0.3;
  if ( ry > rx ) {
    //unko_hedgh = unkoy * 0.4;
  }

  int j = 1;
  int k = 0;
  for ( int i = my - ry + 1; i <= (my - ry)+ unkoy; i++)
  {
    proc(mx+j, i, data);
    proc(mx-j, i, data);

    if ( i > ((my - ry)+unkoy)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy)-unko_hedgh*2){
        k = j;
      }

    }

  }

  unko_hedgh = unkoy * 0.4;

  for ( int i = (my - ry)+ unkoy + 1 ; i <= (my - ry)+ unkoy*2; i++)
  {
    proc(mx+j, i, data);
    proc(mx-j, i, data);

    if ( i > ((my - ry)+unkoy*2)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy*2)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy*2)-unko_hedgh*2){
        k = j;
      }

    }

  }

  unko_hedgh = unkoy * 0.5;
  for ( int i = (my - ry)+ unkoy*2 + 1 ; i <= (my - ry)+ unkoy*3; i++)
  {
    proc(mx+j, i, data);
    proc(mx-j, i, data);

    if ( i > ((my - ry)+unkoy*3)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy*3)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy*3)-unko_hedgh*2){
        k = j;
      }

    }

  }


  for ( int i = mx-j; i <= (mx+j); i++ )
  {
    proc(i, (my - ry)+unkoy*3, data);
  }

}

void algo_unkofill(int x1, int y1, int x2, int y2, void *data, AlgoHLine proc)
{
  int mx, my, rx, ry;
  int x, y;

  int mx2, my2;

  mx = (x1 + x2) / 2;
  mx2 = (x1 + x2 + 1) / 2;
  my = (y1 + y2) / 2;
  my2 = (y1 + y2 + 1) / 2;
  rx = ABS (x1 - x2);
  ry = ABS (y1 - y2);

  if (rx == 1) { int c; for (c=y1; c<=y2; c++) proc(x2, c, x2, data); rx--; }
  if (rx == 0) { int c; for (c=y1; c<=y2; c++) proc(x1, c, x1, data); return; }

  if (ry == 1) { proc(x1, y2, x2, data); ry--; }
  if (ry == 0) { proc(x1, y1, x2, data); return; }

  rx /= 2;
  ry /= 2;

  proc(mx, my - ry, mx2, data);

  int unkoy = ABS(y1 - y2) / 3;

  int unko_hedgh = unkoy * 0.3;

  int j = 1;
  int k = 0;
  for ( int i = my - ry + 1; i <= (my - ry) + unkoy; i++)
  {
    proc(mx+j, i, mx-j, data);

    if ( i > ((my - ry)+unkoy)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy)-unko_hedgh*2){
        k = j;
      }

    }

  }

  unko_hedgh = unkoy * 0.4;
  for ( int i = (my - ry)+ unkoy + 1; i <= (my - ry)+ unkoy*2; i++)
  {
    proc(mx+j, i, mx-j,data);

    if ( i > ((my - ry)+unkoy*2)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy*2)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy*2)-unko_hedgh*2){
        k = j;
      }

    }

  }

  unko_hedgh = unkoy * 0.5;
  for ( int i = (my - ry)+ unkoy*2 + 1 ; i <= (my - ry)+ unkoy*3; i++)
  {
    proc(mx+j, i, mx-j,data);
    if ( i > ((my - ry)+unkoy*3)-unko_hedgh*2){

      int r = unko_hedgh;
      int y = (((my - ry)+unkoy*3)-unko_hedgh) - i;
      int x = (int)round(sqrt((double)(r*r-y*y)));
      j = x+k;

    } else {
      j++;
      if ( i+1 > ((my - ry)+unkoy*3)-unko_hedgh*2){
        k = j;
      }

    }
  }

}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0