PDA

View Full Version : رسم دايره



maryam___
چهارشنبه 09 دی 1388, 07:50 صبح
سلام
چطور يك دايره چند رنگ تو محيط c++ بكشم
لطفاكمكم كنيد

qwerty11
چهارشنبه 09 دی 1388, 08:35 صبح
اول دایره ی بزرگتر رو رسم کن بعدش دایره های کوچکتر رو !

قراره همشون هم مرکز باشن دیگه !؟

maryam___
چهارشنبه 09 دی 1388, 09:41 صبح
نه
يك دايره كه به 6 تا سكتور تقسيم شده باشه و هر سكتورش يك رنگ باشه فقط يك دايره

qwerty11
چهارشنبه 09 دی 1388, 10:04 صبح
اولاً با c++ میخوای یا c ؟
با c یه کارایی میشه کرد، اما تقریباً مطمئنم که با یه بار رسم دایره نمیشه همچین کاری انجام داد.
از متد arc استفاده کن. و با استفاده از یه حلقه هر بار شعاع رو کم کن !
این نهایت چیزیه که به ذهن من میرسه.

maryam___
چهارشنبه 09 دی 1388, 10:24 صبح
تومحيط c++ از c هم استفاده كردم اما تو رنگ اميزيش مشكل پيدا كردم
به هر حال ممنون از كمكتون

qwerty11
چهارشنبه 09 دی 1388, 10:36 صبح
این همون چیزیه که تو ذهنم بود، امیدوارم که کمکتون منه :


#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main()
{
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
int radius = 100;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");

errorcode = graphresult();
/* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();

exit(1); /* terminate with an error code */
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

for(int i=1;i<100;i++){
for(int j=1, k=0; j<7; j++, k+=60){
setcolor(j);
arc(midx, midy, k, k+60, radius);
}
radius--;
}
/* clean up */
getch();
closegraph();
return 0;
}

maryam___
جمعه 11 دی 1388, 17:10 عصر
چيزي كه تو ذهن شما بود همون چيزي بود كه مد نظر من بودممنوندر ادامه من بايد اين توپ رو تو صفحه حركت بدم اميد وارم كمكم كنيد

maryam___
یک شنبه 13 دی 1388, 20:54 عصر
حالا اگهمن بخوام بیشتر از یک شکل دایره رو صفحه داشته باشم باید تو اینکد تغییر ایجاد کنم یا اینکه در ادامه این کد چیزی بنویسم

qwerty11
دوشنبه 14 دی 1388, 07:11 صبح
اگه قرار باشه همین دایره رو حرکت بدین فقط کافیه هر دفعه یه delay بزارین و مختصات مرکزشو هر دفعه عوض کنین. البته یادتون باشه صفحه ی گرافیک رو هم باید پاک کنین.

اما اگه میخواین 2 تا دایره به همین شکل داشته باشین باید همین کد رو 2 باره تکرار کنین.

maryam___
دوشنبه 14 دی 1388, 11:34 صبح
من میخوام همین دایره رو حرکت بدم
delay چی هست و چطور باید این کار رو انجام بدم
راستش من هیچی از c نمیدونم

nfhthefresh
دوشنبه 14 دی 1388, 18:22 عصر
سلام به همه دوستان

من باید تا 2هفته دیگه یه پروژه تحویل بدم.راجع به نوشتن تابع paint برای رسم دایره مربع مثلث مکعب و مستطیل.چون خیلی وقت کم دارم ازتون .می خوام هرکس کدهاشو داره برام تو این تاپیک بذاره یا برام email کنه.ایمیل من :nfh_online@yahoo.com
خواهش می کنم کمکم کنید

kia.celever
دوشنبه 14 دی 1388, 22:19 عصر
من میخوام همین دایره رو حرکت بدم
delay چی هست و چطور باید این کار رو انجام بدم
راستش من هیچی از c نمیدونم

delay یک تابع است که باعث میشود کامپایلر به اندازه ی مدت زمان نوشته شده درون پرانتز صبر کند و به صورت زیر استفاده میشود. مثلا کد پایین باعث میشود کامپایلر یک ثانیه صبر کند.



# include <dos.h>

void main()
{
delay(100);
}


برای این که دایره رو هم حرکت بدی باید کد رسم دایره رو توی یک for بینهایت یا while قرار بدی و هر بار باید قبل از اینکه دایره رو با مختصات جدید پاک کنی یک دایره با رنگ مشکی و مختصات قبلی بکشی تا به نظر بیاد اونو پاک کرده ای.
بعد از رسم دایره هم باید یک delay بذاری که کامپایلر کمی صبر کند وگرنه تو اصلا نمیتونی حرکت دایره رو ببینی.

