PDA

View Full Version : مرتب سازی مستطیل های کوچک در یک مستطیل بزرگ (rectangle packing)



the end
جمعه 30 آبان 1393, 14:52 عصر
سلام خدمت دوستان و اساتید عزیز
من قصد نوشتن برنامه rectangle packing رو داشتم که بعد از کلی تحقیق الگوریتم مناسب برای این کار رو پیدا کردم که الگوریتم آن بر مبنای مرتب سازی مستطیل بر اساس مساحت و قرار دادن اونها در مختصات مناسب با اندازه گیری فضا ها ی خالی انجام میگیرد،
من ابتدا تصمیم گرفتم این برنامه رو تو محیط کنسول ارایه بدم ولی به شدت برای برای نمایش مسطتیل ها به مشکل خوردم،،، این قراره که خروجی کار من باشه



* ‌*‌ * * * * * * * *
* $ $ $ $ *
* $ $ *
* $ $ $ $ *
* # # # *
* # # *
* # # # *
* *
* *
* * * * * * * * * *


و این هم کدی هست که بنده تا الان نوشتم که شامل گرفتن مقادیر از کاربر ، مرتب سازی و نمایش میشه که تو قسمت نمایش مستطیل اصلی رو نمایش میدم ولی تو گذاشتن شرط ها برای نمایش مستطیل های کوچکتر مشکل دارم



#include <iostream>using namespace std;


int main(int argc, const char * argv[]) {

int xmain_rec=0 , ymain_rec=0 , rec_number;

cout << "Please Enter size of main rectangle, 0-1200 for x and 0-800 for y" << endl;
cin >> xmain_rec >> ymain_rec;
while (xmain_rec > 1200 || ymain_rec > 800) {
cout << "error: main size of rectangle must be beetwin 0-1200 and 0-800,,, enter again: " << endl;
cin >> xmain_rec >> ymain_rec;
}
cout << "ok , Now enter number of rectangle you want packing" << endl;
cin >> rec_number;
int sizeOfRec_x[rec_number],sizeOfRec_y[rec_number],i=0,Area_rec[rec_number],SumSize_x = 0,SumSize_y = 0;

while (SumSize_x < xmain_rec || SumSize_y < ymain_rec) {
cout << "please Enter size of rectangle number " << i+1 << ":" << endl;
cin >> sizeOfRec_x [i] >> sizeOfRec_y [i];
Area_rec[i] = sizeOfRec_x [i] * sizeOfRec_y[i];

while (sizeOfRec_x [i] < 0 || sizeOfRec_x [i] > xmain_rec || sizeOfRec_y [i] < 0 || sizeOfRec_y [i] > ymain_rec) {
cout << "Error: Enter size of rectangles beetwin 0-1200 and 0-800,,, Please Enter again:" << endl;
cin >> sizeOfRec_x [i] >> sizeOfRec_y [i];
}
SumSize_x += sizeOfRec_x [i];
SumSize_y += sizeOfRec_y [i];

i++;
if (i >= rec_number) {
break;
}
}




int temp_x,temp_y, flag=0,z;

for (flag=0; flag < rec_number; flag++) {

for (z=flag+1 ; z<rec_number ; z++) {
if (Area_rec[z] > Area_rec [flag]) {
temp_x = sizeOfRec_x[z];
sizeOfRec_x[z] = sizeOfRec_x [flag];
sizeOfRec_x [flag] = temp_x;
temp_y = sizeOfRec_y [z];
sizeOfRec_y [z] = sizeOfRec_y [flag];
sizeOfRec_y [flag] = temp_y;

}
}

}

int temp1=1,temp2=0, gem=0, kem=0;

for (flag=0; flag < ymain_rec; flag++) {

if (flag==0 || flag==ymain_rec - 1) {

for (i=0; i<xmain_rec +1; i++) {
cout << "* ";
}
} else {
for (int w=0; w<xmain_rec ; w++) {
if (w==0 ) {
cout << "*";
}




if (w==xmain_rec-1) {
cout << " *";
} else {

if (gem < sizeOfRec_x[temp1]) {
cout << " #";
gem++;

}




else
cout << " ";
}
}

}
cout << endl;

}



return 0;
}




حالا به نظر شما عقلانی هست که من اینو تو کنسول نمایش بدم؟ یا برم سراغ کتابخونه های دیگه چون تجربه زیادی تو برنامه نویسی ندارم و مبتدی هستم، قبل از این هم خواستم از opengl استفاده کنم که رفتم خوردم به vertex shader و امثال اینها که دیدم اصلا کار من نیست، آیا دوستان راه حل یا پیشنهادی دارند که من اینو تموم کنم یا از کتابخونه های گرافیکی که کار کردن باهاشون سخت نباشه استفاده کنم خواهشا من رو یاری کنید.

the end
شنبه 01 آذر 1393, 15:48 عصر
کسی راهکاری به ذهنش نمی رسه این حقیر رو کمک کنه

rahnema1
شنبه 01 آذر 1393, 18:05 عصر
سلام
اگه با devcpp 4.9.9.2 کار می کنید می تونید از این فایلها که گذاشتم استفاده کنید. قابلیتهای گرافیکی توربو را به dev اضافه می کنه
وقتی devcpp نصب شد دو فایل libbgi.a وlibconio.a را در فولدر lib که در مسیر نصب devcpp قرار داره کپی کنید
همچنین دو فایل graphics.h و conio2.h را هم در فلدر include کپی کنید
یک نمونه sample برای کار با این کتابخانه هم هست کافیه project2.dev را باز کنید و کدی که داخل main هست را به دلخواه خودتون تغییر بدید .بعد از از منوی execute به ترتیب گزینه های compileو run را اجرا کنید

شما باید از تابع Rectangle استفاده کنید