صفحه اصلی / ▼دیگرOther / –مطالب جالبFunny Subject / چرخاندن یک شکل حول نقطه ای دلخواه در محیط گرافیکی

چرخاندن یک شکل حول نقطه ای دلخواه در محیط گرافیکی

چرخاندن یک شکل حول نقطه ای دلخواه در محیط گرافیکی
برای چرخش یک نقطه حول نقطه ای دیگر ابتدا باید فاصله تقطه را به نسبت نقطه چرخش بسنجیم . می دانیم که در محیط گرافیک نقطه (۰و۰) در گوشه بالای سمت چپ قرار دارد . پس چنانچه نقطه ای را ۱۸۰ درجه حول نقطه (۰و۰) بچرخانیم از صفحه خارج می شود . پس در ابتدا می بایست نقطه (۰و۰) را انتقال دهیم. فرض کنیم می خواهیم شکلی را نسبت به مرکز صفحه نمایش دوران دهیم . چنانچه در وضعیت ۶۴۰ در ۴۸۰ باشیم نقطه مرکز می شود : (۲۴۰و۳۲۰) حال باید به طور فرضی این نقطه را به مرکز مختصات دکارتی تبدیل کنیم . یعنی هر نقطه ای روی صفحه را نسبت به این نقطه بسنجیم . به طور مثال نقطه (۳۰۰و۳۵۰) می شود : (۶۰-و۳۰)

پس داریم :

کد:
xx=x1-column; yy=row-y1;
در واقع نقطه (xx,yy) همان نقطه (x1,y1) است اما نسبت به نقطه (column,row). حال با استفاده از توابع sin , cos نقاط جدید را می چرخانیم :

ساعتگرد :
کد:
rotatex=int(xx*cos(alfa)+yy*sin(alfa)); rotatey=int(-xx*sin(alfa)+yy*cos(alfa));
پاد ساعتگرد :
کد:
rotatex=int(xx*cos(alfa)-yy*sin(alfa)); rotatey=int(xx*sin(alfa)+yy*cos(alfa));

که در این فرمولها alfa میزان چرخش بر حسب رادیان می باشد . نقطه (rotatex,rotatey) بر حسب مختصات دکارتی بدست آمده است که باید به حالت معمول صفحه نمایش تبدیل شود . پس این بار برعکس مرحله اول عمل می کنیم :
کد:
x2=column+rotatex; y2=row-rotatey;
که در اینصورت نقطه (x2,y2) دوران یافته نقطه (x1,y1) به میزان alfa رادیان است .

برای فهم بیشتر این مساله توجه شما را به مثال زیر جلب می کنم :
کد:

#include #include #include #define COLUMN 320#define ROW 240#define PI 3.141592654void rotatexy(int,int,int,int,int*,int*,float);int main(){ int driver=DETECT,mode=0; int line1x=320,line1y=100,line2x=520,line2y=300,line3x =120,line3y=300; initgraph(&driver,&mode,”c:\\tc\\bgi”); setcolor(14); line(line1x,line1y,line2x,line2y); line(line2x,line2y,line3x,line3y); line(line3x,line3y,line1x,line1y); getch(); setcolor(0); line(line1x,line1y,line2x,line2y); line(line2x,line2y,line3x,line3y); line(line3x,line3y,line1x,line1y); rotatexy(line1x,line1y,COLUMN,ROW,&line1x,&line1y, 90); rotatexy(line2x,line2y,COLUMN,ROW,&line2x,&line2y, 90); rotatexy(line3x,line3y,COLUMN,ROW,&line3x,&line3y, 90); setcolor(14); line(line1x,line1y,line2x,line2y); line(line2x,line2y,line3x,line3y); line(line3x,line3y,line1x,line1y); getch(); closegraph(); restorecrtmode(); return 0;}void rotatexy(int x1,int y1,int column,int row,int* x2,int *y2,float deg){ int xx,yy,rotatex,rotatey; float alfa; alfa=deg*PI/180; // degree to radian xx=x1-column; yy=row-y1; rotatex=int(xx*cos(alfa)+yy*sin(alfa)); rotatey=int(-xx*sin(alfa)+yy*cos(alfa)); *x2=column+rotatex; *y2=row-rotatey;}

درباره مدیر سایت

سعید حسینی هستم کارشناسی مهندسی نرم افزار مدیر سایت و علاقه مند به فناوری اطلاعات و تکنولوژی های نو علاقه مند به وردپرس و جوملا و مدتی افتخار همکاری با انجمن پشتیبانی وردپرس پارسی را نیز داشتم. مهارتهای نرم افزاری • وب : PHP , HTML , Java script , JQuery , asp , CSS & CSS3 , Dreamweaver • برنامه نویسی : Delphi , C ++ , C sharp • بانک اطلاعاتی : SQL Server , MySQL , Oracle • طراحی : Photoshop ورزش های مورد علاقه ام شنا و فوتبال و دوچرخه سواری هستند.

همچنین بخوانید

از بین بردن تیرگی زیر بغل به روش خانگی

در ماه‌های گرم سال زیر بغل بخاطر تعریق بیشتر دچار تیرگی می‌شود.از بین بردن تیرگی …

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *