PDA

View Full Version : رسم دایره با D3DXCreateSphere



saffari2005
چهارشنبه 22 تیر 1384, 13:39 عصر
سلام

برای اشکال هندسی دو بعدی مثل دایره چگونه باید کار کنیم؟

seyedof
پنج شنبه 23 تیر 1384, 19:50 عصر
سلام
دایرکت ایکس دایره نمیکشد. در واقع همان خط را هم (دو بعدی) زورکی ساپورت میکنه.
ممنون علی

saffari2005
شنبه 25 تیر 1384, 07:59 صبح
بله , ممنون

saffari2005
سه شنبه 28 تیر 1384, 12:08 عصر
یک روش برای کشیدن دایره ساختن بیت مپ یک دایره و استفاده از sprite برای لود کردن آنست. در این صورت امکان scale و rotate ( برای بیضی ) را به آسانی خواهیم داشت.

brians2000
چهارشنبه 29 تیر 1384, 14:34 عصر
سلام

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

seyedof
جمعه 31 تیر 1384, 16:10 عصر
سلام
اگر از اسپرایت استفاده کنید فقط وقتی دایره شما درست نمایش داده میشود که اندازه مورد نمایش با اندازه اسپرایت یکی باشد و بزرگنمایی یا کوچک نمایی نداشته باشد. چون در واقع وقتی دایره را به صورت اسپرایت در نظر می گیرید موقع تغییر اندازه pixel resize میشود و برداری نیست. لذا این روش خوبی نخواهد بود.

روش دوم هم کار میکنه فقط خیلی کنده چون هر باز که از یک surface HDC میگیرید در واقع Surface قفل یا Lock میشه اطلاعاتش کپی میشه و....
بهترین روش برای اینکار تقریب دایره با خطوط است یا اینکه از الگوریتم Bresenham برای رسم دایره استفاده کنید (کاری که خود API ویندوز میکند).

ممنون علی

سپول
شنبه 01 مرداد 1384, 01:53 صبح
بهترین راه کشیدن دایره توسط یک سری خطوط هست (D3DPT_LINESTRIP) به این شکل که شما با استفاده از معادله دایره در یک صفحه خاص یک سری نقاط درست می کنید و این ها رو با خط به هم وصل می کنید ، یا اینکه اگه می خواهید دایره توپر باشه بجای خط همون هارو با D3DPT_TRIANGLEFAN می کشید . به عنوان مثال برای کشیدن یک دایره در صفحه XY :
x = center.x + radius*cos(alpha)
y = center.y + radius*sin(alpha)
z = 0.0f

که alpha از 0 - 2PI به تعداد دلخواه شما تغییر می کنه، در ضمن توجه کن که برای کشیدن LINSESTRIP باید n+1 نقطه داشته باشید که نقطه آخر، همون نقطه اولیه که این رشته رو به هم وصل می کنه. و قبلش هم یادتون باشه که ماتریس world رو identity کنید.
اگر این متد بدرد خور بود و در اجراش اشکال داشتین ، بگین تا یک کد ازش بفرستم.

saffari2005
چهارشنبه 05 مرداد 1384, 18:33 عصر
از پاسخ دوستان ممونم.


از الگوریتم Bresenham برای رسم دایره استفاده کنید (کاری که خود API ویندوز میکند).
میشه این الگوریتم رو کمی توضیح بدین؟

در ضمن نمیشه از استوانه در زوایای خاص برای رسم بیضی و دایره استفاده کرد؟

saffari2005
پنج شنبه 06 مرداد 1384, 15:44 عصر
اگر این متد بدرد خور بود و در اجراش اشکال داشتین ، بگین تا یک کد ازش بفرستم.

لطفا نمونه تون رو بفرستید.
ممنون.

kochol
جمعه 07 مرداد 1384, 11:24 صبح
سلام
من یه ایبوک دارم به نام Programming Role-Playing Games With Direcx 8.0 در اون یه قسمتی داره به نام استفاده از شکلهای 2 بعدی در محیط 3 بعدی و بلعکس ولی من که یه زره از اونو خوندم نتونستم بفهمم از چه روشی استفاده کرده اگر می خواهی حجمش 20 مگ است
می تونی emule از آدرس http://vcheck.emule-project.net/en/download.php دانلود کنی و در قسمت سرچش سرچ کنی دانلود کنی اگه سوالی داشتی بپرس

kochol
جمعه 07 مرداد 1384, 11:34 صبح
سلام
من اون یه تکه شو در فایل ورد ذخیره کردم امیدوارم به دردت بخوره

saffari2005
جمعه 07 مرداد 1384, 20:50 عصر
ممنون , مفید بود.

saffari2005
شنبه 08 مرداد 1384, 12:52 عصر
من نتونستم Programming Role-Playing Games With Direcx 8.0 را پیدا کنم یعنی در اون لینکی که داده بودین نبود , اگه میشه لینک رو دوباره بذارین.
من به فصل های دیگه هم نیاز دارم.
ممنون.

