vtk實現三點確定乙個平面

2021-08-07 17:00:18 字數 3728 閱讀 5790

如何在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...