maryam___
سه شنبه 15 دی 1388, 14:12 عصر
برای این که دایره رو هم حرکت بدی باید کد رسم دایره رو توی یک for بینهایت یا while قرار بدی و هر بار باید قبل از اینکه دایره رو با مختصات جدید پاک کنی یک دایره با رنگ مشکی و مختصات قبلی بکشی تا به نظر بیاد اونو پاک کرده ای.
بعد از رسم دایره هم باید یک delay بذاری که کامپایلر کمی صبر کند وگرنه تو اصلا نمیتونی حرکت دایره رو ببینی.
من متوجه این حرفتون نشدم میشه بیشتر توضیح بدید

maryam___
سه شنبه 15 دی 1388, 17:04 عصر
من تابع تاخیر استفاده کردم اما حتما باید کلید اینتر رو بزنم تا تاخیر اعمال بشه وشکل جدیدم کشیده بشه
مشکلم کجاست؟

kia.celever
سه شنبه 15 دی 1388, 17:49 عصر
برای این که دایره رو هم حرکت بدی باید کد رسم دایره رو توی یک for بینهایت یا while قرار بدی و هر بار باید قبل از اینکه دایره رو با مختصات جدید پاک کنی یک دایره با رنگ مشکی و مختصات قبلی بکشی تا به نظر بیاد اونو پاک کرده ای.
بعد از رسم دایره هم باید یک delay بذاری که کامپایلر کمی صبر کند وگرنه تو اصلا نمیتونی حرکت دایره رو ببینی.
من متوجه این حرفتون نشدم میشه بیشتر توضیح بدید

مثلا فرض کن که مختصات اولین دایره ای که میخوای بکشی x=20 , y=20 باشه.
1- اول یه دایره با مختصات x,y میکشی.
2- بعد از این که دایره اول رو کشیدی باید ابتدا یه دایره مشکی با همون x,y بکشی تا روی دایره ی قبلیت بیفته و به نظر بیاد که پاکش کردی.
3- بعد از این که دایره قبلی رو پاک کردی باید دایره جدید رو با مختصات جدید بکشی پس x , y رو تغییر میدی و برمیگردی به خط 1.

ولی این برنامه یه مشکلی داره و اونم این هست که اگه تو این برنامه رو اجرا کنی کامپیوتر آنقدر سریع خط 1 و 2 رو انجام میده که تو فرصت نمیکنی دایره روببینی (کامپیوتر سریع دایره رامیکشد و پس از آن بدون هیچ مکثی پاک میکند.) پس باید یک delay بین خط 1 و 2 بذاری.

برای این که برنامه هم تا بینهایت اجرا بشه یعنی دایرت تا ابد حرکت کنه باید اونو توی یک for بینهایت بذاری. مثل این:


for (int i=0;i<i+1;)
{

}

kia.celever
سه شنبه 15 دی 1388, 17:54 عصر
من تابع تاخیر استفاده کردم اما حتما باید کلید اینتر رو بزنم تا تاخیر اعمال بشه وشکل جدیدم کشیده بشه
مشکلم کجاست؟

تابع delay فقط صبر میکند و برای اجرای دستورات بعد از آن لازم نیست کلیدی را بزنید.
احتمالا یک getch() درون حلقه است که باعث این کار میشود.

kia.celever
چهارشنبه 16 دی 1388, 07:39 صبح
یه کد نمونه:


for (int i=0; i<i+1;)
{
setcolor(10);
circle(x,y,20);
delay(100);
setcolor(0);
circle(x,y,20);
x+=10;
y+=10;
}

kia.celever
جمعه 18 دی 1388, 17:18 عصر
من که هر کار کردم نتونستم با حلقه بیشتر از یک دایره بکشم
شما اگه میتونید با این که کد که کد یک دایره رنگی است بیشتر از یک دایره بکش
اگه بتونید کمکمکنید ممنون میشم
فقط اگه تونستید با خصوصی برام ارسال کنید
ممنون

من عین این کد رو توی borlandc امتحان کردم و یه دایره ی رنگی میکشه که حرکت میکنه ولی نمیدونم مشکل شما چیه؟ شما این کد رو دقیقا توی کامپایلر کپی کنید اگه مشکلی داشت به من بگید.
در ضمن من چون جدیدا عضو شدم نمیتونم پیام خصوصی ارسال کنم.



# include <iostream.h>
# include <graphics.h>
# include <dos.h>
# include <conio.h>

void main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
int x=0;
int y=0;
for (int i=0; i<i+1;)
{
setcolor(10);
circle(x,y,20);
delay(100);
setcolor(0);
circle(x,y,20);
x+=10;
y+=10;
}
getch();
}

