PDA

مشاهده نسخه کامل : کد چرخش مکعب در MATLAB



MahdiAlHoseini
29-04-15, 12:00
بسم الله الرحمن الرحیم
با سلام
هر کدام از کدهای زیر چه کار می کنند؟
ماتریس های vertex_matrix وfaces_matrix چه چیزی از مکعب را تعریف می کنن؟
و نهایتا تابع patch چه می کند؟

vertex_matrix = [0 0 01 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1];
faces_matrix = [1 2 6 5
2 3 7 6
3 4 8 7
4 1 5 8
1 2 3 4
5 6 7 8];
patch('Vertices',vertex_matrix,'Faces',faces_matri x,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
view(3); axis square
با تشکر:11():

ravegoat
29-04-15, 22:10
با سلام!

دوست گرامی به شهر سخت افزار خوش آمدید.

vertex_matrix ماتریس رئوس بوده که هر سطر آن معرف یک نقطه است. ستون اول این ماتریس شامل مولفه ی x، ستون دوم مربوط به مولفه ی y و ستون سوم مربوط به مختصه ی z در فضای کارتزین سه بعدی است.

faces_matrix ماتریس وجوه بوده که هر سطر آن معرف یک وجه است. هر ستون این ماتریس بیان گر یکی از رئوس تشکیل دهنده ی آن وجه خواهد بود.

دستور patch جهت تشکیل یک حجم سه بعدی با ترکیبی از چند ضلعی ها است. ورودی های این تابع عبارت اند از:

ماتریس رئوس
ماتریس وجوه
ویژگی های رنگ


دستور view(3) جهت تعیین زوایه ی دید در فضای سه بعدی است.

دستور axis square نیز برای تساوی مقایس محور های مختصات به کار می رود.

موفق باشید
آرمین:11():

MahdiAlHoseini
01-05-15, 14:37
بسم الله الرحمن الرحیم
با سلام
چه جوری میشه این مکعب رو در فضا دوران داد؟
با سپاس فراوان:give_rose:

ravegoat
03-05-15, 22:38
با سلام!

رئوس مکعب را در ماتریس دوران ضرب نمایید. برای اطلاعات بیش تر:
The Mathematics of the 3D Rotation Matrix (Only the registered members can see the link)

شاد باشید

MahdiAlHoseini
05-05-15, 14:43
بسم الله الرحمن الرحیم

با سلام!
رئوس مکعب را در ماتریس دوران ضرب نمایید. برای اطلاعات بیش تر:
The Mathematics of the 3D Rotation Matrix (Only the registered members can see the link)

شاد باشید
با سلام
کاری که گفتید رو انجام دادم ولی متاسفانه فقط شکل چرخش پیدا کرد؛ در صورتی که می خوام در فضا دوران داشته باشه.(مکعب دوار)
با سپاس فراوان:11():

ravegoat
05-05-15, 21:02
بسم الله الرحمن الرحیم

با سلام
کاری که گفتید رو انجام دادم ولی متاسفانه فقط شکل چرخش پیدا کرد؛ در صورتی که می خوام در فضا دوران داشته باشه.(مکعب دوار)
با سپاس فراوان:11():
امکانش هست که منظورتون روشن تر بیان بفرمایید؟ آیا قصد نداشتید که شکل رو بچرخونید؟ اگر می خواهید مکعب ثابت باشه و شما به عنوان ناظر در اطراف مکعب بچرخید باید از دستور view استفاده کنید.
باز اگر منظورتون رو واضح تر بیان کنید، بنده هستم در خدمتتون...

MahdiAlHoseini
06-05-15, 10:28
بسم الله الرحمن الرحیم
با سلام
از پاسختون بینهایت سپاسگزارم؛ درست متوجه شدید می خوام بچرخه.
بنده با توجه به ماتریس دوران کد زیر رو نوشتم:

vertex_matrix = [0 0 01 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1];
%faces_matrix = [1 2 6 5
%2 3 7 6
%3 4 8 7
%4 1 5 8
%1 2 3 4
%5 6 7 8];
Rotate_matrix=[sqrt(2)/2 sqrt(2)/2 0
-(sqrt(2)/2) sqrt(2)/2 0
0 0 1];
vertexRotate=vertex_matrix*Rotate_matrix;
patch('Vertices',vertexRotate,'Faces',faces_matrix ,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
view(3); axis square
باید داخل حلقه for بذارم؛ و یا ...
لطفا اصول کار رو توضیح بدید بعد دوباره کد بزنم.
با سپاس فراوان

ravegoat
06-05-15, 23:27
با سلام!

خواهش می کنم دوست عزیز...

اگر قصد دارید دوربین رو حول مکعب دوران بدید می تونید از کد زیر استفاده کنید:


vertex_matrix = [0 0 0
1 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1];
faces_matrix = [1 2 6 5
2 3 7 6
3 4 8 7
4 1 5 8
1 2 3 4
5 6 7 8];
patch('Vertices',vertex_matrix,'Faces',faces_matri x,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
for i=0:360
view(i,30)
axis square
getframe;
end


در کد بالا یک حلقه در نظر گرفته شده که درون آن تابع view (تابع تعیین جهت گیری دوربین) در مختصات کروی مقدار دهی میشه. البته این مقدار دهی می تونه در دستگاه مختصات کارتزین نیز صورت بگیره. در این مقدار دهی زاویه ی φ مقدار ثابت 30 درجه رو خواهد داشت و زاویه ی θ توسط شمارنده ی i از 0 تا 360 درجه تغییر می کنه. دستور getframe وظیفه ی عکس گرفتن از پنجره ی Figure رو بر عهده داره. به دلیل بار پردازشی این دستور، حلقه آهسته تر از حالتی اجرا میشه که دستور getframe درون حلقه وجود نداشته باشه. در نتیجه روند چرخش به شکل محسوس تری برای کاربر به نمایش در می آید.
لازم به ذکره اگر تصویر زمینه ای به عنوان مرجع در گرافیک وجود نداشته باشه، چرخش خالص مکعب و چرخش دوربین حول مکعب هر دو به یک شکل دیده خواهند شد.

شاد و موفق باشید
آرمین:11():

MahdiAlHoseini
07-05-15, 15:21
بسم الله الرحمن الرحیم
با سلام
می خوام اینکار رو با استفاده از ماتریس دوران بنویسم؛ کد زیر رو نوشتم ولی متاسفانه جواب نمی ده.

vertex_matrix = [0 0 01 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1];
faces_matrix = [1 2 6 5
2 3 7 6
3 4 8 7
4 1 5 8
1 2 3 4
5 6 7 8];
Rotate_matrix=[sqrt(2)/2 sqrt(2)/2 0
-(sqrt(2)/2) sqrt(2)/2 0
0 0 1];
for i=0:360
vertex_matrix=vertex_matrix*Rotate_matrix;
patch('Vertices',vertex_matrix,'Faces',faces_matri x,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
view(3);
axis square
%getframe;
end
با سپاس فراوان:11():

ravegoat
10-05-15, 11:30
با سلام مجدد

اگر قصد دارید که از ماتریس دوران استفاده کنید، محور دوران باید تعیین شود (اطلاعات بیش تر (Only the registered members can see the link)).

کد زیر را بررسی بفرمایید:


vertex_matrix = [-0.5 -0.5 0
0.5 -0.5 0
0.5 0.5 0
-0.5 0.5 0
-0.5 -0.5 1
0.5 -0.5 1
0.5 0.5 1
-0.5 0.5 1];
faces_matrix = [1 2 6 5
2 3 7 6
3 4 8 7
4 1 5 8
1 2 3 4
5 6 7 8];

for i=0:360
clf
Rotate_matrix=[cos(i/57) -sin(i/57) 0
sin(i/57) cos(i/57) 0
0 0 1];

vertex_matrix=vertex_matrix*Rotate_matrix;
patch('Vertices',vertex_matrix,'Faces',faces_matri x,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
axis square
view(3);
getframe;
end


البته احتمالا به دلیل سرعت ترسیم گرافیکی اثر استروبوسکوپی رخ بده.

موفق باشید
آرمین:11():