رفتن به مطلب

پیداکردن مختصات سه بعدی نقطه به کمک متلب


setarehbaran

ارسال های توصیه شده

.با سلام و خسته نباشید،

 

من این اطلاعات رو واسه پیدا کردن نقطه dدارم،

-نقطه d توی صفحه شامل نقاط a,b, c قرار گرفته است.

-فاصله بین نقطه c,d را داریم.

- خط گذرنده از point c, point d بر خط کذرنده از point a, point d عمود است.

- نقاط a,d,c روی محیط یک دایره قرار گرفته اند.

 

من میحوام مختصات سه بعدی نقطه d را با نوشتن یک کد متلب به دست بیاورم. چون در هر لحظه مختصات این نقطه تغییر میکنه واسه همین میخوام کد بنویسم تا محاسبام سریع و راحت بشه. من دستگاه معادلاتی که با اطلاعات فوق به دست میارم غیرخطی هستش و اگه درست فکر کنم جواب دقیقی با متلب نمیشه ازش گرفت. لطفا کسی اگه راه حلی واسه به دست آوردن مختصات این نقطه به کمک متلب به فکرش میرسه بهم کمک کنه.

 

شمای مربوط به مکان نقاط رو هم یه عکس گذاشتم.

 

ممنونم

chord.jpg

لینک به دیدگاه
.با سلام و خسته نباشید،

 

من این اطلاعات رو واسه پیدا کردن نقطه dدارم،

-نقطه d توی صفحه شامل نقاط a,b, c قرار گرفته است.

-فاصله بین نقطه c,d را داریم.

- خط گذرنده از point c, point d بر خط کذرنده از point a, point d عمود است.

- نقاط a,d,c روی محیط یک دایره قرار گرفته اند.

 

من میحوام مختصات سه بعدی نقطه d را با نوشتن یک کد متلب به دست بیاورم. چون در هر لحظه مختصات این نقطه تغییر میکنه واسه همین میخوام کد بنویسم تا محاسبام سریع و راحت بشه. من دستگاه معادلاتی که با اطلاعات فوق به دست میارم غیرخطی هستش و اگه درست فکر کنم جواب دقیقی با متلب نمیشه ازش گرفت. لطفا کسی اگه راه حلی واسه به دست آوردن مختصات این نقطه به کمک متلب به فکرش میرسه بهم کمک کنه.

 

شمای مربوط به مکان نقاط رو هم یه عکس گذاشتم.

 

ممنونم

 

سلام

اینجور که من فهمیدم، شما مختصات نقاط a و b و c و فاصله cd رو دارین، میخواین مختصات d رو پیدا کنین، درسته؟

 

این کد به نظر که جواب میده:

 

clear;
a = rand(1,3);
b = rand(1,3);
c = rand(1,3);
cd = rand;
center = (a + c)/2; 
r = sqrt(sum((a-c).^2))/2;
while cd>r
 cd = rand;
end
[x,y,z] = sphere;
mesh(r*x+(a(1)+c(1))/2,r*y+(a(2)+c(2))/2,r*z+(a(3)+c(3))/2)
hold on
grid on
mesh(cd*x+c(1),cd*y+c(2),cd*z+c(3))
scatter3(a(1),a(2),a(3),'*r') 
scatter3(b(1),b(2),b(3),'*g')
scatter3(c(1),c(2),c(3),'*r')


syms x y z
E1 = (x-center(1))^2+(y-center(2))^2 + (z-center(3))^2 ; 
E2 = (x-c(1))^2+(y-c(2))^2 + (z-c(3))^2 ;
E3 = cross(a-b,c-b)*[x-a(1);y-a(2);z-a(3)];
[x,y,z] = solve(E1-r^2,E2-cd^2,E3);
scatter3(double(x),double(y),double(z),'*m')
d1 = [double(x(1)),double(y(1)),double(z(1))]
d2 = [double(x(2)),double(y(2)),double(z(2))]

لینک به دیدگاه

ممنونم از جوابتون. یه سوال داشتم. شما دستگاه معادلات درجه 2 رو با دستور solve حل کردید. میخواستم بدونم که حل با این روش آیا حل دقیق هستش؟ چون من مراکز مفاصل رو با این روش به دست میارم و واسم نوع حلش مهم هست.

لینک به دیدگاه
ممنونم از جوابتون. یه سوال داشتم. شما دستگاه معادلات درجه 2 رو با دستور solve حل کردید. میخواستم بدونم که حل با این روش آیا حل دقیق هستش؟ چون من مراکز مفاصل رو با این روش به دست میارم و واسم نوع حلش مهم هست.

 

خیلی با Solve کار نکردم، ممکنه نتونه جواب رو پیدا کنه یا پارامتری جواب بده (بر حسب یه معادله دیگه)، ولی بعید میدونم جواب غلط بده. اگه هم نتونه Warning میده و در نهایت هم هیچ جوابی نمیده. توی این سوال چیزی که مشخص بود، این بود که معادله دو جواب داره، Solve هم دو تا جواب داده، جواب ها رو هم خیلی راحت میتونین تست کنین:

 

clear;
a = rand(1,3);
b = rand(1,3);
c = rand(1,3);
cd = rand;
center = (a + c)/2; 
r = sqrt(sum((a-c).^2))/2;
while cd>r
 cd = rand;