kochol
شنبه 08 مرداد 1384, 17:48 عصر
سلام
اون یه برنامه به اشتراک گذاشتن فایل هست اول اون رو دانلود کنید پس از نصب تو سرچ برنامه دنبال این بگردید تو سرچش در قسمت method گزینه kad network را انتخاب کنید و در قسمت type گزینه document را انتخاب کنید و در قسمت name هم بنویسید Programming Role-Playing Games With Direcx 8.0 بعد درست می شه و پیدا می کنه با دبل کلیک شروع به دانلود از روی کامپیوتر های شخصی می کنه همین اعلان که من اینو نوشتم سورس ها مربوط به این کتاب هم دانلود کردم

در ضمن به ما هم بگو که از چه روشی استفاده کرده بود برای این کار ممنون می شم

seyedof
یک شنبه 09 مرداد 1384, 14:43 عصر
از پاسخ دوستان ممونم.

میشه این الگوریتم رو کمی توضیح بدین؟

در ضمن نمیشه از استوانه در زوایای خاص برای رسم بیضی و دایره استفاده کرد؟

سلام
در جواب قسمت دوم : نه نمیشه اگر هم بشه چیز جالبی از آب در نمیاد.
قسمت اول : توی گرافیک کامپیوتری چون ترسیمات روی یک صفحه گسسته انجام میشه (پیکسلی) یه سری روشهای خاص برای ترسیم سریع اشکال وجود داره که در محاسباتشون فقط از جمع و تفرق استفاده میکنند. دلیلش اینه که سی پی یو ها جمع و تفریق رو سریعتر از تقسیم و ضرب و مسلما سریعتر از توابع پیچیده مثل سینوس و کسینوس انجام میدن. به همین دلیل این الگوریتمها ابداع شدند. برای ترسیم خط و دایره و بیضی الگوریتم یا روش bresenham وجود داره که فقط با استفاده از جمع و تفریق قادر به ترسیم این اشکال به صورت پیکسل به پیکسل است. توضیح الگوریتمش هم توی درس گرافیک کامپیوتری دانشگاه یا توی هر کتاب تئوری گرافیک موجود است (و همینطور روی اینترنت).
ولی برای ترسیم توسط D3D تقریب زدن توسط خط (دایره یک چند ضلعی با تعداد اضلاع بینهایت است) و استفاده از D3DPT_LINESTRIP که سپول نوشته سریعتر از روشهای دیگه است.
ممنون علی

سپول
یک شنبه 09 مرداد 1384, 17:15 عصر
یک تیکه کد برای کشیدن دایره attach کردم
راستی اینجا تو خود post چجوری می شه کد گذاشت ؟

saffari2005
یک شنبه 09 مرداد 1384, 22:43 عصر
یک تیکه کد برای کشیدن دایره attach کردم

ممنون.

راستی اینجا تو خود post چجوری می شه کد گذاشت ؟
با استفاده از تگ [code]. , البته تگ رو در آخر ببند.

saffari2005
چهارشنبه 12 مرداد 1384, 14:35 عصر
سلام
آفای سپول!
از کدتون ممنون. آیا کد مشابهی برای بیضی هم دارین؟

سپول
پنج شنبه 13 مرداد 1384, 00:36 صبح
برای بیضی دو تا radius داریم به جای یکی. در همون کد کشیدن دایره ، جایی که دارید x,y,z رو Assign می کنید
x = center.x + cos(alpha)*radius1
y=center.y + sin(alpha)*radius2
z=0.0f
برای محور x یک شعاع (radius) داریم و برای محور y هم یک شعاع دیگه

saffari2005
دوشنبه 17 مرداد 1384, 14:57 عصر
سلام و ممنون از راهنماییتون.
من کدهای مربوط به دایره رو تست کردم ولی دایره ای که کشیده می شود ( حتی با دقت بالا برای عدد پی ) بیشتر شبیه بیضی میشه تا دایره! فکر می کنید مشکل از کجاست؟

seyedof
جمعه 21 مرداد 1384, 09:37 صبح
سلام
احتمالا مشکل از aspect ratio است. اوونجایی که device رو create کردید نسبت طول و عرضش اشتباه است یا اینکه در ویندویی که نمایش میدهید اندازه هاش مطابق با device ایجاد شده نیست (در تابع Present)
ممنون علی

saffari2005
شنبه 22 مرداد 1384, 11:27 صبح
من یه ویندوی 320 در 200 دارم که اندازش ثابته!
1) تابع Present رو با پارامتر های NULL صدا می زنم.

Present( NULL, NULL, NULL, NULL );
2)در مورد نسبت طول و عرض هم از کد زیر استفاده می کنم.


D3DXMatrixOrthoOffCenterLH(&matProj, 0.0f, 320, -200, 0.0f, 0.0f, 1.0f);
pocD3DDevice -> SetTransform( D3DTS_PROJECTION, &matProj );

لطفا اشکال کارمو بگین.

camellya
شنبه 01 آبان 1389, 23:12 عصر
سلام
من میخوام با تری انگل فن دایره بکشم لطفا کدهاشو میگین بهم