# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری >  رسم دایره با D3DXCreateSphere

## saffari2005

سلام

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

----------


## seyedof

سلام
دایرکت ایکس دایره نمیکشد. در واقع همان خط را هم (دو بعدی) زورکی ساپورت میکنه.
ممنون علی

----------


## saffari2005

بله , ممنون

----------


## saffari2005

یک روش برای کشیدن دایره ساختن بیت مپ یک دایره و استفاده از sprite  برای لود کردن آنست. در این صورت امکان scale  و rotate ( برای بیضی ) را به آسانی خواهیم داشت.

----------


## brians2000

سلام

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

----------


## seyedof

سلام
اگر از اسپرایت استفاده کنید فقط وقتی دایره شما درست نمایش داده میشود که اندازه مورد نمایش با اندازه اسپرایت یکی باشد و بزرگنمایی یا کوچک نمایی نداشته باشد. چون در واقع وقتی دایره را به صورت اسپرایت در نظر می گیرید موقع تغییر اندازه pixel resize میشود و برداری نیست. لذا این روش خوبی نخواهد بود.

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

ممنون علی

----------


## سپول

بهترین راه کشیدن دایره توسط یک سری خطوط هست (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

از پاسخ دوستان ممونم.



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


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

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

----------


## saffari2005

> اگر این متد بدرد خور بود و در اجراش اشکال داشتین ، بگین تا یک کد ازش بفرستم.


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

----------


## kochol

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

----------


## kochol

سلام
من اون یه تکه شو در فایل ورد ذخیره کردم امیدوارم به دردت بخوره

----------


## saffari2005

ممنون , مفید بود.

----------


## saffari2005

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

----------


## kochol

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

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

----------


## seyedof

> از پاسخ دوستان ممونم.
> 
> میشه این الگوریتم رو کمی توضیح بدین؟
> 
> در ضمن نمیشه از استوانه در زوایای خاص برای رسم بیضی و دایره استفاده کرد؟


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

----------


## سپول

یک تیکه کد برای کشیدن دایره attach کردم
راستی اینجا تو خود post چجوری می شه کد گذاشت ؟

----------


## saffari2005

> یک تیکه کد برای کشیدن دایره attach کردم


ممنون.



> راستی اینجا تو خود post چجوری می شه کد گذاشت ؟


با استفاده از تگ [code]. , البته تگ رو در آخر ببند.

----------


## saffari2005

سلام
آفای سپول!
از کدتون ممنون. آیا کد مشابهی برای بیضی هم دارین؟

----------


## سپول

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

----------


## saffari2005

سلام و ممنون از راهنماییتون.
من کدهای مربوط به دایره رو تست کردم ولی دایره ای که کشیده می شود ( حتی با دقت بالا برای عدد پی ) بیشتر شبیه بیضی میشه تا دایره! فکر می کنید مشکل از کجاست؟

----------


## seyedof

سلام
احتمالا مشکل از aspect ratio است. اوونجایی که device رو create کردید نسبت طول و عرضش اشتباه است یا اینکه در ویندویی که نمایش میدهید اندازه هاش مطابق با device ایجاد شده نیست (در تابع Present)
ممنون علی

----------


## saffari2005

من یه ویندوی 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

سلام 
من میخوام با تری انگل فن دایره بکشم لطفا کدهاشو میگین بهم

----------

