当前位置:   article > 正文

vtk 求线与多边形所在面的交点以及线与线的交点_线与多边形的交点 c++

线与多边形的交点 c++

参考文档

wiki PolygonIntersection 多边形和线的交叉点

在xy平面上创建一个多边形


vtk绘制多边形流程
vtkPoints,vtkCellArray,vtkPolyData组合使用
先添加点,相邻两点建立单元,给数据对象添加点和单元
只是利用vtkPolyData不够的 凹多边形绘制会有问题,利用vtkTrianglFiler 转三角形后 就可以了

首先通过

// 先添加多边形的各点
  vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::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<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • void SetId(const vtkIdType i, const vtkIdType vtkid) {this->Ids[i] = vtkid;};
    适用于已知总数。

  • void InsertId(const vtkIdType i, const vtkIdType vtkid);
    设置 i 的 id 为 vtkid,做溢出检查,并在必要时自动分配空间。
    适用于未知总数。

计算线与多边形所在面的交点


// 声明
int IntersectWithLine(double p1[3], double p2[3], double tol, double& t,double x[3], double pcoords[3], int& subId);
  • 1
  • 2
// 测试数据
    double p1[3] = { 0.1, 0, -1.0 };
    double p2[3] = { 0.1, 0, 1.0 };
    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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

函数作用:

检测多边形polgon线段(p1,p2)是否相交,若相交,则返回1,不相交(包括内部),则返回0。

输入:

  • p1、p2 线的定义(两点世界坐标)
  • tolerance 公差

返回:

  • t :面与直线相交于直线的哪部分。
    相对于 线段 的参量(比例)坐标(p1为0,p2为1),可能超出[0,1]。

  • x :直线与平面相交于哪点。
    p1、p2所在直线多边形所在平面 的相交点的坐标,若平行则无限大:
    -9.25596e+061 -9.25596e+061 -9.25596e+061。

  • pcoords :线段与面相交与哪点。
    p1、p2所构成的 线段多边形所在平面 的相交点的坐标,无则 0 0 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.

求线与线的交点


一.用 int vtkLine::IntersectWithLine()

与上同

二.用static int vtkLine::Intersection()

static int Intersection(double p1[3], double p2[3],
                          double x1[3], double x2[3],
                          double& u, double& v);
  • 1
  • 2
  • 3
vtkIdType isture = line->Intersection(p1, p2, p3, p4, u, v);
  • 1

函数作用:

检测两线是否相交,并返回相交位置在各线的比例位置。
如果两线相交,则返回2,若不相交,则返回3。
若不相交,则将x1,x2投影到p1,p2所在平面,计算u、v。

输入:

  • p1 p2指定第一条线,x1 x2指定第二条线

输出:

  • u:相交点在p1(0),p2(1)上的位置
  • v:相交点在x1(0),x2(1)上的位置

example



#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkCamera.h"

#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"

#include <vtkLine.h>
#include <vtkPoints.h>
#include <vtkPolygon.h>

int main(int, char *[])
{

    // Create a square in the XY plane
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::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);

    // Create the polygon
    vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::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);

    // Inputs
    double p1[3] = { 1, 0, -1 };
    double p2[3] = { 1, 0, 1 };
    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;


    vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
    double p3[3] = { 1, -1, 0 };
    double p4[3] = { 1, 1, 0 };
    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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/979298
推荐阅读
相关标签
  

闽ICP备14008679号