vtk学习笔记 --- 判断三角形相交

2023-10-27

在使用三角网连接矿体的时候,需要判断当前连接的三角形和已经连接的三角形是否相交,所以,就需要进行三角形相交判断。

 

看了一些算法的文章,两个三角形相交的判断规则大体如下:

 

假设这两个三角形为A(a1,a2,a3),B(b1,b2,b3),三角形A所在的平面为PA,法向量为NA,三角形B所在的平面为PB,法向量为NB。

 

1、将三角形A的所有顶点投影到平面PB上,投影得到的点为proja1,proja2,proja3

 

2、计算三角形A的所有顶点到平面PB的有符号距离:

|a1| = |a1-proja1|

|a2| = |a2-proja2|

|a3| = |a3-proja3|

其中,符号取决于 顶点与投影点构成的向量与平面PB法向量的方向是否一致,如果一致,则大于0,不一致则小于0

 

3、根据有符号距离来判断三角形相交情况:

    a、如果三个有符号距离的符号一致(都大于0或者都小于0),说明两个三角形不相交

    b、如果一个符号距离为0,另外两个符号距离乘积大于0,则说明两个三角形相交于一个顶点

    c、 如果一个符号距离为0,另外两个符号距离乘积小于0,则说明符号距离为0的顶点位于平面PB内,而另外两个顶点位于平面PB两侧,需要计算交线来判断是否相交。

    d、如果一个符号距离和另外两个符号距离的符号相反,说明一个顶点位于平面PB的一侧,两外两个顶点位于平面PB的另外一侧,需要计算交线来判断是否相交。

 

4、根据上面的符号距离,来计算三角形A与平面PB的交点,然后得到两个三角形与对应平面的交线,最后通过判断交线是否相交或者重合来判断三角形是否相交。

 

具体的C++代码如下:

 

 

#include "vtkPolyData.h"
#include "vtkPoints.h"
#include "vtkTriangle.h"
#include "vtkCellArray.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkMath.h"
#include "vtkPlane.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkLine.h"

using namespace std;
//准备测试数据
vtkPolyData* prepareData(){
	//交线位于其中一个三角形内部
	//triangle 1
	//vtkPoints* pts = vtkPoints::New();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.5 ,0.1,-1);
	//pts->InsertNextPoint(0.5,0,1);
	//pts->InsertNextPoint(0,0.5,1);

	//部分相交,两个三角形相互咬住对方
	//vtkPoints* pts = vtkPoints::New();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.25,0.25,0.5);
	//pts->InsertNextPoint(0.25,-0.5,0.5);
	//pts->InsertNextPoint(0,0,-0.5);

	//边重合,不作为三角形相交
	//vtkPoints* pts = vtkPoints::New();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.25,0.25,0.5);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	//一个点位于三角形内部,另外2个点位于两侧,有交线
	//vtkPoints* pts = vtkPoints::New();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.25,0.25,0);
	//pts->InsertNextPoint(0.45,0.45,1);
	//pts->InsertNextPoint(0.45,0.45,-1);

	//一个点位于三角形所在面内,另外2个点位于两侧,无交线
	//vtkPoints* pts = vtkPoints::New();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.75,0.75,0);
	//pts->InsertNextPoint(1.5,1.5,1);
	//pts->InsertNextPoint(1.5,1.5,-1);

	//一个点位于三角形所在面内,另外2个点位于同侧,有交点无交线
	vtkPoints* pts = vtkPoints::New();
	pts->InsertNextPoint(0,0,0);
	pts->InsertNextPoint(1,0,0);
	pts->InsertNextPoint(0,1,0);
	//triangle 2
	pts->InsertNextPoint(0.25,0.25,0);
	pts->InsertNextPoint(1,0,1);
	pts->InsertNextPoint(0,1,1);

	//两个点位于另外一个三角形内部,另外一个点位于外面
	//vtkPoints* pts = vtkPoints::New();
	//pts->SetDataTypeToDouble();
	//pts->InsertNextPoint(0,0,0);
	//pts->InsertNextPoint(1,0,0);
	//pts->InsertNextPoint(0,1,0);
	triangle 2
	//pts->InsertNextPoint(0.25,0.25,1);
	//pts->InsertNextPoint(0.1,0.5,0);
	//pts->InsertNextPoint(0.5,0.1,0);


	vtkTriangle* triangle1 = vtkTriangle::New();
	triangle1->GetPointIds()->SetNumberOfIds(3);
	triangle1->GetPointIds()->SetId(0, 0);
	triangle1->GetPointIds()->SetId(1, 1);
	triangle1->GetPointIds()->SetId(2, 2);

	vtkTriangle* triangle2 = vtkTriangle::New();
	triangle2->GetPointIds()->SetNumberOfIds(3);
	triangle2->GetPointIds()->SetId(0, 3);
	triangle2->GetPointIds()->SetId(1, 4);
	triangle2->GetPointIds()->SetId(2, 5);

	vtkCellArray* cells = vtkCellArray::New();
	cells->InsertNextCell(triangle1);
	cells->InsertNextCell(triangle2);

	vtkPolyData* polyData = vtkPolyData::New();
	polyData->SetPoints(pts);
	polyData->SetStrips(cells);
	polyData->BuildCells();
	polyData->Update();

	cells->Delete();
	triangle1->Delete();
	triangle2->Delete();
	pts->Delete();

	return polyData;
}

