計算方法:
1. 兩條直線方向向量v1和v2的叉積,得到平行於兩條直線的平面v3。
2. 計算v3與第一條直線v1叉積,得到垂直於v3並且過線v1的平面v4,計算面v4與線v2的交點,得到線v2上的點t2。
3. 計算v3與第二條直線v2叉積,得到垂直於v3並且過線v2的平面v5,計算面v5與線v1的交點,得到線v1上的點t1。
4. t1與t2即為異面直線最近點,t1與t2距離即為異面直線距離。
matlab**如下:
clear all;close all;clc;結果如下:p1 = rand(3,1)*2-1; %隨機生成一條直線
v1 = rand(3,1)*2-1
;p2 = rand(3,1)*2-1; %隨機生成另一條直線
v2 = rand(3,1)*2-1
;v1 = v1/norm(v1);
v2 = v2/norm(v2);
t = -1:0.01:1
;x1 = v1.* repmat(t,3,1) +p1;
x2 = v2.* repmat(t,3,1) +p2;
v3 = cross(v1,v2); %計算和兩條直線都平行的平面
v3 = v3/norm(v3);
[planx,plany] = meshgrid(min([x1(1,:) x2(1,:)]):0.02:max([x1(1,:) x2(1,:)]),min([x1(2,:) x2(2,:)]):0.01:max([x1(2,:) x2(2,:)])); %生成平行平面
planz1 = p1(3) -(v3(1)*(planx-p1(1))+v3(2)*(plany-p1(2))) / v3(3
);planz2 = p2(3) -(v3(1)*(planx-p2(1))+v3(2)*(plany-p2(2))) / v3(3
);t1 = (cross(v3,v2)'
*(p2-p1))/(cross(v3,v2)
'*v1)*v1 + p1; %計算過一條直線和v3面垂直的面,計算得到另一條直線和該面的交點。
t2 = (cross(v3,v1)'
*(p1-p2))/(cross(v3,v1)
'*v2)*v2 + p2; %和上一步類似
mesh(planx,plany,planz1); %畫出平行平面
hold on;
mesh(planx,plany,planz2);
plot3(x1(
1,:),x1(2,:),x1(3,:),'
b'); %畫出兩條直線
plot3(x2(
1,:),x2(2,:),x2(3,:),'r'
);plot3(t1(
1),t1(2),t1(3),'
b*'); %畫出最近點
plot3(t2(
1),t2(2),t2(3),'r*'
);plot3([t1(
1) t2(1)],[t1(2) t2(2)],[t1(3) t2(3)],'
g'); %畫出最**段
grid on;
axis equal;
matlab練習程式(霍夫變換檢測直線斜率)
這個過去用就寫過,這次正好有人問這個演算法,所以在這裡又把c 改為了matlab了。霍夫變換是把原影象中的直線上的每乙個點轉換到引數空間對應的曲線上,由於每乙個點對應一條曲線,因此在引數空間中所有曲線會相交到乙個點,形成乙個最值。因此原圖尋找直線斜率的問題就變成了引數空間尋找最值的問題了。如下 cl...
matlab練習程式(KNN,K最鄰近分類法)
matlab練習程式 knn,k最鄰近分類法 k最鄰近密度估計技術是一種分類方法,不是聚類方法。不是最優方法,實踐中比較流行。通俗但不一定易懂的規則是 1.計算待分類資料和不同類中每乙個資料的距離 歐氏或馬氏 2.選出最小的前k資料個距離,這裡用到選擇排序法。3.對比這前k個距離,找出k個資料中包含...
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...