end
[x,y,z] = sphere;
mesh(r*x+(a(1)+c(1))/2,r*y+(a(2)+c(2))/2,r*z+(a(3)+c(3))/2)
hold on
grid on
mesh(cd*x+c(1),cd*y+c(2),cd*z+c(3))
scatter3(a(1),a(2),a(3),'*r') 
scatter3(b(1),b(2),b(3),'*g')
scatter3(c(1),c(2),c(3),'*r')


syms x y z
E1 = (x-center(1))^2+(y-center(2))^2 + (z-center(3))^2 ; 
E2 = (x-c(1))^2+(y-c(2))^2 + (z-c(3))^2 ;
E3 = cross(a-b,c-b)*[x-a(1);y-a(2);z-a(3)];
[x1,y1,z1] = solve(E1-r^2,E2-cd^2,E3);
scatter3(double(x1),double(y1),double(z1),'*m')
d1 = [double(x1(1)),double(y1(1)),double(z1(1))]
d2 = [double(x1(2)),double(y1(2)),double(z1(2))]

% test
cd
cd1 = sqrt(sum((d1-c).^2))
cd2 = sqrt(sum((d2-c).^2))
double(subs(E1,[x y z],d1)-r^2)
double(subs(E1,[x y z],d2)-r^2)
double(subs(E2,[x y z],d1)-cd^2)
double(subs(E2,[x y z],d2)-cd^2)
double(subs(E3,[x y z],d1))
double(subs(E3,[x y z],d2))

لینک به دیدگاه
سلام. خیلی ممنون از جوابتون

 

فقط یه سوال دیگه،

 

چرا فقط زمانی که cd

 

یعنی اگه cd>r باشه مساله جوابی نخواهد داشت؟

 

سلام

خواهش می کنم.

adc یه مثلث قائم الزاویه هست، بزرگترین ضلع این مثلث هم باید وترش باشه، در غیر این صورت ac نمیتونه وتر این مثلث باشه و اندازه زاویه adc کوچکتر از نود میشه.

یا شاید اینجوری راحتر بشه گفت که یه دایره داریم به قطر ac، که اگه d بخواد روی محیط این دایره باشه، cd یکی از وترهای این دایره میشه، بزرگترین وتر دایره هم قطرش یعنی ac هست، پس cd باید ازش کوچکتر باشه، در صورتی که بزرگتر بودن cd از ac، دیگه d روی دایره قرار نداره.

Edit:

 

به جای ad ،cd نوشته بودم.

توی کد هم مقایسه cd باید با قطر (2r) انجام میشد، نه شعاع:

 

clear;
a = rand(1,3);
b = rand(1,3);
c = rand(1,3);
cd = rand;
center = (a + c)/2; 
r = sqrt(sum((a-c).^2))/2;
while cd>(2*r)
 cd = rand;
end
[x,y,z] = sphere;
mesh(r*x+(a(1)+c(1))/2,r*y+(a(2)+c(2))/2,r*z+(a(3)+c(3))/2)
hold on
grid on
surf(cd*x+c(1),cd*y+c(2),cd*z+c(3))
scatter3(a(1),a(2),a(3),'*r') 
scatter3(b(1),b(2),b(3),'*g')
scatter3(c(1),c(2),c(3),'*r')

syms x y z
E1 = (x-center(1))^2+(y-center(2))^2 + (z-center(3))^2 ; 
E2 = (x-c(1))^2+(y-c(2))^2 + (z-c(3))^2 ;
E3 = cross(a-b,c-b)*[x-a(1);y-a(2);z-a(3)];
[x,y,z] = solve(E1-r^2,E2-cd^2,E3);
scatter3(double(x),double(y),double(z),'*m')
d1 = [double(x(1)),double(y(1)),double(z(1))]
d2 = [double(x(2)),double(y(2)),double(z(2))]

لینک به دیدگاه
  • 1 سال بعد...

سلام

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

میشه لطفا کمک کنید؟

لینک به دیدگاه
  • 2 سال بعد...

سلام. من 3 تا ویژگی دارم که طول بردار X هستند. (در واقع 3تا عدد) . حالا برای مقایسه این ویژگی با 3 ویژگی دیگر در فضای 3 بعدی مثل اینکه بایست با scatter کدنویسی انجام دهم .حالا بعد انجام دادن این مراحل به من 2 نقطه در بالا و 2 نقطه در پایین می دهد. آیا این درست است؟؟

سوال بعدی این است که چگونه بایست فاصله این دو نقطه را پیدا کرد.؟؟

با تشکر از شما

لینک به دیدگاه
  • 1 سال بعد...

با سلام و خسته نباشید 
از سایت خوبِ تون ممنون. یه سوال داشتم ممنون میشم راهنمایی کنید.
من ۲ تا ابر نقاط دارم(x,y,z) که یکیشون و به عنوان مرجع به سطح (trisurf) تبدیل کردم حالا می‌خوام فاصله یه بین این سطح و ابر نقاط مو تو متلب نمایش بدم. چطور می‌شه این کارو انجام بدم؟ 
ممنون 
یه نمونه از خروجی‌ مورد نظرم پیوست کردم

Vergleich-M2C-LaborScan-plotAlsContour(in Clouadcompare).JPG

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...