vtkActor* makeActor(vtkPolyData* polydata)
{
	vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
	mapper->SetInput(polydata);

	vtkActor* actor = vtkActor::New();
	actor->SetMapper(mapper);
	
	mapper->Delete();

	return actor;
}

double calcSignDistance(double p[],double proj[],double normal[]){
	double dis = (p[0]-proj[0])*(p[0]-proj[0])+(p[1]-proj[1])*(p[1]-proj[1])+(p[2]-proj[2])*(p[2]-proj[2]);

	if( abs(dis) < 0.0001 )return 0;

	//向量proj->p
	double vec[] = {
		p[0] - proj[0],	
		p[1] - proj[1],	
		p[2] - proj[2]	
	};

	double dotRes = vtkMath::Dot(vec, normal);

	if( dotRes >= 0 )
		return sqrt(dis);
	else 
		return -sqrt(dis);
}

void calcTriangleNormal(double a[],double b[],double c[],double normal[])
{
	double v1[3];
	vtkMath::Subtract(b,a,v1);

	double v2[3];
	vtkMath::Subtract(c,b,v2);

	vtkMath::Cross(v1,v2,normal);
	vtkMath::Normalize(normal);
}
//计算一个三角形和一个平面的交点
int calcIntersectPoints(double p2a[],double p2b[],double p2c[],vtkPlane* plane,double x1[],double x2[]){
	//将三角形的顶点投影到plane上
	double p2aProj[3], p2bProj[3], p2cProj[3];
	plane->ProjectPoint(p2a, p2aProj);
	plane->ProjectPoint(p2b, p2bProj);
	plane->ProjectPoint(p2c, p2cProj);

	double normal[3];
	plane->GetNormal(normal);
	
	//计算有符号距离
	double d1a = calcSignDistance(p2a, p2aProj, normal);
	double d1b = calcSignDistance(p2b, p2bProj, normal);
	double d1c = calcSignDistance(p2c, p2cProj, normal);

	cout<<"符号距离:"<<d1a<<","<<d1b<<","<<d1c<<endl;

	if( (d1a > 0 && d1b > 0 && d1c > 0) || 
		(d1a < 0&& d1b < 0 && d1c < 0) ) {
		cout<<"说明没有相交	"<<endl;
		return 0;
	} else if(d1a == 0 && d1b*d1c > 0){//交于顶点p2a
	   x1[0] = p2a[0];
	   x1[1] = p2a[1];
	   x1[2] = p2a[2];

	   return 1;
	} else if(d1b == 0 && d1a*d1c > 0){//交于顶点p2b
		x1[0] = p2b[0];
		x1[1] = p2b[1];
		x1[2] = p2b[2];
		
		return 1;
	} else if(d1c == 0 && d1a*d1b > 0){//交于顶点p2c
		x1[0] = p2c[0];
		x1[1] = p2c[1];
		x1[2] = p2c[2];

		return 1;
	} else {
		//说明三角形所在的面相交,还需要判断三角形是否相交
		//找出符号相异的点,来计算triangle和另外一个三角形定义的面plane的交点
		//a : d1a 和 d1b,d1c 位于不同侧
		double a[3],b[3],c[3];
		a[0] = b[0] = c[0] = 0;
		a[1] = b[1] = c[1] = 0;
		a[2] = b[2] = c[2] = 0;
		if( (d1a < 0 && d1b > 0 && d1c > 0) ||
			(d1a > 0 && d1b < 0 && d1c < 0)){
			a[0] = p2a[0];a[1] = p2a[1];a[2] = p2a[2];
			b[0] = p2b[0];b[1] = p2b[1];b[2] = p2b[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];
		}
		if( (d1b < 0 && d1a > 0 && d1c > 0) ||
			(d1b > 0 && d1a < 0 && d1c < 0)){
			a[0] = p2b[0];a[1] = p2b[1];a[2] = p2b[2];
			b[0] = p2a[0];b[1] = p2a[1];b[2] = p2a[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];
		}
		if( (d1c < 0 && d1b > 0 && d1a > 0) ||
			(d1c > 0 && d1b < 0 && d1a < 0)){
			a[0] = p2c[0];a[1] = p2c[1];a[2] = p2c[2];
			b[0] = p2b[0];b[1] = p2b[1];b[2] = p2b[2];
			c[0] = p2a[0];c[1] = p2a[1];c[2] = p2a[2];	
		}
		//一个点到平面距离为0,其它2个到平面距离符号相异
		if(d1a == 0 && d1b*d1c < 0){
			a[0] = p2b[0];a[1] = p2b[1];a[2] = p2b[2];
			b[0] = p2c[0];b[1] = p2c[1];b[2] = p2c[2];
			c[0] = p2a[0];c[1] = p2a[1];c[2] = p2a[2];	
		}
		if(d1b == 0 && d1a*d1c < 0){
			a[0] = p2a[0];a[1] = p2a[1];a[2] = p2a[2];
			b[0] = p2b[0];b[1] = p2b[1];b[2] = p2b[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];	
		}
		if(d1c == 0 && d1a*d1b < 0){
			a[0] = p2a[0];a[1] = p2a[1];a[2] = p2a[2];
			b[0] = p2b[0];b[1] = p2b[1];b[2] = p2b[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];	
		}
		//说明有2个点位于triangle1所在平面内部
		if(d1a != 0 && d1b == 0 && d1c == 0){
			a[0] = p2a[0];a[1] = p2a[1];a[2] = p2a[2];
			b[0] = p2b[0];b[1] = p2b[1];b[2] = p2b[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];
		} 
		if(d1b != 0 && d1a == 0 && d1c == 0){
			a[0] = p2b[0];a[1] = p2b[1];a[2] = p2b[2];
			b[0] = p2a[0];b[1] = p2a[1];b[2] = p2a[2];
			c[0] = p2c[0];c[1] = p2c[1];c[2] = p2c[2];
		}
		if(d1c != 0 && d1a == 0 && d1b == 0){
			a[0] = p2c[0];a[1] = p2c[1];a[2] = p2c[2];
			b[0] = p2a[0];b[1] = p2a[1];b[2] = p2a[2];
			c[0] = p2b[0];c[1] = p2b[1];c[2] = p2b[2];
		}
		//求直线 a - b 和 a - c 与 plane的交点  e,f
		double t;
		plane->IntersectWithLine(a,b,t,x1);
		plane->IntersectWithLine(a,c,t,x2);
		
		return 2;
	}
	//never
	return -1;
}

