全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:964
推到 Plurk!
推到 Facebook!

圖片隨機移動二問?

尚未結案
enu
中階會員


發表:36
回覆:93
積分:55
註冊:2003-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-30 13:27:15 IP:163.27.xxx.xxx 未訂閱
各位先進好,不好意思,請教一個問題。根據之前的提問來做一個圖片隨機移動,http://delphi.ktop.com.tw/topic.php?TOPIC_ID=54421,RichTop大大指導如下。 但如果想要在當其中發生在東北、東南、西北、西南時,使用其它的距離替代,如distance2[] = {2,6,12,18};不知道原來的程式應該如何修改呢?想了好久,不知如何下手,懇請賜教了!感謝!     
 
//---------------------------------------------------------------------------
struct Direction
{ int dir;
  int toGo;
};
Direction dirs[32];
int distance[] = {1,5,10,15};    void init()
{ int index=0;
  for (int d=0; d<8; d  )
     { for (int k=0; k<4; k  )
          { dirs[index].dir  = d;
            dirs[index].toGo = distance[k];
            index  ;
          }
     }
}    // 方向定義(順時針方向): 0:東,1:東北,2:北,...,依此類推。
int shiftX[]={ 1, 1, 0,-1,-1,-1, 0, 1};
int shiftY[]={ 0,-1,-1,-1, 0, 1, 1, 1};    void getDxDy(int& dx, int& dy, Direction d, float scale=1) // 取x,y方向的相對位移分量
{ dx = d.toGo * shiftX[ d.dir ] * scale;
  dy = d.toGo * shiftY[ d.dir ] * scale;
}
void exchange(int times)  // 隨機交換times次
{ int index;
  Direction temp;      for (int k=0; k=Form1->ClientWidth ||
       y<0 || y>=Form1->ClientHeight   )
    return false;
  else return true;
}
bool canMoveTo(int x, int y, Direction dir) // 測試是否可以移去該位置
{ int dx, dy;      getDxDy(dx, dy, dir);
  x  = dx;
  y  = dy;
  return ( checkBoundary(x, y) );
}
void MoveTo(int &x, int &y, Direction dir)  // 真正移動
{ int dx, dy;      getDxDy(dx, dy, dir);
  x  = dx;
  y  = dy;
}
int goNext(int &x, int &y)
{ int found=0;      for (int k=0; k<32; k  )
     { if ( dirs[k].dir>=0 ) // not used.
         { if ( canMoveTo(x,y,dirs[k]) )
             { MoveTo(x, y, dirs[k]);
             Form1->Canvas->LineTo(x,y); Sleep(500);
               dirs[k].dir = -1 - dirs[k].dir;  // mark used & can be restored.
               found = 1;
             }
         }
     }
  return (found);
}    void __fastcall TForm1::Button1Click(TObject *Sender)
{ int x=100, y=100, found;
  init();
  exchange(500);
  Form1->Canvas->MoveTo(x,y);
  do { found = goNext(x,y);
     }
  while ( found!=0 );
  //showAll();
}
//---------------------------------------------------------------------------
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-30 22:45:00 IP:221.169.xxx.xxx 未訂閱
程式碼中寫得很清楚了 // 方向定義(順時針方向): 0:東,1:東北,2:北,...,依此類推。 int shiftX[]={ 1, 1, 0,-1,-1,-1, 0, 1}; int shiftY[]={ 0,-1,-1,-1, 0, 1, 1, 1}; 東北、東南、西北、西南要改成距離2,6,12,18就改成 int shiftX[]={ 1, sqrt(2), 0,-sqrt(12),-1,-sqrt(18), 0, sqrt(6)}; int shiftY[]={ 0,-sqrt(2),-1,-sqrt(12), 0, sqrt(18), 1, sqrt(6)}; 請先自己取開根號後的值
enu
中階會員


發表:36
回覆:93
積分:55
註冊:2003-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-31 12:56:49 IP:163.27.xxx.xxx 未訂閱
了解,感謝!
系統時間:2024-05-20 23:38:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!