ورود

نسخه کامل مشاهده نسخه کامل : سوال راجع به برنامه ای در محیط بورلند سی



diana_1989
01-03-2011, 11:16
سلام دوستان
من این قطعه کدرو در محیط گرافیکی بورلند سی نوشتم .
شکل یک طرح از رسم هایی که در دوران راهنمایی تو کتاب ریاضیمون بود.
حال اگه بخوام به اندازه ی 45 درجه این شکل رو بچرخونم کجای برنامه رو باید تغییر بدم ؟




int x=320 , y=40;
for (i=0 ; i<=20 ; i++)
{
line (320 , y , x, 240) ;
line (320 , y , 640-x, 240) ;
line (320 , 480-y , x, 240) ;
line (320 , 480-y , 640-x, 240) ;
x+=10;
y+=10;
}

MosaferJade
01-03-2011, 23:27
سلام
نسبت به چه نقطه ای می خواید چرخش داده بشه

diana_1989
04-03-2011, 14:42
حول همون نقطه اي كه قرار داره . اين برنامه اي كه من نوشتم دقيقا در وسط صفحه رسم ميشه .
ببينين اين شكل حالت مربع داره اگه 4گوشه اش رو به هم وصل كنيم .
حالا اگه بخوام شبيه لوزي بشه يعني به اندازه 45 درجه شكل قبلي رو بچخونم چه كدي بايد بنويسم ؟

MosaferJade
04-03-2011, 19:11
من یه توضیح میدم چکار باید بکنید دیگه خودتون برید روش فکر کنید
نمیدونم از مثلثات چیزی می دونید یا نه .
اول اینکه شما برای هر خط کشیدنی به دوتا نقطه لازم دارید (x1,y1) و (x2,y2) شما باید یه تابعی رو طراحی کنید که این دوتا نقطه رو مانند تابع line بگیره و درون اون اول نقاط را یکی یکی جابجا کنید و بعد نقاط جدید به دست آمده را در تابع line قراردهید و در کدی که در بالا نوشتید فقط به جای کلمه line اسم تابعی را که نوشتید قرار بدید تا کارتون حل بشه
اما اینکه این نقاط جدید را چطوری بدست بیاوریم
الان شما اگه درست متوجه شده باشم می خواهید نسبت به نقطه (320,240) بچرخه درست
من یکی از نقاط رو توضیح میدم اونیکی رو هم کپی همین انجام بدید
نقطه ای که من دارم مثلا فکر کن (a1,b1) هست اگه بین دو نقطه (a1,b1)و(320,240) بکشیم شیب خط میشه
m=(240-b1)/(320-a1)0 از اینجا میشه زاویه بین این خط و محور x را بدست آورد با تابع arctan که در cوc++ وجود دارد
z=arctan(m)0 حالا z را با زاویه 45 درجه شما جمع می کنیم (یادتون باشه تو cوc++ زاویه ها برحسب رادیان هست)
z جدید به این صورت استفاده می کنید m=tan(z)0 حالا m شیب خط جدید هست که از نقطه (320,240) می گذرد حالا
برمی گردیم روی نقطه اول و فاصله بین (320,240)و (a1,b1) را می گیریم r=sqrt((320-a1)^2+(240-b1)^2)0
معادله خط جدید میشه y-240=m(x-320)0 حالا روی این خط نقاطی راپیدا کنید که به فاصله r از نقطه(320,240) باشد
که اتفاقا دوتا نقطه بدست می آید که شما باید بفهمید که کدومش نقطه موردنظر شماست این دوتا نقطه هم با حل دو معادله و دو مجهول زیر بدست می آید

y-240=m(x-320)0
r^2=(x-320)^2+(y-240)^2

که اگه اینو بدست بیارید دو تا نقطه بدست میاد که یکیش نقطه مورد نظر شماست
وقت نداشتم روش خوب فکر کنم اگه وقت کردم حتما براتون کامل می نویسم
فکر کنم تو c یه تابع بود واسه چرخش تصاویر اسمش یادم نمیاد
نزدیک به چها سال پیش که باهاش کار می کردم اگه اونم پیدا کردم واست همینجا میزارم
موفق باشید

