vtk 求線與多邊形所在面的交點以及線與線的交點

2021-07-08 17:29:36 字數 3749 閱讀 9694

wiki polygonintersection 多邊形和線的交叉點

vtk繪製多邊形流程

vtkpoints,vtkcellarray,vtkpolydata組合使用

先新增點,相鄰兩點建立單元,給資料物件新增點和單元

只是利用vtkpolydata不夠的 凹多邊形繪製會有問題,利用vtktrianglfiler 轉三角形後 就可以了

首先通過

// 先新增多邊形的各點

vtksmartpointer points = vtksmartpointer

::new();

points->insertnextpoint(0.0, 0.0, 0.0);

points->insertnextpoint(1.0, 0.0, 0.0);

points->insertnextpoint(1.0, 1.0, 0.0);

points->insertnextpoint(0.0, 1.0, 0.0);

// 通過點集建立多邊形

vtksmartpointer polygon = vtksmartpointer

::new();

polygon->getpoints()->deepcopy(points);

polygon->getpointids()->setnumberofids(4); // 4 corners of the square

polygon->getpointids()->setid(0, 0);

polygon->getpointids()->setid(1, 1);

polygon->getpointids()->setid(2, 2);

polygon->getpointids()->setid(3, 3);

// 宣告

int intersectwithline(double p1[3], double p2[3], double tol, double& t,double x[3], double pcoords[3], int& subid);

// 測試資料

double p1[3] = ;

double p2[3] = ;

double tolerance = 0.001; // 公差

// 輸出

double t; // 交點的線段參量(比例)座標,p1是0,p2是1

double x[3]; // 交點座標

double pcoords[3];

int subid;

// 使用

vtkidtype id = polygon->intersectwithline(p1, p2, tolerance, t, x, pcoords, subid);

檢測多邊形polgon線段(p1,p2)是否相交,若相交,則返回1,不相交(包括內部),則返回0。

官方api解釋

intersect with a ray. return parametric coordinates (both line and cell) and global intersection coordinates,

given ray definition and tolerance. the method returns non-zero value if intersection occurs.

與上同

static

int intersection(double p1[3], double p2[3],

double x1[3], double x2[3],

double& u, double& v);

vtkidtype isture = line->intersection(p1, p2, p3, p4, u, v);
檢測兩線是否相交,並返回相交位置在各線的比例位置。

如果兩線相交,則返回2,若不相交,則返回3。

若不相交,則將x1,x2投影到p1,p2所在平面,計算u、v。

#include "vtksmartpointer.h"

#include "vtkproperty.h"

#include "vtkcamera.h"

#include "vtkcylindersource.h"

#include "vtkactor.h"

#include "vtkrenderer.h"

#include "vtkrenderwindow.h"

#include "vtkrenderwindowinteractor.h"

#include

#include

#include

int main(int, char *)

; double p2[3] = ;

double tolerance = 0.001; // 公差

// outputs

double t; // parametric coordinate of intersection (0 (corresponding to p1) to 1 (corresponding to p2))

double x[3]; // the coordinate of the intersection

double pcoords[3];

int subid;

vtkidtype id = polygon->intersectwithline(p1, p2, tolerance, t, x, pcoords, subid);

std::cout

<< "t: "

<< t << std::endl;

std::cout

<< "pcoords: "

<< pcoords[0] << " "

<< pcoords[1] << " "

<< pcoords[2] << std::endl;

std::cout

<< "相交? "

<< id << std::endl;

std::cout

<< "subid: "

<< subid << std::endl;

std::cout

<< "x : "

<< x[0] << " "

<< x[1] << " "

<< x[2] << std::endl;

vtksmartpointerline = vtksmartpointer::new();

double p3[3] = ;

double p4[3] = ;

double u, v;

vtkidtype id2 = line->intersection(p1, p2, p3, p4, u, v);

std::cout

<<"u :"

<< u << endl;

std::cout

<< "v :"

<< v << endl;

std::cout

<< "相交? :"

<< id2 << endl;

return

0;}

c 線向量生成多邊形 C 多邊形求角 例項說

呼叫示例 anglecalculation.cxpoint p1 new anglecalculation.cxpoint 112,12 p2 new anglecalculation.cxpoint 68,51 p3 new anglecalculation.cxpoint 0,0 double ...

簡單多邊形與圓相交求面積

所謂簡單多邊形,就是指不相鄰的邊不相交,且每個頂點只跟2條邊相鄰。一般而言,除非題目要求判斷是否為簡單多邊形,否則給出的資料肯定都是簡單多邊形。以下將簡單多邊形簡稱為多邊形。多邊形一般都是以點集的形式給出,順時針或者逆時針。另外乙個需要注意的概念就是多邊形的凹凸性。一般而言,凸多邊形的演算法比凹多邊...

計算幾何 正多邊形的滾動與旋輪線

今天在看matrix 大牛的部落格時,發現乙個有趣的問題,學習學習下 正多變形的滾動與旋輪線下方的面積 問題描述 乙個圓盤在地面上滾動一周,那麼圓周上一點所形成的軌跡就叫做旋輪線 或者擺線 旋輪線下方的面積是多少?推廣至正多邊形,旋輪線下方的面積又是多少?問題分析 1.在問題是圓的情況下,顯然我們可...