سلام
چه طوري هر شكلي را مدتها (تا زماني كه كليدي فشارداده نشده ) دوران دهم و دوران آن قابل مشاهده باشد
من نمي خوام از توابع موجود در محيط سي پلاس استفاده كنم
در حقيقت الگوريتم مي خواهم( الگوريتم خودم كار نمي كنه)
مرسي راهنمايي كنيد
Printable View
سلام
چه طوري هر شكلي را مدتها (تا زماني كه كليدي فشارداده نشده ) دوران دهم و دوران آن قابل مشاهده باشد
من نمي خوام از توابع موجود در محيط سي پلاس استفاده كنم
در حقيقت الگوريتم مي خواهم( الگوريتم خودم كار نمي كنه)
مرسي راهنمايي كنيد
دوباره سلام.
یه نمونه خیلی ساده براتون گذاشتم.
توضیحی لازم نداره. اما اگه با مشکل روبرو شدین اطلاع بدین.
برای دورانش هم کافیه از :کد:
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
int points[2][2] = { {240,100},{240,300} };
void Rotate(float an)
{
float Angle;
int i;
int Tx,Ty;
Angle = an * (22.0/7.0)/180.0;
for (i=0; i<2; i++)
{
Tx = points[i][0];
Ty = points[i][1];
points[i][0] = (Tx - 320)*cos(Angle) -
(Ty - 240)*sin(Angle) + 320;
points[i][1] = (Tx - 320)*sin(Angle) +
(Ty - 240)*cos(Angle) + 240;
}
line ( points[0][0],points[0][1],points[1][0],points[1][1]);
}
void main()
{
int gd = DETECT , gm ;initgraph(&gd , &gm , "C:\\Red\\Language\\TC\\BGI");
int errorcode = graphresult();
if ( errorcode != 0)
{
cout<<"graphics error"<<grapherrormsg(errorcode);
getch();
exit(0);
}
line ( points[0][0],points[0][1],points[1][0],points[1][1]);
Rotate(30);
getch();
}
استفاده کنین. و بعد از هر بار چرخش cleardevice رو به کار ببرین.کد:while(!kbhit())
{
//some code
}
سلام
راهنمايي هاي شما بسيار عاليند
ولي دوست دارم كه اين فرمول دوران را هم برام بگيد (اگه ممكنه)
فرمول دوران من فكر نكنم با شما فرقي بكنه ولي هر چي روي فرمول شما كار كردم نفهميدم از كجا اومده
فرمول دوران من اين طوريه:
من اول تمام نقاطم را به نقطه 0و0 مي برم و حالا دوران مي دهم و بعد به نقطه قبلي بر مي گردانم
ولي كار نمي كرد و شما لطف كرديد
ماتريس انتفال شكل به نقطه 0و0 :
[HTML]
1 0 x
0 1 y
1 0 0
[/HTML]
ماتريس دوران:
[HTML]
cos(p) -sin(p) 0
sin(p) cos(p) 0
0 0 1
[/HTML]
ماتريس انتقال به جاي اول:
[HTML]
1 0 -x
0 1 -y
0 0 1
[/HTML]
حالا راه شما براي دوران دادن چي بوده
مرسي از راهنمايي هاتون
دوباره سلام.
لطف دارین. در مورد برنامه ها یه PM براتون فرستادم . نمیدونم خوندید یا نه.
مختصاتی که شما در حال کار با اون هستید دو بعدی هست. یعنی x,y . بنابراین برای رسم یه
خط شما به یک آرایه ی دوبعدی نیاز دارین. که معمولا شما 3 بعدی اونرو تعریف کردین. همین موضوع درباره
ماتریس دروان صدق میکنه. وقتی در 2 بعد کار میکنین ماتریس دروان هم 2 بعدیه. که شما 3 بعدی اونرو به کار
می برین. مثل رابطه ی زیر :
و یا به شکل ماتریسی :کد:
x' = x.cos(@) + y.sin(@)
y' = y.cos(@) - x.sin(@)
فکر کنم روش کار مشخصه. مقادیر 240 و 320 هم مربوط به انتقال شکل هست. اگه دقت کنین screen sizeکد:|x'| |cos@ sin@| |x|
| | = | | | |
|y'| |-sin@ cos@| |y|
شما در DETECT Mode برابر با 480*640 هست. کافیه مقدار x رو 320 یعنی نصف 640 انتقال بدین. و همین طور
برای y . میتونین این مقادیر رو در برنامه حذف کنین تا ببینین چه تغییری میکنه.
ضمنا نقطه ی (0و0) در مرکز screen نیست. گوشه بالا و سمت چپ نقطه ی (0 و0) هست.
روش شما هم درسته. اما بعد سوم. می تونین از روش خودتون استفاده کنین. ولی کار خودتون پیچیده تر میشه
و عیب یابی کد سخت تر.
برای واضحتر شدن کد زیر رو ببینین: (برای دوران یک نقطه)
کد:void ComputeMatrix(float matrix[2][2], float angle)
{
matrix[0][0] = cos(angle);
matrix[0][1] = sin(angle);
matrix[1][0] = -sin(angle);
matrix[1][1] = cos(angle);
}
void RotateCoordinates(float rot[2][2], float old[2], float transformed[2])
{
transformed[0] = (rot[0][0] * old[0]) + (rot[0][1] * old[1]);
transformed[1] = (rot[1][0] * old[0]) + (rot[1][1] * old[1]);
}
سلام لطفا میشه برنامه دوران یک شکل را حول نقطه با c ++ را هم بگید