z3inab
06-03-2011, 07:54
راهی که محبوبه گفته است راه درستی است. ولی راه بهتر در برنامه نویسی استفاده از ماتریس ها هست. این روشی است که در تمام برنامه های گرفیکی یا شبیه سازی فیزیک به کار می رود. ماتریس ها برنامه را خیلی ساده تر می کنند و کد کوتاه تری هم خواهید داشت.
اگر از هندسه دبیرستان یادتان باشد برای تمام تبدیل های هندسی یک ماتریس وجود دارد. این جا شما به ماتریس چرخش دو بعدی نیاز دارید.
عبارت انگلیسی آن Rotation Matrix هست اگر می خواهید سرچ کنید. برای دو بعدی:

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

θ زاویه است که می خواهید چرخش به آن اندازه شود. همانطور که محبوبه گفت باید برای خط ها نقاط ابتدایی و انتهایی را نگهداری کنی. باید از بردار یرای این کار استفاده کنی در این حالت. مثلا اگر نقطه ای داری در x=10, y= 5 آنرا با بردار

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

T نشان می دهد که من ترنسپوز Transpose (ببخشید یادم نیست فارسیش چی می شود) آن را نوشته ام. چون در حالت معمولی بردار ها یک ماتریس ۲ در ۱ هستند (عمودی). حالا برای محاسبه x , y جدید کافیست که بردار را در ماتریس ضرب کنید:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

همانطور که می دانی R یک ماتریس ۲ در ۲ است و بردار یک ماتریس ۲ در ۱ است. پس حاصل ضرب یک بردار ۲ در ۱ است که مختصات جدید نقزه بعد از چرخش است. اگر همه نقطه ها را در یک آرایه از بردار ها نگهدار کنی کافیست برای چرخش ماتریس R را در همه بردار های داخل آرایه ضرب کنی تا جای جدید نقاط را بگیری. هم می توانی این را خودت بنویسی چون ساده است. اما اگر برنامه ای بنویسی که خیلی با ماتریس ها و بردار ها سر و کار دارد تعداد زیادی کتابخانه برای این کار نوشته شده است. مثلا

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
را ببینید.

پی نوشت: اگر مرکز چرخش را می خواهید نقطه ای غیر از مرکز مختصات باشد باید یک جابجایی برای همه نقطه ها٫ نقطه مرکز چرخش را به مرکز منقل کنید و چرخش را انجام دهید و بعد همه نقاط را دوباره جابجا (translate) کنید.
پی نوشت ۲: این چیزی که نوشتم برای حالیت کلی است. چون نقاط در برنامه تو توسط معادله تولید می شوند می توانی مستقیم برای معدله چرخش را انجام بدهی. من برای یک چهارم اول (راست بالا) این را توضیح می دهم شما حتما می توانی برای سه قسمت دیگر انجام دهید. با فرض اینکه چرخش در جهت عقربه های ساعت مورد نظر است. اول اینکه چون فاصله ابتدا ( و انتهای) خط ها در هر تکرار ۱۰ تا در محور x , y افزایش دارد. اگر ۱۰ واحد را ۴۵ درجه بچرخانی می شود تقریبا 7.071 در هر دو محور یعنی:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مرکز گرافیک تو در ۳۲۰ و ۲۴۰ است. پس نقطه شروع خط اول که ۳۲۰ و ۴۰ است (بعد از جابجایی ۳۲۰ و ۲۴۰ به مرکز) می شود ۰ و ۲۰۰. حالا ان نقطه را با ماتریس چرخش ۴۵ درجه چرخش می شود 141.421- , 141.421 و بعد از برگرداندن مرکز به ۳۲۰ و ۲۴۰ مختصات جدید می شود: 461.42 و 98.57.
و چون انتهای خط از مرکز چرخش شروع می شود همانجا می ماند.

پس برنامه برای یک چهارم اول شکل اینطوری تغییر می کند:



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خروجی برنامه این است:

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

برای کد بهتر باید float ها را روند کرد به جای قطع کردن. شاید برای بورلندباید کمی تغییر دهید اگر error بدهد.