View Full Version : رسم دایره در محیط گرافیکی C
Artakhshatra
جمعه 13 مهر 1386, 16:53 عصر
رسم یک دایره بوسیله تابع putpixel در C ؟ (فقط از همین تابع استفاده کنید ):متفکر:
Nima_NF
جمعه 13 مهر 1386, 22:40 عصر
for (i=0 ; i<= 2 * PI ; i+= U )
{
x = a + r * cos (i);
y = b + r * sin (i);
PutPixel (x , y ,RED);
}
تابع دایره ------- x^2 + y^2 = r^2
با تغییر متغیر ------ x = r * cos و y = r * sin
(یعنی همان cos برابر ضلع مجاور بر وتر برای مثلث داخل دایره و ...)
r شعاع دایره ، U میزان گام ترسیم ، a,b مرکز دایره و PI همان 3.14 می باشند.
Artakhshatra
شنبه 14 مهر 1386, 07:22 صبح
ممنون از پاسخ شما
در مورد گام ترسیم توضیح می دهید . و اینکه باید در چه محدوده ای باشد.
Nima_NF
شنبه 14 مهر 1386, 19:03 عصر
گام به رزولوشن تصویر و محیط شکل ما و شرایط مختلف مربوط می شود و برای ترسیم کردن مناسب از آن استفاده می کنیم. به عنوان مثال یک روش: چون محیط دایره برابر 2x PI x R هست اگر 2xPI (درجه 360) را بر محیط دایره تقسیم کنیم گام مناسب بدست می آید ولی مثلا برای جزییات بیشتر می توانیم دوباره آن را تقسیم بر 2 کنیم. پس گام می شود 1 تقسیم بر r یا 2xr.
متاسفانه این سایت با انگلیسی خیلی مشکل داره و من نمی توانم فرمول های تقسیمی رو راحت بنویسم
Artakhshatra
یک شنبه 15 مهر 1386, 06:22 صبح
من طبق گفته شما عمل کردم و گام تصویر را بدست اوردم من شعاع را برابر 50 در نظر گرفتم
و گام تصویر شد 0.02 ولی متاسفانه وقتی برنامه را اجرا کردم جوابی نگرفتم
اگه ممکنه بازم منو راهنمایی کنید . سپاسگزارم
Artakhshatra
یک شنبه 15 مهر 1386, 06:27 صبح
#include<conio.h>
#include<graphics.h>
main(){
int driver , mode ,i , j ;
driver = DETECT ;
mode = 0 ;
initgraph( &driver , &mode , "c:\\Red\\Language\\TC\\BIN\\bgi");
for(i=0; i<=2 * 3.14;i+=0.01)
{
int x=320+50*cos(i);
int y=240+50*sin(i);
putpixel(x,y,2);
}
getch();
}
کد برنامه ی من همینه . شاید مشکل از همین بخش باشه
Nima_NF
یک شنبه 15 مهر 1386, 21:29 عصر
اشتباه شما در مورد متغیر شمارنده ( i ) در حلقه می باشد و باید از نوع float انتخاب شود نه int در غیر این صورت در هنگام ضرب 2 در 3.14 همواره آن را گرد می کند که اشتباه است.
ضمنا بهتر است i را نیز برابر 0.0 به جای 0 قرار دهید.
Artakhshatra
دوشنبه 16 مهر 1386, 06:43 صبح
از پی گیری شما ممنونم
اجازه بدید این مورد را که گفتید لحاظ کنم ببینم جواب میده !
Artakhshatra
چهارشنبه 18 مهر 1386, 05:58 صبح
سلام
از اینکه شما منو در حل کردن این مسئله یاری کردید ممنونم . بعد از اینکه متغیر i را طبق گفته ی شما تغییر دادم ، متاسفانه بازم جواب نگرفتم . مشکل دیگه از header file بود که من بی دقتی کرده بودم و <math.h># رو ننوشته بودم ، بعد از این تغییرات بالاخره جواب داد .ممنون و خداحافظ
hector2000
چهارشنبه 18 مهر 1386, 16:51 عصر
با سلام
دیدم بحث گرافیک در c هست گفتم ما هم یک سوال بپرسیم.
یادم میاد در دوره دبیرستان از یک دستور qbasic خیلی خوشم میومد.دستور locate این دستور مکان نما را به ادرسی که ما میدادیم می برد.(البته با توجه به مد صفحه)
من چندتا کتاب را دنبال یک چیزی شبیه به دستور locate و همینطور تغییر رنگ نوشته(دستور color) در زبان سی گشتم ولی چیزی پیدا نکردم.
ایا کسی دستوری را میشناسه؟
Nima_NF
پنج شنبه 19 مهر 1386, 00:01 صبح
تا انجا که یادم می آید دستورات زیر بودند
moveto
textcolor
setcolor
textbackground
ولی به هر حال دیگه نزدیک سال 2008 هستیم و باید برنامه نویسی گرافیکی را در محیط Dos و همین طور استفاده از کامپایلر های قدیمی را فراموش کنیم و این را به دیگران نیز گوش زد کنیم.
hector2000
پنج شنبه 19 مهر 1386, 08:35 صبح
بله حق با شماست
من فقط به این جهت سوال پرسیدم چون این مساله چند سال پیش ذهن من را مشغول کرده بود
خیلی متشکرم از پاسختان
Folaani
چهارشنبه 02 آبان 1386, 13:37 عصر
برای رسم دایره از الگوریتم برسنهام استفاده کنید.
نیازی به استفاده از توابع سینوس و کسینوس ندارد و بسیار بهینه تر است (تعداد نقاط محاسبه شده دقیقا برابر تعداد نقاط قابل نمایش است).
الگوریتمش را در نت یا کتاب سی جعفر نژاد قمی میتوانید پیدا کنید. البته یک نمونه در نت پیدا کرده بودم که از مال کتاب بهینه تر است.
این چیزها همینطوری معلوم نمیشه؛ ولی وقتی تعداد و حجم بالا رفت اون موقع برنامه پرفرومانس کم میاره و کند میشه و منابع بالایی مصرف میکنه. ضمنا برای برنامه نویسیهایی مثل گیم و برنامه های کار با گرافیک یک نیاز حیاتی هست.
seyedof
پنج شنبه 03 آبان 1386, 09:58 صبح
سلام
الگوریتمهای مشهور ترسیم خط و دایره Bresenham و Wu هستند.
ممنون علی
فرزام136363
سه شنبه 30 مهر 1387, 14:18 عصر
سلام.....
کسی میدونه برای رسم ستاره با الگوریتم (dda,bersenham) چی کار باید بکنم.
لطفا کمکم کنید.مرسی
zahedeh bayani
سه شنبه 04 فروردین 1388, 15:10 عصر
سلام من رسم ستاره با الگوريتم dda,bersenham مي خوستم كسي مي دونه
mg_mahyar
سه شنبه 04 فروردین 1388, 20:13 عصر
رسم خط با این الگوریتم . در ضمن اب رسم چند خط یه ستاره بساز
heres the algorithm:
// Start
void Bresenham(int x1, int y1, int x2, int y2)
{
int slope;
int dx, dy, incE, incNE, d, x, y;
// Reverse lines where x1 > x2
if (x1 > x2)
{
Bresenham(x2, y2, x1, y1);
return;
}
dx = x2 - x1;
dy = y2 - y1;
// Adjust y-increment for negatively sloped lines
if (dy < 0)
{
slope = -1;
dy = -dy;
}
else
{
slope = 1;
}
// Bresenham constants
incE = 2 * dy;
incNE = 2 * dy - 2 * dx;
d = 2 * dy - dx;
y = y1;
// Blit
for (x = x1; x <= x2; x++)
{
putpixel(x, y); // <- being the function that actually sets the pixel
if (d <= 0)
{
d += incE;
}
else
{
d += incNE;
y += slope;
}
}
}
// End
now im guessing the problem is in the loop, its checking through the x values, however if its a vertical line, well then there will only be one x value, therefore only one point will be drawn.
i've thrown in the following:
//Start
// Check to see if we have a vertical line
if (dx == 0)
{
// Line is vertical, draw it
for (y = y1; y <= y2; y++)
{
// Start drawing
putpixel(x, y);
}
// Exit Function
return;
}
// End
sang9111
چهارشنبه 05 فروردین 1388, 02:21 صبح
دوستان بیخیال این کار ها بشید برید opengl directx یاد بگیرید که به دردتون بخوره برای یاد گرفتن اونا هم باید خیلی وقت بزارید و super bible بخونید که کار آسونی نیست پس بهتره وقت رو ارزشمند بدانید و این کهنه کار ها رو ول کنید :چشمک:
mg_mahyar
دوشنبه 31 فروردین 1388, 20:24 عصر
اینو یه نگاهی بکنید
// circle1.cpp : main project file.
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <geraphics.h>
#include "stdafx.h"
void midpoint(int x,int y,int V)
{
cin>>x>>y;
y=R;
double D=(5/4-R);
circlepoints(x,y,V);
while (y>x)
{
if(D<0) //E
{D+=2*x+3;}
else //SE
{D+=2*(x-y)+5;y--;}
x++;
circlepoints(x,y,V);
}}
void circlepoints(int x, int y, int V)
{
putpixel (x,y,V);
putpixel (-x,y,V);
putpixel (x,-y,V);
putpixel (y,x,V);
putpixel (-x,-y,V);
putpixel (-y,-x,V);
putpixel (y,-x,V);
putpixel (-y,x,V);
}
main()
{int x,y,V;
cout<<"This program draw a circle"<<"\n"<<"Please inter X and Y AND V:\n";
cin>>x>>y>>V;
midpoint(x,y,V);
cout<<midpoint(x,y,V);
getch ();
return 0;}
اینو که نوشتم دایم ازم ارور میگیره. ایرادشو میشه بگید؟ مجبورم با این کار کنم. از opengl نمیتونم استفاده کنم. میشه بگید کجای کار غلطه؟ پرسنهام رو دارم کتار میکنم با خود گرافیک .
کامپایرلم visual studio 2005 هست . هیچ کدوم از قسمتهام رو نمیشناسه. نه putpixel نه cin va........:گیج:
Nima_NF
دوشنبه 31 فروردین 1388, 22:31 عصر
اینو که نوشتم دایم ازم ارور میگیره. ایرادشو میشه بگید؟ مجبورم با این کار کنم. از opengl نمیتونم استفاده کنم. میشه بگید کجای کار غلطه؟ پرسنهام رو دارم کتار میکنم با خود گرافیک .
کامپایرلم visual studio 2005 هست . هیچ کدوم از قسمتهام رو نمیشناسه. نه putpixel نه
اول اینکه کتابخانه geraphics.h نیست بلکه graphics.h است(یعنی بود!).
دوم اینکه باید طبق استاندار های جدید برنامه بنویسید.
توضیحات بیشتر در مورد استاندارد ها این لینک (http://barnamenevis.org/forum/showthread.php?t=155776)
سوم، توابع گرافیکی قدیمی بورلند منسوخ شده اند و در ++VC قابل استفاده نیستند. با وجود اینکه در تاپیک گرافیک پست ارسال کرده اید اما آن را اصلا مطالعه نکرده اید!!
توضیحات بیشتر در مورد گرافیک در این لینک (http://barnamenevis.org/forum/showthread.php?t=103584)
mg_mahyar
دوشنبه 31 فروردین 1388, 22:33 عصر
بابا میدونم منسوخ شده. خودمم دارم Opengl میخوتنم ولی لازمش دارم. الان چندین ساعت دنبال اون کتابخونه میگردم نیست که نیست. بورلند نصب کردم نشد. vc++ نشد. یه کاری کن همین راه بیفته
این کد منه. اگر بگی چطوری بتونم راهش بندازم خیلی خیلی ممنونتم. میدونم منسوخه میدونم ایراد داره ولی چی کار کنم؟ یه راه حل بگو. ویژوالم کلا تخریب شده بورلند دارم که اصلا نمیشناسه
mg_mahyar
دوشنبه 31 فروردین 1388, 22:53 عصر
فتیلمو ضمیمه میکنم. یک مرد مومن پیدا شود ارو را بگیرد. هدر فایلش مشکل داره
// circle1.cpp : main project file.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
void circlepoints(int x, int y, int V)
{
putpixel (x,y,V);
putpixel (-x,y,V);
putpixel (x,-y,V);
putpixel (y,x,V);
putpixel (-x,-y,V);
putpixel (-y,-x,V);
putpixel (y,-x,V);
putpixel (-y,x,V);
}
void midpoint(int x,int y,int V)
{
cin>>x>>y;int R;
R=y;
double D=(5/4-R);
circlepoints(x,y,V);
while (y>x)
{
if(D<0) //E
{D+=2*x+3;}
else //SE
{D+=2*(x-y)+5;y--;}
x++;
circlepoints(x,y,V);}}
main()
{int x,y,V;
cout<<"This program draw a circle"<<"\n"<<"Please inter X and Y AND V:\n";
cin>>x>>y>>V;
midpoint(x,y,V);
cout<<midpoint(x,y,V);
getch ();
return 0;}
mg_mahyar
دوشنبه 31 فروردین 1388, 23:02 عصر
جون من این قدر منو به لینکای مختلف پاس ندید. الان چی کار کنم؟
برم توی ویژوال یا بورلند؟
بعدش چی؟ هدر فایلو میشه به انوا اضفه کرد یا باید برم دوباره سراغ opengl?
سوم.الان معادل اون putpixel چی هست؟ از چی به جاش استفاده کنم؟
s.mohseni
دوشنبه 04 بهمن 1389, 08:11 صبح
سلام این کد که نوشتین اشتباه است چون ما در حالت های مختلف d مقدار xو y متفاوت می شوند که برای شما فقط یک نقطه است .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.