PDA

View Full Version : حرکت کنترل روی فرم ولی با محدودیت مکانی



mhabat
یک شنبه 15 تیر 1393, 18:44 عصر
سلام.
به یه مشکل بر خوردم که هرچی فکر روش می کنم به نتیجه نمیرسم.

داخل فرم با تنضیم رویداد ها الان یکی از کنترل هارو میتونیم روی فرم حرکت بدیم با موس.

خوب حالا میخوام که این کنترل رو فقط بتونه روی یک محور دایره یی حرکت کنه و از اون محور داخل یا خارج نشه.

مثلا یک الکترون از روی مدارش به داخل یا خارج حرکت که نمی کنه! .

یعنی نتونیم کنترل رو به هر قسمت از فرم جابه جا کنیم فقط حول یک دایره بتونیم بچرخونیم.

دوستان اگر فکر نمی دونم رفرنسی هر چی که به ذهنتون میرسه بگین شاید به نتیجه برسه!



مممنون

بدرود

plus
یک شنبه 15 تیر 1393, 19:10 عصر
توی رویداد LocationChanged کنترل بررسی کنید که اون داخل محور هست یا نه.اگه نیست به مکان قبلی (که توی همین رویداد ذخیره کردین) ببریدش. در صورتی که داخل محور هست مقدار آخرین مکان رو بروز کنید.

mhabat
یک شنبه 15 تیر 1393, 19:26 عصر
ممنون. مکان قبلی رو که تو همین رویداد هست رو که گفتین متوجه نمیشم. اینو ببینید:




privatevoid button1_LocationChanged(object sender, EventArgs e)
{
double x1, y1;
for (int i = 1; i <= 360; i++)
{ x1 = 100 * Math.Cos(i * Math.PI / 180) + 300;
y1 = 100 * Math.Sin(i * Math.PI / 180) + 100;


if (((Control)sender).Location == newPoint(Convert.ToInt32(x1), Convert.ToInt32(y1)))
{

}

}
}

plus
یک شنبه 15 تیر 1393, 22:04 عصر
فرض من این هست که ابتدای کار (قبل از هر گونه حرکتی) کنترل مورد نظر در یک مکان قابل قبول A (در محدوده) قرار داره.مکان A آخرین مکان قابل قبولی هست که کنترل در اون قرار داشته.
حالا کاربر میاد کنترل رو از A به B میبره.
اگه نقطه B در محدوده باشه (که با توجه به دایره بودن محدوده قابل بحث هست)، خوب کاربر کنترل رو به محل صحیحی برده و مشکلی نیست.حالا نقطه جدید نقطه A ی ماست.محل A رو بروز میکنیم.
اگه نقطه B در محدوده نباشه، کنترل رو به محل قبلیش یعنی A بر میگردونیم.
البته از اونجا که شما با دایره سر و کار دارین برای کاربر سخت خواهد بود که کنترل رو دقیقا روی دایره حرکت بده.باید به کاربر کمک کرد و مرحله دومی که گفتم بهتره اینطوری باشه:
اگه نقطه B در محدوده نباشه، کنترل رو به نزدیکترین نقطه به B روی دایره میبریم.حالا نقطه جدید نقطه A ی ماست.محل A رو بروز میکنیم.

بعلاوه اینکه شما باید برای نگاشت دایره از محیط ریاضی به محیط گرافیکی (پیکسل به پیکسل) یه راهکاری داشته باشید.نمیتونید صرفا با استفاده از توابع مثلثاتی یک نقطه تعیین کنید.چون این نقطه مولفه هاش میتونه اعشاری بشه ولی محیط گرافیکی ما شماره پیکسل (صحیح) دارید.

aliagamon
یک شنبه 15 تیر 1393, 22:33 عصر
والا من تو یونیتی این کارو اینطوری انجام میدم:

private void OnMouseDrag(){
if (lunched)
return;
Vector3 mousePos=Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition. y,10));
mousePos = new Vector3 (mousePos.x, mousePos.y, firstPos.z);
Vector3 delta = firstPos - mousePos;
if(Vector3.Distance(firstPos,mousePos)<3)
{
transform.position=mousePos;
}
else
{
transform.position=firstPos-delta.normalized*3;
}
}


اما متاسفانه سی شارپ در حالت عادیnormalize نداره ... اگرم داره من ندیدم ... پس کد بالا رو خودتون شخص سازی کنین درواقع خودتون بخش normalize رو بنویسین (ریاضیه دیگه ... ) حوصله ندارم براتون بنویسم اینو از تو یکی از پروژه هام کپی کردم برای همین از وکتور و خواص اون تو یونیتی استفاده شده ... خودتون دیگه درستش کنین ... (وکتور هارو بکنین پوینت distance هم خودتون با ریاضی بنویسین camera هم شما کاری نداشته باشین خودتون از e مختضات موس رو میتونین بگیرین ... )