PDA

View Full Version : تقسیم دایره به تعداد خطهایی با طول k



saed2006
چهارشنبه 18 فروردین 1389, 17:04 عصر
مشخصات یک دایره شامل مختصات مرکز و شعاع ان را دارم
میخواهم دایره رو به تعدادی خطوط ریز با اندازه k تقسیم کرده و مختصات این خطوط را داخل یک ارایه بریزم طبق چند فرمول ریاضی دایره را به تعداد خطوطی به اندازه یک واحد تقسیم کرده ام
الان میخواهم کد زیر رو به نحوی تغییر بدهم که خطوطی با اندازه k بدست اورم



double x;
double y;
double alpha = 0;
double count = (2 * Math.PI * cr.Radius);
double degre = Calculate.ConvertDegreeToRadian(360) / count;
for (double i = 0; i < count + 1; i++)
{
x = Math.Round(cr.Center.X + cr.Radius * Math.Cos(alpha), Dgt3);
y = Math.Round(cr.Center.Y + cr.Radius * Math.Sin(alpha), Dgt3);
alpha = alpha + degre;
arrobj.Add(new FinalData(x, y, 0, "-"));
}

Arcsinos
پنج شنبه 19 فروردین 1389, 13:56 عصر
سلام
این برنامه مختصات نقاط روی دایره رو میذاره توی یه آرایه ولی از اونجایی که برای نمایش خطی به طول k ما نیاز به دو نقطه داریم مختصات خط k برابر میشه با :

cout<<"k= ("<<x[i]<<y[i]<<"),("<<x[i+1]<<y[i+1]<<")";

حالا برای اینکه خطوطی به اندازه ی k داشته باشیم باید اندازه ی t که همون تتا هست رو کوچیک کنیم از طرفی باید اندازه ی آرایه هامون رو به اندازه ی t بزرگ کنیم من اینجا دایره را به 360 خط تقسیم کردم که دیگه بقیشو میذارم به عهده ی خودت .

#include<iostream.h>
#include<math.h>
#include<conio.h>
int main()
{
double x[360],y[360],k,x1,y1,r,t;
clrscr();
cout<<"pleas inter radios and center(x,y)= ";
cin >>r>>x1>>y1;
for(t=0;t<=359;t++)
{
k=t*(3.141595/180);
x[t]=cos(k)*r+x1;
y[t]=sin(k)*r+y1;
}
getch();
return 0;
}
یه سوال توی توربو سی پی پی چجوری عدد pi رو فراخوانی کنم باmath.pi نتونستم ؟

SAASTN
پنج شنبه 19 فروردین 1389, 20:07 عصر
من اینجا دایره را به 360 خط تقسیم کردم که دیگه بقیشو میذارم به عهده ی خودت
الگوریتم شما دایره رو همیشه به تعداد ثابتی خطوط که وتر هایی از دایره بازاویه های ثابت هستند تقسیم میکنه. در صورتی که صورت مسئله این نیست. در اینجا خواسته شده که وتر ها طول ثابتی داشته باشند. علت هم به احتمال زیاد اینه که دایره قراره توی محیطی ترسیم بشه که دارای امکان بزرگنمایی هست. وقتی دایره خیلی کوچیک دیده میشه با تعداد خطوط کمتری ترسیم میشه و وقتی بزرگ میشه با تعداد خطوط بیشتر.

برای حل این مسئله می تونید از یک روش تقریبی استفاده کنید و اون هم این که از pi*r*2 برای بدست آوردن محیط دایره استفاده کنید و محیط رو تقسیم بر k کنید نتیجه تعداد تقریبی تقسیمات خواهد بود. نتیجه همیشه کمی دست بالاست و هرچی k کوچکتر بشه به جواب دقیق نزدیکتر میشه. بعدشم از همون روش بالا برای ترسیم استفاده میشه.
یک پیشنهاد: حتما یک مینیموم و ماکزیموم برای تعداد تقسیمات تعیین کنید.

Arcsinos
پنج شنبه 19 فروردین 1389, 22:57 عصر
درسته ولی اگه ما بیاییم تعداد اعضای آرایه ی x,y را زیاد کنیم و از طرفی t رو هم در حلقه ی فور t=t+0.2مثلا اینجوری قرار بدیم تعداد خطوط زیاد میشه دیگه .

SAASTN
جمعه 20 فروردین 1389, 00:25 صبح
مسئله فقط زیاد کردن تعداد اضلاع و رسیدن به انحنای دقیقتر نیست. مسئله اینه که ما با کمترین پردازش بهترین جواب رو بگیریم. یه وقت شما داری یه دایره میکشی که قطرش رو مونیتور 10 پیکسل بیشتر نیست، تو این شرایط اگه بیای یه حلقه با 360 بار تکرار برای ترسیم این دایره بنویسی عین فاجعه است و باید توی دادگاه جنایات جنگی در موردش قضاوت بشه. اینجا دایرتو می تونی با 6 تا یا 8 خط ترسیم کنی کاملا هم خوب دیده میشه. حالا یه وقت میای تو همون دایره زوم میکنی قطرش میشه 400 پیکسل، اینجا دیگه 8 تا خط جواب نمیده و باید همون دایره رو با مثلا 500 تا خط ترسیم کنی تا دایره دیده بشه.
البته اینم بگم که کل این بحثا وقتی فقط داری یه دایره می کشی هیچ اثری نداره، حالا فرض کن داری یه صحنه ترسیم می کنی که توش 5000 تا دایره هست. اینجا اگه تو هر دایره یک خط هم کمتر ترسیم بشه در کل میشه 5000 تا خط!

saed2006
جمعه 20 فروردین 1389, 08:25 صبح
حل کردم:



double x;
double y;
double alpha = 0;
double count = (2 * Math.PI * cr.Radius) / k;
double degre = Calculate.ConvertDegreeToRadian(360) / count;
for (double i = 0; i < count + 1; i++)
{
x = Math.Round(cr.Center.X + cr.Radius * Math.Cos(alpha), k);
y = Math.Round(cr.Center.Y + cr.Radius * Math.Sin(alpha), k);
alpha = alpha + degre;
arrobj.Add(new FinalData(x, y, 0, "-"));
}

SAASTN
جمعه 20 فروردین 1389, 10:52 صبح
همون شد که!:متفکر:

saed2006
جمعه 20 فروردین 1389, 13:47 عصر
همون شد که!:متفکر:

نه دیگه دقت نکردی
این کد به اندازه k جدا میکنه

SAASTN
جمعه 20 فروردین 1389, 20:20 عصر
برای حل این مسئله می تونید از یک روش تقریبی استفاده کنید و اون هم این که از pi*r*2 برای بدست آوردن محیط دایره استفاده کنید و محیط رو تقسیم بر k کنید نتیجه تعداد تقریبی تقسیمات خواهد بود. نتیجه همیشه کمی دست بالاست و هرچی k کوچکتر بشه به جواب دقیق نزدیکتر میشه. بعدشم از همون روش بالا برای ترسیم استفاده میشه.
یک پیشنهاد: حتما یک مینیموم و ماکزیموم برای تعداد تقسیمات تعیین کنید.
کد شما کاره متفاوتی نسبت به این توضیحات می کنه؟

saed2006
شنبه 21 فروردین 1389, 10:37 صبح
کد شما کاره متفاوتی نسبت به این توضیحات می کنه؟


واسه حل این مسئله این تاپیک رو زدم
منظورم از حل شدن مسئله همین بود دیگه