-
عكس كردن شكل در سي پلاس
سلام
من شكل يك ماشين را د رسي پلاس پلاس با يك آرايه مي كشم و انرا با تابع move كه خودم تعريف كرده ام حركت مي دهم
در حركت ماشين چون تنها در راستاي افقي حركت مي كند پس تنها مقادير x تغيير مي كنند در ضمن حركت از چپ به راست است
مي خواهم كه ماشين به انتهاي صفحه نمايش(سمت راست) كه رسيد حالا مقداري به پايين بيايد (يعني y ها زياد شوند) و حالا برعكس حركت كند يعني اين بار از راست به چپ و سر ماشين كه قبلا به سمت راست بوده حالا به سمت چپ باشد
مثل اينكه اين ماشين مرتب در حال دور زدن از راست به چپ و از چپ به راست باشد.
اما نمي دانم كه نقاطم را بايد چطوري تغيير دهم چون اگه x ها را به يك نسبت زياد كنم باز هم سر ماشين روبه راست مي شود ولي من مي خوام كه روبه چپ بشه
مثل اينكه ماشين من نسبت به يك خط عمودي تقارن پيدا كنه
برنامه من:
کد:
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<graphics.h>
float points[3][17]= {{45,53,68,72,87,90,80,80,72,72,53,53,45,45,40,40,45},{40,35,35,40,44,52,52,55,55,52,52,55,55,52,52,40,40},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
class machine
{
private:
public:
machine();
void m_move(int a , int b);
void m_draw();
void m_scale(float sx , float sy);
};
void machine::machine()
{
m_draw();
}
void machine::m_draw()
{
for(float a = 0 ; a<16 ; a++)
line(points[0][a],points[1][a],points[0][a+1],points[1][a+1]);
}
void machine::m_move (int a, int b)
{
float newpoints[3][17];
int t[3][3] ={{1,0,a},{0,1,b},{0,0,1}};
for (int i =0 ; i <3 ;i++)
for (int j = 0 ; j<17 ; j++)
{
newpoints[i][j] = 0;
for (int k =0 ; k<3 ; k++)
newpoints[i][j] += t[i][k]*points[k][j];
}
for(i =0 ; i<3 ; i++)
for(j =0 ; j<17; j++)
points[i][j] = newpoints[i][j];
}
void machine::m_scale(float sx, float sy)
{
float ty , tx;
for (int i =0 ;i<13 ; i++)
{
tx = points[0][i];
ty = points[1][i];
points[0][i] =(tx-points[0][0])*sx+points[0][0];
points[1][i] =(ty-points[1][0])*sy+points[1][0];
}
}
void main()
{
int gd = DETECT , gm ;
initgraph(&gd , &gm , "C:\\Red\Language\\TC\\BGI");
int ec = graphresult();
if (ec !=0)
{
cout<<"Graph Error "<<grapherrormsg(ec);
getch();
exit(0);
}
machine m;
while(!kbhit())
{
delay(150);
cleardevice();
m.m_move(20,0);
m.m_draw();
}
getch();
closegraph();
}
لطفا راهنمايي كنيد
يه راهنمايي كوچيك هم كمكم مي كنه
مرسي
-
سلام.
یه راه اینکه که به این شکل عمل کنین :
بنابراین کافیه تابعی مثلا به این شکل به برنامه اضافه کنین:
کد:
void Rev()
{
int ax = 100;
for(float a = 0 ; a<16 ; a++)
line((100-points[0][a])+100,points[1][a],(100-points[0][a+1])+100,points[1][a+1]);
}
دوباره کدتون رو براتون میذارم :
کد:
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<graphics.h>
float points[3][17]= {{45,53,68,72,87,90,80,80,72,72,53,53,45,45,40,40,45},
{40,35,35,40,44,52,52,55,55,52,52,55,55,52,52,40,40},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
class machine
{
private:
public:
machine();
void m_move(int a , int b);
void m_draw();
void m_scale(float sx , float sy);
};
void machine::machine()
{
m_draw();
}
void machine::m_draw()
{
for(float a = 0 ; a<16 ; a++)
line(points[0][a],points[1][a],points[0][a+1],points[1][a+1]);
}
void machine::m_move (int a, int b)
{
float newpoints[3][17];
int t[3][3] ={{1,0,a},{0,1,b},{0,0,1}};
for (int i =0 ; i <3 ;i++)
for (int j = 0 ; j<17 ; j++)
{
newpoints[i][j] = 0;
for (int k =0 ; k<3 ; k++)
newpoints[i][j] += t[i][k]*points[k][j];
}
for(i =0 ; i<3 ; i++)
for(j =0 ; j<17; j++)
points[i][j] = newpoints[i][j];
}
void machine::m_scale(float sx, float sy)
{
float ty , tx;
for (int i =0 ;i<13 ; i++)
{
tx = points[0][i];
ty = points[1][i];
points[0][i] =(tx-points[0][0])*sx+points[0][0];
points[1][i] =(ty-points[1][0])*sy+points[1][0];
}
}
void Rev()
{
int ax = 100;
for(float a = 0 ; a<16 ; a++)
line((100-points[0][a])+100,points[1][a],(100-points[0][a+1])+100,points[1][a+1]);
}
void main()
{
int gd = DETECT , gm ;
initgraph(&gd , &gm , "
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
");
int ec = graphresult();
if (ec !=0)
{
cout<<"Graph Error "<<grapherrormsg(ec);
getch();
exit(0);
}
machine m;
while(!kbhit())
{
delay(150);
cleardevice();
//m.m_move(20,0);
m.m_draw();
Rev();
}
getch();
closegraph();
}
اما نکته ی جالب اینه شما هنوز نقاط رو به همون شکل سابق استفاده میکنین! که در موردش خیلی صحبت
کردیم. البته خب کدتون درسته و خوب کار میکنه.
البته برنامه کامل نیست. میتونین خودتون کامش کنین.