PDA

View Full Version : سوال: تایمینگ در رسم اشکال هندسی متحرک با توجه به مقادیر ورودی



hamedjim
یک شنبه 18 مهر 1395, 17:31 عصر
سلام. در پروژه ای، کاربر نوع، تعداد، اندازه، میزان و سرعت تغییر نوعی از اشکال رو وارد می کنه و برنامه باید بر اساس اطلاعات ورودی شروع به رسم و تغییر اون با توجه به سرعت مشخص شده بکنه. به عنوان مثال شکل زیر رو در نظر بگیرید:
142947


در برنامه چند شکل مشابه شکل بالا توسط کاربر انتخاب میشن و مقادیر لازم برای رسم اونها به برنامه داده میشه ( تعداد شکل ها، تعداد شاخه ها، رنگ شاخه ها، min و max سایز برای شکل، سرعت بزرگ و کوچک شدن). بعد از وارد شدن اطلاعات، برنامه باید شروع به رسم شکل در حالت min بکنه و با سرعت مشخص (وارد شده توسط کاربر) شروع به بزرگ شدن و رسید به max سایز کنه. برای این کار دو مرحله نیازه.
اول تعیین فرمول ریاضی رسم این اشکال
دوم رسم شکل و تغییر اون بر اساس فرمول.

مشکل من در مرحله دوم هست. برای رسم شکل ها مجبور شدم از رسم پیکسلی استفاده کنم. در نتیجه رسم کل شکل ( که ممکنه شامل چند شکل مجزا باشه)، زمان بالایی رو نیاز داره. و این یعنی برای نمایش انیمشن تایمر من زمان کافی رو نخواهد داشت.

سوالم اینه که آیا منطق کلی برای رسم اشکال گرافیکی همینه؟ روشی برای ترسیم سریع تر وجود داره؟ آیا این منطقیه من مقادیر پیکسلی رو قبل از نمایش و انیمه، محاسبه کنم و در آرایه هایی به این صورت بریزم:
Shape[SNo].Item[INo].Value[VNo]

لطفا از هر راهنمایی مرتبط و غیر مرتبط من رو محروم نکنید.

hamedjim
دوشنبه 19 مهر 1395, 23:13 عصر
دوستان عزاداری هاتون قبول. با جستجویی که کردم، متوجه یکی از توابع api به نام PolyBezier شدم که با استفاده از چهار نقطه (نقطه ابتدایی منحنی، دو نقطه کنترلی میانی، و نقطه انتهایی) میشه منحنی رو رسم کرد و البته زمان فوق العاده کمتری رو به نسبت به رسم نقطه ای به خودش اختصاص میده.
برنامه ساده ای نوشتم و تونستم نتیجه رو ببینم:


142959

اما در نوشتن ادامه برنامه به مشکل برخوردم. البته مشکل من بیشتر عملیات ریاضی برای رسم همچین منحنی هایی هست.
به عنوان مثال برای رسم شکلی مشابه تصویر زیر با استفاده از تابع PolyBezier آیا میشه یک فرمول کلی بدست آورد؟ از دوستان دلفی کار ِ ریاضی‌بلد، کسی می تونه به من کمک کنه؟
142958

Ananas
سه شنبه 20 مهر 1395, 13:33 عصر
سلام.
از تابع TCanvase.LineTo و MoveTo استفاده کنید و یک سری نقاط رو بهش بدید تا به ترتیب بینشون خط مستقیم بکشه. و از تغییر رنگ پیکسها دونه دونه استفاده نکنید چون سرعتش خیلی کمه. سعی کنید تعداد نقاط رو تو استفاده از تابعی که گفتم جوری در نظر بگیرید که هم منحنیتون خیلی شکسته شکسته نشه و هم نقاط خیلی به هم نزدیک نباشن که فاصلشون کمتر از یک پیکسل بشه! البته از نظر عملی درست انجام میشه ولی خب سرعت کم میشه وقتی نقاطو خیلی نزدیک هم بگیرید. مثلا برای هر کدوم از منحنی های تصویر بالا میتونید حدود بیست گام در نظر بگیرید و با استفاده از حلقه مثلا بیست دفعه تابع LineTo رو صدا بزنید

golbafan
سه شنبه 20 مهر 1395, 19:51 عصر
بهتره از openGL استفاده کنید

یوسف زالی
دوشنبه 26 مهر 1395, 16:18 عصر
یک روش دیگه که عالی جواب می ده اینه که اول روی بیت مپ در حافظه رسم کنید و سپس تمام بیت مپ رو به عنوان فریم نمایش بدید.
می تونید با بازنویسی دسترسی به پیکسل ها، اونها رو خیلی خیلی سریع تر در اختیار بگیرید. مثل ScanLine

hamedjim
دوشنبه 26 مهر 1395, 17:12 عصر
سلام.
از تابع TCanvase.LineTo و MoveTo استفاده کنید و یک سری نقاط رو بهش بدید تا به ترتیب بینشون خط مستقیم بکشه.
به جای این کار از PolyBezier استفاده می کنم که تنها با یک دستور رسم منحنی رو انجام میده. در روشی که شما گفتی، همچنان بدست آوردن نقطه های مورد نظر و فرمول ریاضی منحنی، پابرجاست.



بهتره از openGL استفاده کنید
در این مورد اطلاعاتی نداشتم و با راهنمایی شما در حال سرچ و کسب اطلاعات در این زمینه هستم. اگر منابع جامعی در این زمینه هست ممنون میشم معرفی کنید. با این حال در حال حاضر به دلیل کمبود وقت، همون روش قبلی را باید پیگیری کنم.


یک روش دیگه که عالی جواب می ده اینه که اول روی بیت مپ در حافظه رسم کنید و سپس تمام بیت مپ رو به عنوان فریم نمایش بدید.
این روش هم خیلی مفیده. اما همچنان مشکل رسم منحنی ها پا برجاست.



احیانا کسی از دوستان با PolyBezier کار نکرده؟ فرض کنید من می خوام یه منحنی درجه دو رو با شرایطی که معادله‌ش و نقاط ابتدایی و انتهایی در اختیارم هست، رسم کنم. دستور PolyBezier با استفاده از چهار نقطه( دو تا اون ابتدا و انتهای منحنی هست و دو تای دیگه خارج از منحنی به عنوان نقاط کنترلی) رسم میشه. من چطور میتونم این نقاط کنترلی رو با معادله ربط بدم؟

یوسف زالی
دوشنبه 26 مهر 1395, 22:34 عصر
بیزیه خودش معادلات خودش رو داره، ارتباطی به منحنی درجه دو نداره. مگر این که تقریب بزنید، شاید این به درد بخوره:
http://math.stackexchange.com/questions/1915708/easy-way-to-draw-conics-with-bezier-control-points