Raster= new char[BytesPerRow*Height];
for (int x = 0; x < 800; x++)
{
for (int y = 0; y < 600; y++)
{
// x * 3 as we have RGB color format so it's 3 byte each
int index = 3*x + y * BytesPerRow;
// read from raster image data
BYTE b = Raster[index];
BYTE g = Raster[index+1];
BYTE r = Raster[index+2];
}
}
ImageMap = new char[BytesPerRow*Height/3];
for (int x = 0; x < 800; x++)
{
for (int y = 0; y < 600; y++)
{
// x * 3 as we have RGB color format so it's 3 byte each
int index = 3*x + y * BytesPerRow;
// read from raster image data
BYTE b = Raster[index];
BYTE g = Raster[index+1];
BYTE r = Raster[index+2];
BYTE avg = (r+g+b)/3;
if( avg < 0 )
assert( false ); // if avg happened to be less than 0 then stop
//if( x == 25 && y == 372 )
//assert( false );
// do some clampping
if(avg > 254)
avg = 245; // assum our max cost = 254
if(avg < 50)
avg = 0; // assume less than 50 cost to be blocked
// recalculate the index
index = x + y * BytesPerRow / 3;
if(index != 0)
ImageMap[index] = avg;
else
ImageMap[0] = avg;
}
}
الان عندما اقوم باستدعاء دالة هي المسؤلة عن بناء ال grid mapvoid CPathfinder::SetupWorld( int xgridSize, int ygridsize, char** gridMapData, int bytesPerRow )
{
// setup the world for use
m_grid = new MapGrid( xgridSize, ygridsize );
//m_walkers.push_back(new BestFirstSearchMapGridWalker(m_grid));
//m_walkers.push_back(new BreadthFirstSearchMapGridWalker(m_grid));
//m_walkers.push_back(new DijkstrasMapGridWalker(m_grid));
m_walkers.push_back(new AStarMapGridWalker(m_grid));
setCurrentWalker(0);
//setHeuristicMethod(BestFirstSearchMapGridWalker::EUCLIDEANDIST);
setHeuristicMethod(AStarMapGridWalker::EUCLIDEANDIST);
setHeuristicWeight(1.0f);
// fill the m_grid with the costs from the passed grid map image data
for(int xx=0 ; xx {
for(int yy=0 ; yy {
int i = xx + yy * bytesPerRow / 3;
int cost = (*gridMapData)[i];
if( cost < 0 )
assert( false ); // if cost was -1 then stop
m_grid->setCost( xx, yy, cost );
}
}
m_currentWalker->BuildGridNode( m_grid );
}
bmp.LoadBMP ("map.bmp");
// create the path finding world here and initialize it
pathFinder.SetupWorld( 800, 600, &(bmp.ImageMap), bmp.BytesPerRow );
وفي 22/صفر/1430 05:37 م، أعرب ahmed ezz عن رأيه بالموقف كالآتي:
المتغير الثاني والذي قررت استخدامه تم تعريفه بهذه الطريقةImageMap = new char[BytesPerRow*Height/3];
ImageMap = new BYTE[Width*Height];
BYTE Value = ImageMap[x+y*Width];
//int cost = (*gridMapData)[i]; // لا حاجة لهذا
int cost = gridMapData[i]; // هكذا أفضل
for (int x = 0; x < 800; x++)
{
for (int y = 0; y < 600; y++)
{
BYTE pix = map[x+y*width];
...
}
}
for (int y = 0; y < 600; y++)
{
for (int x = 0; x < 800; x++)
{
BYTE pix = map[x+y*width];
...
}
}
في 18 فبراير 2009 02:15 ص، قال وسام البهنسي بهدوء وتؤدة:
النقطة الأخرى التي أود أن أعقب عليها هي طريقة تمرير المؤشر. لماذا **char ؟يمكنك ببساطة تمرير *char والتعامل معه بشكل عاديفي 18 فبراير 2009 02:15 ص، عقد وسام البهنسي حاجبيه بتفكير وقال:
لست مضطراً لاتباع هذه الطريقة. فـ BytesPerRow قد يكون أكثر من عرض الصورة مضروباً بحجم البكسل (لاعتبارات خاصة بالرسم لا يسعني ذكرها الآن)*(pixel++)
(1,0),(2,0),(3,0) ...
int index ;
pixel [index]
x= 0
index (0),(3),(6),(9)
x=1
index (1),(4),(7),(10)
....
01 : | 02 :
200240 | 200240
200243 | 200241
200246 | 200242
... | ...
200241 | 200247
200244 | 200248
200247 | 200249
وفي 18 فبراير 2009 09:10 ص، قال ahmed ezz متحمساً:
في الحالة الاوليتم استخدام المتغير x وسيتم الوصول اليه 800 مرةوسيتم الوصول للمتغير y في الحلقة الداخلي 800 * 600 مرةفي الحالة الثانيةتم استخدام المتغير x وسيكون ال access time له 600 مرة فقط وسيتم الوصول للمتغير y في الحلقة الداخلي 800 * 600 مرةوفي 18 شباط 2009 02:15 ص، ظهر شبح ابتسامة على وجه وسام البهنسي وهو يقول:
أخيراً، لاحظت أنك تعالج بكسلات الصورة بالمرور عليها بالطريقة الآتية:for (int x = 0; x < 800; x++)
{
for (int y = 0; y < 600; y++)
{
BYTE pix = map[x+y*width];
...
}
}
for (int y = 0; y < 600; y++)
{
for (int x = 0; x < 800; x++)
{
BYTE pix = map[x+y*width];
...
}
}
أما في 23/صفر/1430 05:30 ص، فقد تنهد tombston بارتياح وهو يرد:
هدا سيؤدي الى تغير عنوان المؤشر بطريقة اقل فعالية من الطريق السابقة .في 23/صفر/1430 06:23 ص، غمغم سلوان الهلالي باستغراب قائلاً:
للمسألة علاقة بالتعامل مع الكاش الموجودة على وحدة المعالجة المركزية بطريقة سيئة, حيث بسبب حجم الذاكرة الكبير نسبياً قد يسبب الدخول إليها بطريقة غير متعاقبة المشكلة المسماة cache thrashing, التي تقلل من فائدة خطوط الكاش لتسريع التنفيذ.