void build(){
	vtkRenderer* renderer = vtkRenderer::New();
	vtkRenderWindow* renderWin = vtkRenderWindow::New();
	renderWin->AddRenderer(renderer);
	vtkRenderWindowInteractor* inter = vtkRenderWindowInteractor::New();
	vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
	inter->SetInteractorStyle(style);
	inter->SetRenderWindow(renderWin);

	style->Delete();
	renderWin->Delete();
	renderer->Delete();

	vtkPolyData* trianglePolyData = prepareData();
	
	//显示三角形
	vtkActor* triActor1 = makeActor(trianglePolyData);
	renderer->AddActor(triActor1);

	//读取三角形
	vtkIdList* triList1 = vtkIdList::New();
	trianglePolyData->GetCellPoints(0, triList1);
	vtkIdList* triList2 = vtkIdList::New();
	trianglePolyData->GetCellPoints(1, triList2);

	//取得三角形triangle1的所有顶点
	double p1a[3];
	trianglePolyData->GetPoint(triList1->GetId(0),p1a);
	double p1b[3];
	trianglePolyData->GetPoint(triList1->GetId(1),p1b);
	double p1c[3];
	trianglePolyData->GetPoint(triList1->GetId(2),p1c);

	//取得三角形triangle2的所有顶点
	double p2a[3]; 
	trianglePolyData->GetPoint(triList2->GetId(0),p2a);
	double p2b[3]; 
	trianglePolyData->GetPoint(triList2->GetId(1),p2b);
	double p2c[3]; 
	trianglePolyData->GetPoint(triList2->GetId(2),p2c);

	double n1[3], n2[3];
	calcTriangleNormal(p1a, p1b, p1c,n1);
	calcTriangleNormal(p2a, p2b, p2c,n2);
	cout<<n1[0]<<","<<n1[1]<<","<<n1[2]<<endl;
	cout<<n2[0]<<","<<n2[1]<<","<<n2[2]<<endl;

	//以顶点p1a为原点 n1为法向量来构造vtkPlane
	vtkPlane* plane1 = vtkPlane::New();
	plane1->SetOrigin(p1a);
	plane1->SetNormal(n1);

	vtkPlane* plane2 = vtkPlane::New();
	plane2->SetOrigin(p2a);
	plane2->SetNormal(n2);

	double x1[3], x2[3], x3[3], x4[4];
	x1[0] = x1[1] = x1[2] = 0;
	x2[0] = x2[1] = x2[2] = 0;
	x3[0] = x3[1] = x3[2] = 0;
	x4[0] = x4[1] = x4[2] = 0;

	int numOfInter1 = calcIntersectPoints(p2a,p2b,p2c,plane1,x1,x2);
	int numOfInter2 = calcIntersectPoints(p1a,p1b,p1c,plane2,x3,x4);

	cout <<"两个三角形的交点个数:"<<numOfInter1 <<","<<numOfInter2<<endl;
	if(numOfInter1 == 1 || numOfInter2 == 1){
		cout <<"两个三角形相交于一个顶点"<<endl;
	} else if(numOfInter1 == 2 && numOfInter2 == 2){//交于两个点
		//计算交点组成的线段有没有重合,如果有重合,则说明相交
		double cp1[3],cp2[3],t1,t2;
		double dis = vtkLine::DistanceBetweenLineSegments(x1,x2,x3,x4,cp1,cp2,t1,t2);
		cout<<"两个三角形交线的距离:"<<dis<<endl;

		if(dis < 0.0001)
			cout<<"两个三角形相交"<<endl;
		else 
			cout<<"两个三角形未相交"<<endl;

	}else{
		cout<<"没有相交"<<endl;
	}

	inter->Initialize();
	inter->Start();

	trianglePolyData->Delete();
	triActor1->Delete();
	triList1->Delete();
	triList2->Delete();
	plane1->Delete();
	plane2->Delete();
	inter->Delete();
}

