کلیدستان

نسخه‌ی کامل: تعریف یک رویه در یک ماتریس سه بعدی
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام ، من میخوام یک رویه در یک ماتریس سه بعدی تعریف کنم به عبارت دیگر میخوام شکلی مثل شکل زیر رو در یک ماتریس سه بعدی صفر ایجاد کنم که به جای رویه عدد یک باشه . میتونید کمکم کنید . ممنون

سلام دوست عزیز.
اگر به دستوراتی مثل surf و mesh که در متلب برای ترسیم سه بعدی به کار می روند، دقت کنیم، آنها از تعریف X و Y و Z ، برای رسم سه بعدی استفاده می کنند (برای هر نقطه با مختصات X و Y ، یک Z داریم که ارتفاع آن نقطه را تعیین می کند و بر این اساس شکل رسم می شوند). حال شما قصد دارید که به جای این روش، یک ماتریس سه بعدی بسازیم که همه درایه های آن صفر باشد و سپس نقاط مربوط به تعریف سطح را برابر 1 قرار بدهیم و سپس بر این اساس، بتوانیم سطح را رسم کنیم.
ابتدا بگویم که این روش را توصیه نمی کنم زیرا ماتریس مورد نظر، حجم زیادی اشغال می کند، ولی خوب مسلما شما از این مسئله آگاه بوده اید و به احتمال زیاد، این روش، مزایایی برای شما دارد که به سراغ آن رفته اید. راه حلی که به ذهن من می رسد این است که شما باید دو تابع تبدیل بسازید، یکی برای تبدیل اطلاعات از حالت X و Y و Z مرسوم (همان که توضیح دادم) به حالت 0 و 1 و یک تابع تبدیل دیگر برای تبدیل از حالت 0 و 1 به  حالت X و Y و Z مرسوم. شما پردازش های مورد نظرتان را در حالت 0 و 1 که مد نظرتان بوده است، انجام می دهید و سپس، برای رسم نتیجه و مشاهده شکل سه بعدی، از  حالت X و Y و Z مرسوم استفاده می کنید، زیرا متلب دستوراتی مثل surf و mesh (و یک سری دستور دیگر) را دارد که برای این منظور به کار می رود.
برای تبدیل حالت X و Y و Z به حالت 0 و 1 ، شما ماتریس سه بعدی شامل درایه های صفر می سازید و سپس برای هر مختصات X و Y ، باید Z امین درایه در جهت عمودی را برابر 1 قرار دهید. در واقع، در ماتریس سه بعدی که داریم، در جهت عمودی، هر ستون داده، تنها دارای یک مقدار 1 خواهد بود و سایر درایه های آن ستون، برابر 0 است. برای تبدیل حالت 0 و 1 به  حالت X و Y و Z نیز، چک می کنیم که چندمین درایه هر ستون، برابر 1 است و آنگاه، Z را بر این اساس پیدا می کنیم.
 
من میخوام یک سهموی درست کنم و هر نقطه ای که جواب داره در ماتریس سه بعدی صفر که درست کردم در اون محل یک قرار بده . دستور رسم سهموی رو در متلب نمیدونم . فقط دستوری به نام pdepe است که برای حل معادله به کار میره . در ضمن این لینک زیر رو هم ببینید :
http://www.awi-industries.com/OPTICS_aspherics.html
ولی هنوز نمیدونم باید چکار کنم ؟
سلام ، من با کدهایی که در زیر نوشتم این شکل رو درست کردم ،حالا چطوری این شکل رو به صورت یک ماتریس سه بعدی ذخیره کنم؟ تا بتونم هر جایی که مقدار وجود داره عدد یک قرار بدم؟


کد:
clc

dis=-50:1:50;
[x,y]=meshgrid(dis);
z=1/4*10^-4*(x.^2+y.^2);
[x1,y1]=meshgrid(dis);
z1=1/8*10^-4*(x1.^2+y.^2);

figure
w=mesh(x,y,-z)

hold all
w1=mesh(x1,y1,-z1)

من بعدا میخوام یک موجک در این ماتریس سه بعدی کانوالو کنم و یک مقطع از سیگنال به دست بیارم ، برای کارهای عادی متلب این مورد رو نمیخوام. فقط به طرح شکل در ماتریس سه بعدی نیاز دارم.
 
به لینکی که گذاشته بودید رفتم، شکل آن به صورت زیر است :


که از چرخش منحنی زیر به وجود آمده :


که معادله آن، به صورت زیر می باشد :


وقتی من کدهای شما رو اجرا می کنم، نتیجه به صورت زیر می باشد (شما دو مورد را همزمان رسم کرده اید) :


فقط مطمئن هستید که شکل را درست رسم کرده اید (البته اگر هدفتان این بوده که دقیقا همان شکل را رسم کنید) ؟ منظورم این است که معادله z بر حسب x و y را چگونه به دست آورده اید ؟
در ارسال قبلی، روند تبدیل ماتریس ها رو براتون توضیح دادم. برای هر z ، باید z امین عنصر ماتریس (در بعد سوم ماتریس نهایی) را برابر 1 قرار بدهید.


 
شکلی که رسم کرده ام درست است ولی شکلی که لینک داده ام مثل این شکل نیست ، در نظرم این است که دو رویه در ماتریس سه بعدی داشته باشم، ولی شکل بالا با استفاده از دستور mesh  به دست آمده ، به عبارت بهتر مقدار محور عمودی ماتریس رویه تشکیل شده رو نمیدونم و فقط مختصات x و y اون رو میدونم . در صورتی که از ضریب قبل از توان دوم ایکس بعلاوه توان دوم وای استفاده نکنیم مقدار z  بسیار زیاد میشود که در شکلی که با استفاده از دستور mesh به دست می آید میتوان دید. ماتریس صفری که قرار است تولید کنیم باید سه مختصه داشته باشد که x و  y آن مشخص است ولی مقدار z مشخص نیست . مقدار z باید از رنج مقادیر دامنه که در ماتریس z ذخیره شده است به دست بیاید. در عین حال مقادیر x و y هم از منفی شروع میشوند و این کار رو مشکل میکنه.