PDA

View Full Version : تشخیص تصادف دو شی



baradar
دوشنبه 17 خرداد 1389, 16:52 عصر
با سلام
من برنامه زیر رو نوشتم که می توانید
مربعاتی بسازید و آنها را حرکت دهید حالا من می خواهم وقتی مربعی را
بر روی فرم حرکت می دهم و با مربع دیگری برخورد می کند برای مثال یک پیغام
نمایش داده شود (مثلا مربع شماره 1 با مربع شماره 2 برخورد کرده) البته من برای
هر مربع یک خصیصه به اسم num تعریف کردم که شما می توانید بعد از حرکت
مربع در روی فرم و قرار گرفتن موس روی آن این خصیصه نمایش داده می شود
که برای هر مربع منحصر به فرد است

لطفا راهنمایی بفرمایید

حامد مصافی
دوشنبه 17 خرداد 1389, 18:45 عصر
متد intersects كلاس QRect مشخص مي كند كه آيا شي QRect با يك شي QRect ديگر حد اقل يك نقطه مشترك دارند يا خير.

baradar
دوشنبه 17 خرداد 1389, 19:33 عصر
با سلام
با تشکر از پاسختون
ولی کلاسی که من برای این کار استفاده می کنم QLabel مشتق شده آیا راهی برای
فهمیدن تصادف دو شی QLabel سراغ دارید
لطفا یه نگاهی به برنامه بندازید
ممنون میشم راهنمایی کنید

حامد مصافی
دوشنبه 17 خرداد 1389, 19:40 عصر
در شيئي كه از QWidget مشتق شده باشد متدي با نام rect دارد كه مختصات آن شي را بر مي گرداند.


if( label1->rect().intersects( label2->rect() ) )
QMessageBox::information(
this,
"برخورد كردند",
"result");
else
QMessageBox::information(
this,
"نقطه مشترك ندارند",
"result");

baradar
سه شنبه 18 خرداد 1389, 19:26 عصر
با سلام و تشکر از پاسختون
دوست عزیز من با این کد در رویدادMousePress

lb = static_cast<A*>(childAt(ev->pos())); //lb یک شی از کلاس من است
چک می کنم که آیا یک شی از کلاسم انتخاب شده یانه و بعد آنرا حرکت می دهم
ولی مشکل من این است که طبق کدی که شما فرمودید باید حتما دو لیبل
بر روی فرم داشته باشیم و من تنها اشیا کلاسم را در اختیار دارم
بنابراین نمی توانم در آن واحد به مختصات دوشی ای که به هم برخورد می کنند را داشته باشم
چون من در رویداد بالا تنها می توانم شی ای را که زیر موس است را در اختیار داشته باشم
حالا به من بگویید چگونه وقتی یک لیبل(شی کلاس A) را حرکت می دهم می توان تشخیص داد که با
لیبل دیگر(شی دیگر کلاس A ) برخورد داشته است
لطفا در این زمینه هم راهنمایی بفرمایید:خجالت:

حامد مصافی
سه شنبه 18 خرداد 1389, 20:09 عصر
هر شي از نوع A را هنگام ايجاد به يك QList اضافه كنيد و هنگام حركت شي با پيمايش در اين ليست يك يك ويدجت ها را با ديدجت جاري چك كنيد.

baradar
چهارشنبه 19 خرداد 1389, 09:05 صبح
با سلام

میشه در مورد اصطلاحات زیر توضیح بدید یا معادل انگلیسیشو رو بگید

در اين ليست يك يك ويدجت ها را با ديدجت جاري چك كنيد.
متشکرم

حامد مصافی
چهارشنبه 19 خرداد 1389, 13:29 عصر
با يك حلقه for تك تك اعضاي اين ليست را با شي جاري از طريق كدي كه قبلاً عرض كردم مقايسه كنيد كه آيا تصادف داشتند يا خير

baradar
چهارشنبه 19 خرداد 1389, 14:49 عصر
با سلام
ممنونم که با حوصله به سوالاتم پاسخ دادید
لطفا ناراحت نشید که اینقدر سوال می کنم

من کد زیر رو برای برخورد دوشئ نوشتم

//m_l ->QList شی کلاس
//lb -> شی کلاس خودم
for(i=0;i<m_l.count(); i++){
if(lb->rect().intersects(m_l.at(i)->rect())){
QMessageBox::information(this,"","contact yes");
q->processEvents();
}
ولی اشکالی که هست اون محدوده خودش رو هم با خودش محاسبه می کنه
و برخورد تشخیص میده لطفا بگید چکار کنم که محدوده خودش رو با خودش در نظر نگیره
با تشکر

حامد مصافی
چهارشنبه 19 خرداد 1389, 18:03 عصر
اين يكي از راه هاي ممكن است:


int myIndex = m_l.indexOf( lb );

for(i=0;i<m_l.count(); i++)
if ( i != myIndex )
if(lb->rect().intersects(m_l.at(i)->rect()))
{
QMessageBox::information(this,"","contact yes");
q->processEvents();
}

baradar
چهارشنبه 19 خرداد 1389, 18:22 عصر
اين يكي از راه هاي ممكن است:


int myIndex = m_l.indexOf( lb );

for(i=0;i<m_l.count(); i++)
if ( i != myIndex )
if(lb->rect().intersects(m_l.at(i)->rect()))
{
QMessageBox::information(this,"","contact yes");
q->processEvents();
}

با سلام
من کد شمارو نوشتم و مربع اول رو ساختم و اون رو در مکانی قرار دادم
ولی وقتی مربع دوم رو می سازم و اون رو می خوام حرکت بدم دایم پیغام
برخورد میده در صورتی که اصلا برخوردی اتفاق نیفتاده
لطفا راهنمایی کنید

حامد مصافی
پنج شنبه 20 خرداد 1389, 14:01 عصر
امكانش هست برنامه شما رو ببينيم؟

baradar
پنج شنبه 20 خرداد 1389, 14:55 عصر
سلام
بفرمایید اینم برنامم

baradar
جمعه 21 خرداد 1389, 08:55 صبح
کممممممممممممممممممممممک کنید :گیج:

حامد مصافی
جمعه 21 خرداد 1389, 09:14 صبح
بابت تاخیر عذر می خواهم، من برنامه شما را به این شکل اصلاح کردم