maryam___
شنبه 19 دی 1388, 07:34 صبح
دوست من مشکل من فقط با اون کدی هست که براتون فرستادم با اون نمی تونم حلقه
for ایجاد کنم وگرنه با بقیه کد ها مشکلی ندارم
به هر حال خیلی ممنون

maryam___
جمعه 25 دی 1388, 08:22 صبح
می خوام با زدن دکمه enter برنامه ام از حالت اجرا بیرون بیاد.
با چه دستوری باید این کار رو انجام بدم؟

qwerty11
جمعه 25 دی 1388, 09:38 صبح
می خوام با زدن دکمه enter برنامه ام از حالت اجرا بیرون بیاد.
با چه دستوری باید این کار رو انجام بدم؟

برای این کار باید از تابع ()kbhit استفاده کنی. این تابع رو هر کجای برنامت که استفاده کنی هر وقت که یه دکمه ای بزنی خروجی این تابع مقداری غیر صفر و اگر دکمه ای زده بشه مقدار صفر را خواهد داشت.(چون تو c نوع داده درستی یا نادرستی وجود نداره به جاش صفر رو معادل نادرستی و بقیه اعداد رو معادل درستی در نظر میگیرن.) حالا برای اینکه چک کنی ببینی که آیا اون کلید زده شده enter هست یا نه کافیه که با تابع ()getch اون رو چک کنی. دقت کنید که قبلاً این کلید زده شده.

این کد رو ببین.


while(1){
while(!kbhit()){
cout<<"hi";
}
if(getch()==13) break;
}
پس کافیه که شما قسمتی که قراره دایره رسم بشه رو داخل همین دو حلقه ()while قرار بدین.
امیدوارم توضیحاتم کمکتون کنه.

combo_ci
شنبه 26 دی 1388, 14:27 عصر
فکر کنم کارتو راه بندازه

maryam___
یک شنبه 27 دی 1388, 18:43 عصر
متاسفانه من نتونستم اجرای این برنامه روببینم اخه این error رو میده
constructor cannot have a return type specification
واسه رفع اون چکار باید انجام بدم؟

maryam___
یک شنبه 27 دی 1388, 18:49 عصر
:عصبانی++:ی برنامه نوشتم که وقتی اجراییش رو میبینم حدود یک پنجم از صفحه نمایش رنگش ابی و بقیه اون که برنامه هم تو همون قسمت اجرا میشه سفید میشه.واسه رفع این مشکل چکار کنم؟ :متفکر:

maryam___
یک شنبه 27 دی 1388, 20:32 عصر
برای این کار باید از تابع ()kbhit استفاده کنی. این تابع رو هر کجای برنامت که استفاده کنی هر وقت که یه دکمه ای بزنی خروجی این تابع مقداری غیر صفر و اگر دکمه ای زده بشه مقدار صفر را خواهد داشت.(چون تو c نوع داده درستی یا نادرستی وجود نداره به جاش صفر رو معادل نادرستی و بقیه اعداد رو معادل درستی در نظر میگیرن.) حالا برای اینکه چک کنی ببینی که آیا اون کلید زده شده enter هست یا نه کافیه که با تابع ()getch اون رو چک کنی. دقت کنید که قبلاً این کلید زده شده.

این کد رو ببین.


while(1){
while(!kbhit()){
cout<<"hi";
}
if(getch()==13) break;
}
پس کافیه که شما قسمتی که قراره دایره رسم بشه رو داخل همین دو حلقه ()while قرار بدین.
امیدوارم توضیحاتم کمکتون کنه.



من این کد رو وارد کردم اما قبلاز اینکه برنامه رو اجرا کنه منتظر زدن اینتر می مونه نه در حین کار
دقیقا کجاباید کد اصلیم رو وارد کنم؟

qwerty11
یک شنبه 27 دی 1388, 20:58 عصر
من این کد رو وارد کردم اما قبلاز اینکه برنامه رو اجرا کنه منتظر زدن اینتر می مونه نه در حین کار
دقیقا کجاباید کد اصلیم رو وارد کنم؟

اگه میتونی برنامت رو بذار ببینم. همینجوری نمیتونم چیزی بگم. اما همونطور که گفتم اون جایی که قراره دایره رسم بشه باید کلاً داخل این کد باشه.

kianoosh59
چهارشنبه 30 دی 1388, 01:06 صبح
salam be doostane daneshghahe shamsipour va ghazali:قلب::قلب::قلب::قلب::قلب:
.:تشویق::تشویق::تشویق::تشویق:: تشویق::تشویق::تشویق::تشویق::ت شویق::تشویق::تشویق::تشویق::تش ویق::تشویق::تشویق::تشویق::تشو یق::تشویق::تشویق: