#include "stdafx.h"
#include "MinEnclosingCircle.h"
MinEnclosingCircle::MinEnclosingCircle()
{
}
MinEnclosingCircle::MinEnclosingCircle(const CArray<gp_Pnt>& ArrayPoint)
{
SetPoints(ArrayPoint);
}
MinEnclosingCircle::MinEnclosingCircle(const TopoDS_Face& aFace)
{
SetFace(aFace);
}
MinEnclosingCircle::~MinEnclosingCircle()
{
}
void MinEnclosingCircle::SetPoints(const CArray<gp_Pnt>& ArrayPoint)
{
if (ArrayPoint.IsEmpty())
return;
m_ArrayPoint.RemoveAll();
//去重
for (int i = 0; i < ArrayPoint.GetCount(); ++i)
{
gp_Pnt aPnt = ArrayPoint[i];
bool bFlag = false;
for (int j = 0; j < m_ArrayPoint.GetCount(); j++)
{
if (aPnt.IsEqual(m_ArrayPoint[j], g_dConfusion))
{
bFlag = true;
break;
}
}
if (!bFlag) m_ArrayPoint.Add(aPnt);
}
}
void MinEnclosingCircle::SetFace(const TopoDS_Face& aFace)
{
if (aFace.IsNull())
return;
BRepAdaptor_Surface aSurface(aFace);
if (aSurface.GetType() != GeomAbs_Plane)
return;
m_ArrayPoint.RemoveAll();
//分解
TopExp_Explorer FaceExplorer;
for (FaceExplorer.Init(aFace, TopAbs_VERTEX); FaceExplorer.More(); FaceExplorer.Next())
{
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(FaceExplorer.Current()));
bool bFlag = false;
for (int j = 0; j < m_ArrayPoint.GetCount(); j++)
{
if (aPnt.IsEqual(m_ArrayPoint[j], g_dConfusion))
{
bFlag = true;
break;
}
}
if (!bFlag) m_ArrayPoint.Add(aPnt);
}
}
bool CheckPoint(gp_Pnt aPoint,gp_Pnt Center,double R)
{
return (aPoint.Distance(Center) > R);
}
bool MinEnclosingCircle::Compute()
{
if (m_ArrayPoint.GetCount() <=1)
return false;
gp_Vec Norm(1,0,0);
if (m_ArrayPoint.GetCount() >= 3)
{
gp_Pnt aPnt1 = m_ArrayPoint[0];
gp_Pnt aPnt2 = m_ArrayPoint[1];
gp_Pnt aPnt3 = m_ArrayPoint[2];
gp_Vec aVec1(aPnt1, aPnt2);
gp_Vec aVec2(aPnt1, aPnt3);
Norm = aVec1^aVec2;
}
gp_Pnt Center = m_ArrayPoint[0]; double R = 0; //第一个点
for (int i = 1; i < m_ArrayPoint.GetCount(); ++i) //剩下所有点
{
if (CheckPoint(m_ArrayPoint[i], Center,R))//pi在圆外部
{
Center = m_ArrayPoint[i]; R = 0; //将圆心设为pi半径为0
for (int j = 0; j < i; ++j) //重新检查前面的点
{
if (CheckPoint(m_ArrayPoint[j], Center, R))//pi在圆外部
{
Center.SetX((m_ArrayPoint[i].X() + m_ArrayPoint[j].X()) / 2.0);
Center.SetY((m_ArrayPoint[i].Y() + m_ArrayPoint[j].Y()) / 2.0);
Center.SetZ((m_ArrayPoint[i].Z() + m_ArrayPoint[j].Z()) / 2.0);
R = m_ArrayPoint[j].Distance(Center);
for (int k = 0; k < j; ++k)
{
if (CheckPoint(m_ArrayPoint[k], Center, R))//pi在圆外部
{
Center = GC_MakeCircle(m_ArrayPoint[i], m_ArrayPoint[j], m_ArrayPoint[k]).Value()->Location();
R = m_ArrayPoint[i].Distance(Center);
}
}
}
}
}
}
m_aCircle = GC_MakeCircle(Center, Norm, R).Value()->Circ();
}
基于MFC+OpenCASCADE,求平面的最小外接圆算法
需积分: 36 124 浏览量
2022-01-21
15:34:51
上传
评论 2
收藏 1KB RAR 举报
路边的猫
- 粉丝: 83
- 资源: 3
最新资源
- GDAL-3.4.3-cp310-cp310-win-amd64.whl
- 基于matlab实现鸡群算法,群体智能算法的一种,立足鸡群的集合特征建立优化过程,与蜂群算法、蛙群算法有相似之处.rar
- 基于matlab实现很好的一个蜂群算法 基于matlab的源程序 从作者那要过来的.rar
- 基于matlab实现多目标优化NSGA3代码.rar
- 基于matlab实现多目标遗传算法(NSGA-III)matlab源代码.rar
- 基于matlab实现多尺度小波分析,用于分析时间多尺度周期
- vscode配置c/c 环境教程
- vscode配置c/c 环境教程
- 基于matlab实现电磁优化计算功能,进行线型规划优化电磁设计.rar
- 基于matlab实现带精英策略的非支配排序遗传算法matlab 源码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0