如何在vtk中根據三點提取乙個切面,一直知道根據三點就能表示乙個面,但是怎麼在vtk中實現,對於我這種菜鳥真是要想好久。首先說說現在的思路,知道vtkimagepalne中可以根據乙個點和乙個面法向量獲得乙個面。現在我有三個點,需要獲得乙個面法向量,那麼需要通過叉乘得到,再然後根據乙個點和得到的面法向量顯示乙個切面。
之前看過vtkresliceimage得到的切面方法,感覺對變換的理解很差,尤其對matrix(矩陣基本變換)的理解又不那麼到位:
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
static double axialelements[16] = ;
vtksmartpointerresliceaxes =
vtksmartpointer::new();
resliceaxes->deepcopy(axialelements);
resliceaxes->setelement(0, 3, center[0]);
resliceaxes->setelement(1, 3, center[1]);
resliceaxes->setelement(2, 3, center[2]);
根據**的理解,vtkmatrix4x4應該包含乙個面和乙個點,但是這個面是由static double axialelements[16] = ;
決定的,根據定義,這個矩陣左上方3x3的矩陣是x、y、z方向的三個向量,第四列三個做透視變換用的,根據水靈書中提的,這裡好像是切面的座標系原點(我沒有看過透視變換的相關資訊,不太了解)。第四行左三個別控制其在x軸y軸z軸上的平移單位.,第四個表示縮放比例。
再理解一下叉乘,叉乘(cross product)或者外積,它的計算結果是乙個向量而非標量。叉積所在的向量與參與運算的兩個向量都正交,也即正交於原來的兩個向兩邊所決定的平面,也即兩向量所決定的平面的法向量可通過計算叉積的方式得以確定。當參與運算的兩向量是平行的兩個向量時,得到的叉積為0,也即可通過計算叉積的方式判斷兩向量是否平行。
代數定義
二維時
x×y=x1y2−x2y1
三維時
幾何定義
x×y=∥x∥∥y∥sinθn⃗
n⃗ 表示叉積方向上的單位向量。
中學知識告訴我們三角形的面積計算公式為:
s=∥x∥∥y∥sinθ2=∥z∥h2
其中θ表示的是x,y之間的夾角,由以上兩個公式我們可得到三角形的高或者點到其所對的邊的距離,也即點到直線的距離,的計算公式:
h=∥x×y∥/∥z∥
double
operator*(const vec& x, const vec& y)
// 三維的情況
vec operator^(const vec& x, const vec& y)
; // uniform initialization, c++11新特性
}// 二維就姑且返回其模長吧
double twodcrossprod(const vec& x, const vec& y)
現在貼一段**[c++實現叉乘],並感謝作者提供。(
#include
#define m 3
#define n 4
#define p 3
using
namespace
std;
void getmt(int* m,int r,int c) //獲取矩陣
}void showmt(const
int* m,int r,int c) //顯示矩陣
;來初始化為0,這樣可能並沒有將m3中的元素賦0
cout
<
<0][0],m,n); //獲取矩陣m1
cout
<
<0][0],n,p); //獲取矩陣m2
mmt(&m1[0][0],&m2[0][0],&m3[0][0],m,n,p); //叉乘運算
cout
<
<0][0],m,n);
cout
<
<0][0],n,p);
cout
<
<0][0],m,p);
system("pause");
return exit_success;
}
搜了一下在圖形學中表示向量的方法,看來這裡面學問挺多的,貼兩個實用的帖子,感謝作者提供寶貴的知識圖形學中向量操作類、影象學中向量說明。
vtkimageplanewidget中不能直接設定setnormal和setcenter,只能設定初始點位置,那麼這樣就需要寫乙個類來繼承vtkimageplanewidget,並且新增這兩個功能。最後,繼承了vtkplanesource中setnormal和setcenter這兩個功能,可以提取經過三個點的切面:
imageplanewidget *mplanewidget = imageplanewidget::new();
mplanewidget->setinteractor(iren);
mplanewidget->setpicker(picker); //定義 內部選擇器
mplanewidget->settextureplaneproperty(ipwprop);//給切片設定紋理屬性
mplanewidget->textureinterpolateoff();
mplanewidget->getplaneproperty()->setcolor(1, 0, 0); //設定平面屬性
mplanewidget->setresliceinterpolatetolinear();//差值方法
mplanewidget->setinputconnection(reader->getoutputport());//
//mplanewidget->restrictplanetovolumeon(); //確保平面在容器範圍之內
mplanewidget->setnormal(mnormalize); //設定切面法向方向
mplanewidget->setorigin(moriginpoint); //設定切面的初始點位置
mplanewidget->setcenter(moriginpoint); //設定切面所在位置中心
mplanewidget->
on();
mplanewidget->interactionon();
//mplanewidget->placewidget(polydata->getbounds());//獲得polydata中的邊界,最大最小值
三點確定乙個圓的計算方法
三點確定乙個圓的計算方法 最近在寫的乙個軟體需要根據三個座標點來計算乙個圓。因此花了點時間推導了相關的公式。這個推導不算太難,放在這裡主要是做個備忘。我們設乙個圓的圓心座標為 x 0 y x0,y x 0,y 半徑為 r rr。那麼這個圓的方程可以寫為 x x 0 2 y y 0 2 r 2 x x...
matlab實現求平面或空間三點圍成三角形的面積
我們知道三角形的面積 1 2 a b sinc,其中c為ab兩邊的夾角。運用叉乘公式 matlab裡用cross 函式實現 我們可以得到absinc,但這時候結果還是乙個三維向量,用norm 函式取向量的模長即可。求三角形面積函式function s area a,b,c if length a 2...
輸出乙個平面點的對稱點
檔名稱 完成日期 2014年2月26日 版本號 v0.1 對任務及求解方法的描述部分 輸入描述 無 問題描述 輸入乙個點,輸出其分別關於x軸y軸原點對稱的點。程式輸入 程式輸出 問題分析 演算法設計 我的程式 include using namespace std enum symmetricsty...