int main(){
	build();
	return 0;
}
 

下图是其中一个测试情况,即两个三角形相交于一个顶点:


 

 

备注:最后在判断两个三角形的交线是否相交时,采用的是判断两个交线之间的距离,如果距离为0,则说明相交,隐约的觉得这种办法不够好,但一时也找不到更好的判断方法,后面继续完善!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vtk学习笔记 --- 判断三角形相交 的相关文章

  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • vite项目 router/indext.ts 中引入 views/**/*.vue 页面后报错的解决方法

    报错现象 view 文件夹下新建文件夹 新建的文件夹下新建view页面 路由文件中引入views vue 页面时出现了报错 报错现象如下 解决方法 在 tsconfig app json 文件中添加 src vue 注意 添加保存后报错可能
  • uniapp 动态修改 tabbar 的高度

    项目中使用了原生的tabbar tabbar的修改提供了两个API 看了 html5 plus的文档 没有看到可以修改tabbar的部分
  • js正则表达式去除空行

    表单文本域中的内容可能有时候会存在空行 但我们保存时并不想要多余的空行 所以要想办法去掉它 只需要一个简单的正则表达式即可 n n n n
  • (易懂)Mybatis中${}和#{}的区别和使用注意

    目录 一 区别 1 使用字符串拼接的方式拼接sql 如果数据是字符串类型或日期 我们需要手动加引号 而 会自动加上引号 2 安全 不安全 容易造成sql注入 sql注入就是改变sql的语法规则 进行sql命令攻击 3 是经过预编译的 是安全
  • 不重叠且分布均匀的气泡图解决方案(基于echarts)

    气泡图是数据可视化需求中的一种常见图表形式 然而截至目前 像echarts d3 higncharts都还没有直接提供一个配置来完成不重叠且分布均匀的气泡图这项工作 幸运的是 我们可以通过配置echart的关系图来完成我们的气泡图需求 下面
  • 整体最小二乘拟合平面

    目录 1 算法过程 2 参考文献 3 算法伪码 4 算法效果 本文由CSDN点云侠原创 原文链接 1 算法过程 最小二乘拟合平面认为点云数据系数矩阵不存在误差 然而由于观测条件的限制 观测向量 系数矩阵都有可能存在误差 那么最小二乘方法就不
  • python处理excel词频统计

    import pandas as pd import jieba from collections import Counter 读取 Excel 文件 df pd read excel your excel file xlsx 定义函数用
  • 爬虫学习:实现对彼岸图4k图片的下载

    在学习python爬虫一段时间后 进行第一个项目的实践 本文使用的库为 requests库 time库 xpath库 os库 目的 实现对彼岸图4k图片的下载 源码 import requests import time from lxml
  • CentOS7安装MySQL8.0图文教程

    1 下载 MySQL 所需要的安装包 网址 https dev mysql com downloads mysql 2 Select Operating System 选择 Red Hat CentOS 是基于红帽的 Select OS V
  • R手册(Tidy+Transform)--forcats

    forcats 分类变量数据处理 forcats for factor 函数 说明 factor x levels labels ordered as factor x fct expand f 添加更多级别 fct explicit na
  • Android RecyclerView 上下/左右 禁止滑动

    禁止滑动 禁止竖向滑动 和 禁止横向滑动 线性布局 禁止滑动 Java 禁止滑动 布局管理器 LinearLayoutManager linearLayoutManager new LinearLayoutManager this 禁止竖向
  • Cadence新建仿真文件出现Cannot Initialize Profile错误的解决方法和步骤

    元器件和器件PSpice模型都准备好了 仿真原理图也画好了 但是在新建仿真配置文件的时候 提示Cannot Initialize Profile的错误 当时忘了截图了 问题解决了也没有出现这个错误 重启软件 重启电脑都没有再出现 因为之前都
  • C++构造函数和析构函数能否继承

    前段时间 一个同事问了一个问题 C 类中的构造函数析构函数派生的子类能否继承 这个问题以前真的没有注意过 按道理来讲应该说可以的 但是本着求证的态度写了一段测试代码 include
  • java 实体转json null不过滤

    import com alibaba fastjson JSONObject JSONObject toJSONString java实体 SerializerFeature WriteMapNullValue
  • ubuntu下解决wireshark权限问题

    wireshark要监控eth0 但是必须要root权限才行 但是 直接用root运行程序是相当危险 也是非常不方便的 解决方法如下 1 添加wireshark用户组 sudo groupadd wireshark 2 将dumpcap更改
  • gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting

    1 报错描述 使用centos安装jdk 在解压的时候出现了这个问题 原因是我复制的下载链接是还没有点击同意协议后复制的 2 错误解决 在点击下载按钮后 会弹出一个框 让你同意后下载 点击同意 然后复制跳转下载的链接 便可解决问题 可以看到
  • Python import自定义模块报错、自定义异常、字符串处理、截取

    一 python import自定义的模块报错 问题现象 pycharm中运行一切正常 但是到命令行中 cmd命令行或pycharm的Terminal窗口 运行py文件 就会报错No module named xxx 问题原因 pychar
  • 二分查找的两种方法(详细图解)

    一 什么是二分查找 假设给定的数组中的元素是一个有序的状态 比如是单调不递减或者是单调不递增的状态 对于这种情况可以使用二分查找来完成 即二分查找需要满足两个条件 1 数组存储 2 元素有序 单调性 二 时间复杂度 比如 总共有n个元素 每
  • mysql 互换两行数据中的一个值(排序互换)

    需求 实现列表排序互换功能 每次排序向上加一或向下减一 使排序号互换 分析 要达到这种需求 首先要拿到主动排序数据和被动排序数据两条数据进行更新 这样的话 仅从拿到的排序值处理 要进行多次查询和更新 不想做频繁的查询更新操作 想着能使用一条
  • vtk学习笔记 --- 判断三角形相交

    在使用三角网连接矿体的时候 需要判断当前连接的三角形和已经连接的三角形是否相交 所以 就需要进行三角形相交判断 看了一些算法的文章 两个三角形相交的判断规则大体如下 假设这两个三角形为A a1 a2 a3 B b1 b2 b3 三角形A所在