#include "ContourGenerator.h"
#include <QDebug>
#include <math.h>
ContourGenerator::ContourGenerator()
{
m_xMin = 100000;
m_xMax = -100000;
m_yMin = 100000;
m_yMax = -100000;
m_zMin = 100000.0;
m_zMax = -10000.0;
m_row = 0;
m_col = 0;
}
ContourGenerator::~ContourGenerator()
{
}
//根据规则网格生成等值线
QMap<int, QList<ContourLine> > ContourGenerator::GetContourlinesByGridPoints_new(QList<St3DPoint> points, int space)
{
if( points.size() <= 0)
qDebug() << "输入数据为空";
//1.计算边界
GetBoundary(points);
//2.获取等值线
QList<int> lineValues =GetNewLineValues(space);
if(lineValues.size() <= 0)
return m_mapAllContourLines;
//3.初始化网格并计算每个小网格中的等值点
GetAllRects(points,lineValues);
//4.计算所有网格中的曲线(或者线段)
GetAllRectLines();
//5.根据网格线生成等值线
GetContourLinesByRectLine();
//释放内存
ReleaseMemory();
return m_mapAllContourLines;
}
//获取边界点
StBandange ContourGenerator::GetBandage()
{
StBandange st;
st.xMin = m_xMin;
st.xMax = m_xMax;
st.yMin = m_yMin;
st.yMax = m_yMax;
st.zMin = m_zMin;
st.zMax = m_zMax;
return st;
}
//释放内存
void ContourGenerator::ReleaseMemory()
{
//所有的子网格
QMap<QString,ContourRect*>::Iterator it = m_mapAllRects.begin();
for(; it != m_mapAllRects.end(); it++)
{
ContourRect* p = it.value();
delete p;
p = 0;
}
m_mapAllRects.clear();
//所有的等值线点
QMap<QString,St3DPoint*>::Iterator itPoint = m_mapAllContourPoints.begin();
for( ; itPoint != m_mapAllContourPoints.end(); itPoint++)
{
St3DPoint* p = itPoint.value();
delete p; p = 0;
}
m_mapAllContourPoints.clear();
//所有子网格中的线段:网格线段已经在GetCompleteLine函数中释放,因此,此处只需将map清空即可
m_mapAllRectLines.clear();
}
//获取网格的边界
void ContourGenerator::GetBoundary(QList<St3DPoint> points)
{
QList<CONTOUR_AX> listx;
QList<CONTOUR_AX> listy;
for(int i = 0; i < points.size(); i++)
{
if( !listx.contains(points.at(i).x))
listx.push_back(points.at(i).x);
if(!listy.contains(points.at(i).y))
listy.push_back(points.at(i).y);
if( points.at(i).x >= m_xMax)
m_xMax = points.at(i).x;
if(points.at(i).x <= m_xMin)
m_xMin = points.at(i).x;
if(points.at(i).y >= m_yMax)
m_yMax = points.at(i).y;
if(points.at(i).y <= m_yMin)
m_yMin = points.at(i).y;
if(points.at(i).z >= m_zMax)
m_zMax = points.at(i).z;
if( points.at(i).z <= m_zMin)
m_zMin = points.at(i).z;
}
m_row = listy.size();
m_col = listx.size();
//qDebug() << "row = " << m_row << ", col=" << m_col;
//qDebug() << m_xMin << "-" << m_xMax << " " << m_yMin << "-" << m_yMax << " " << m_zMin << "-" << m_zMax;
}
//获取所有矩形区域及等值点
void ContourGenerator::GetAllRects(QList<St3DPoint> points, QList<int> values)
{
m_mapAllContourPoints.clear(); //所有等值点 -- 为方便计算
//输入点是列输入
for( int i = 0; i < m_col-1; i++)
{
for ( int j = 0; j < m_row-1; j++)
{
QString id = GetRectID(i,j);
//生成小矩形区域
ContourRect* prect = new ContourRect();
prect->upleft = points.at( i * m_row + j);
prect->downleft = points.at( i * m_row + j+1);
prect->upright = points.at((i+1)*m_row +j);
prect->downright = points.at((i+1)*m_row + j+1);
m_mapAllRects.insert(id,prect);
//计算区域内的等值线点
for( int x = 0; x < values.size(); x++)
{
//1.获取所有等值点
QList<St3DPoint*> listPoint = GetPointsInRect(prect, values.at(x));
//2.保存
RectPointsInfo* ps = new RectPointsInfo();
ps->list = listPoint;
//3.如果网格中仅仅包含两个点,则这来两个点直接形成一条直线,并设置该网格的状态为完成状态
if(listPoint.size() == 1)
{
ps->isAllLineGeted = true;
}
else if(listPoint.size() == 2)
{
RectLine* line = new RectLine();
line->list.push_back(listPoint.at(0));
line->list.push_back(listPoint.at(1));
listPoint.at(0)->Add2Line(line);
listPoint.at(1)->Add2Line(line);
ps->isAllLineGeted = true;
QMap<int,QList<RectLine*> >::Iterator itss = m_mapAllRectLines.find(values.at(x)); //所有子网格中的线段
if( itss == m_mapAllRectLines.end())
{
QList<RectLine*> listLines ;
listLines.push_back(line);
m_mapAllRectLines.insert(values.at(x),listLines);
}else
itss.value().push_back(line);
}else if( listPoint.size() == 4)
{
//先组成两条线段
RectLine* line1 = new RectLine();
line1->list.push_back(listPoint.at(0));
line1->list.push_back(listPoint.at(1));
listPoint.at(0)->Add2Line(line1);
listPoint.at(1)->Add2Line(line1);
RectLine* line2 = new RectLine();
line2->list.push_back(listPoint.at(2));
line2->list.push_back(listPoint.at(3));
listPoint.at(2)->Add2Line(line2);
listPoint.at(3)->Add2Line(line2);
QMap<int,QList<RectLine*> >::Iterator itss = m_mapAllRectLines.find(values.at(x)); //所有子网格中的线段
if( itss == m_mapAllRectLines.end())
{
QList<RectLine*> listLines ;
listLines.push_back(line1);
listLines.push_back(line2);
m_mapAllRectLines.insert(values.at(x),listLines);
}else
{
itss.value().push_back(line1);
itss.value().push_back(line2);
}
}
prect->mapPoints.insert(values.at(x),ps);
}
} //for j end
} // for i end
}
//根据行号和列号获取矩形区域ID
QString ContourGenerator::GetRectID(int i, int j)
{
return QString::number(i) + "," + QString::number(j);
}
//根据ID获取矩形区域
ContourRect *ContourGenerator::GetRectByID(QString id)
{
QMap<QString,ContourRect*>::Iterator it = m_mapAllRects.find(id);
if( it == m_mapAllRects.end() )
{
return 0;
}
else
return it.value();
}
//获取矩形区域内value的等值点
QList<St3DPoint*> ContourGenerator::GetPointsInRect(ContourRect *rect, int value)
{
//从左侧边开始,逆时针方向排放
QList<St3DPoint*> listout;
//downleft -upleft
St3DPoint* p2 = isEdgeContainsValue(rect->downleft,rect->upleft,value);
if(p2 )
{
p2->Add2Rect(rect);
listout.push_back(p2);
}
//downleft-downright
St3DPoint* p1 = isEdgeContainsValue(rect->downleft,rect->downright,value);
if( p1 && (!listout.contains(p1)) )
{
p1->Add2Rect(rect);
listout.push_back(p1);
}
//downright-upright
St3DPoint* p3 =isEdgeContainsValue(rect->downright,rect->upright,value);
if(p3 && (!list
没有合适的资源?快使用搜索试试~ 我知道了~
通过标准网格点计算等值线
共3个文件
h:2个
cpp:1个
3星 · 超过75%的资源 需积分: 2 5 下载量 97 浏览量
2023-09-21
15:05:41
上传
评论 1
收藏 9KB ZIP 举报
温馨提示
本资源提供了通过输入标准网格点数据计算等值线的接口,接口通过Qt实现,调整部分数据类型后也可转为C++代码。 接口使用也比较简单,将本资源的源码添加到工程中,然后调用GetContourlinesByGridPoints_new()函数即可得到等值线。该函数输入有2个,第一个是所有标准网格点的值,第二个参数是等值线的间隔。 本资源包括代码文件如下: struct.h:结构体定义文件 ContourGenerator.h接口定义头文件 ContourGenerator.cpp接口实现代码文件
资源推荐
资源详情
资源评论
收起资源包目录
标准网格点计算等值线.zip (3个子文件)
标准网格点计算等值线
ContourGenerator.cpp 36KB
ContourGenerator.h 5KB
struct.h 3KB
共 3 条
- 1
资源评论
- 去往火星2024-04-24你好,代码不全啊?class RectLine; class ContourRect; class RectLine; 这三个类的代码没有,请问能提供下完整代码吗?857202539@qq.com
qfl_sdu
- 粉丝: 4248
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功