等值线算法「建议收藏」

等值线算法「建议收藏」对于二维的规则网格,本文以104*104格点大小数据做为说明,数据下载:http://yunpan.cn/ccB7Y36eLXk35访问密码00c3,Qcloud.txt为原始数据,re01.t

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

对于二维的规则网格,本文以104*104格点大小数据做为说明,数据下载:http://yunpan.cn/ccB7Y36eLXk35  访问密码 00c3 ,Qcloud.txt为原始数据,re01.txt为01代码

一.算法如下:

1.在该层的数据网格中求出所有四个相邻的数据点构成的正方形;

2.判断四个数据点数据与阈值之间的关系,生成01代码;

3.由上步生成的代码按照下图的关系求出等值线与四个数据点之间的拓扑关系;

          等值线算法「建议收藏」

4.由拓扑关系用线性插值方法求出等值线与正方形的交点;

5.顺序连接等值线段,即得到等值线。

二.源代码如下:

头文件atest.h:

#ifndef ATEST_H
#define ATEST_H

#include <QtGui/QtGui>
#include "ui_atest.h"
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

class ATest : public QMainWindow,public Ui_ATestClass
{
	Q_OBJECT

public:
	ATest(QWidget *parent = 0, Qt::WFlags flags = 0);
	~ATest();

private:
	QString filename;
	std::vector<float> result;//存放所有矩形插值得到的位置数据
	bool drawtf;
	void hookupsignals();
	void paintEvent(QPaintEvent *);
private slots:
	void filesearch();
	void getParam();
};

#endif // ATEST_H

 

实现文件atest.cpp:

#include "atest.h"
using namespace std;

ATest::ATest(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	setupUi(this);
	hookupsignals(); 
	drawtf=false;
}

ATest::~ATest()
{

}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/17 10:44
// 权    限:  public 
// 返    回:  std::vector<std::string>
// 方法说明:  将string转化成字符串数组
//*************************************
std::vector<std::string> split(std::string str,std::string pattern) 
{  
	std::string::size_type pos;   
	std::vector<std::string> result;  
	str+=pattern;//扩展字符串以方便操作   
	int size=str.size();     
	for(int i=0; i<size; i++)   
	{     
		pos=str.find(pattern,i);     
		if(pos<size)     
		{      
			std::string s=str.substr(i,pos-i);       
			result.push_back(s);      
			i=pos+pattern.size()-1;     
		}   
	}   
	return result; 
}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/18 21:22  
// 权    限:  public 
// 返    回:  float
// 方法说明:  返回最终的插值结果
//*************************************
float execute(float yuzhi,float vmin,float vmax,float locmin,float locmax)
{
	float result=(locmax-locmin)*(yuzhi-vmin)/(vmax-vmin);
	return result;
}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/17 15:00
// 权    限:  public 
// 返    回:  vector<float>
// 方法说明:  插值函数,返回插值得到的点的坐标
//*************************************
vector<float> interpolate(vector<int> flag,vector<float> data,vector<float> locate)
{
	vector<float> result;
	float t;
	if(flag[0]==0)
	{
		if(flag[1]==0)
		{
			if(flag[2]==0)
			{
				if(flag[3]==0)//0000
				{				
				}	
				else//0001
				{
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);	
				}
			}
			else
			{
				if(flag[3]==0)//0010
				{
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);								
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
				}	
				else//0011
				{
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);									
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}
			}
		}
		else
		{
			if(flag[2]==0)
			{
				if(flag[3]==0)//0100
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);									
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
				}	
				else//0101
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);									
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);									
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
				}
			}
			else
			{
				if(flag[3]==0)//0110
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);								
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
				}	
				else//0111
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);									
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}
			}
		}
	}
	else
	{
		if(flag[1]==0)
		{
			if(flag[2]==0)
			{
				if(flag[3]==0)//1000
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);									
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}	
				else//1001
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);								
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
				}
			}
			else
			{
				if(flag[3]==0)//1010
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);									
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}	
				else//1011
				{
					t=execute(data[4],data[0],data[1],locate[0],locate[2]);
					result.push_back(locate[1]);
					result.push_back(locate[0]+t);
					
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);									
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
				}
			}
		}
		else
		{
			if(flag[2]==0)
			{
				if(flag[3]==0)//1100
				{
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);									
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}	
				else//1101
				{
					t=execute(data[4],data[1],data[2],locate[3],locate[5]);
					result.push_back(locate[3]+t);
					result.push_back(locate[2]);
					
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);								
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
				}
			}
			else
			{
				if(flag[3]==0)//1110
				{
					t=execute(data[4],data[2],data[3],locate[4],locate[6]);
					result.push_back(locate[5]);
					result.push_back(locate[4]+t);
					
					t=execute(data[4],data[3],data[0],locate[7],locate[1]);
					result.push_back(locate[7]+t);
					result.push_back(locate[6]);
					
				}	
				else//1111
				{	
				}
			}
		}
	}

	return result;
}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/17 10:44
// 权    限:  private 
// 返    回:  void
// 方法说明:  连接信号槽函数
//*************************************
void ATest::hookupsignals()
{
	connect(btnfilesearch,SIGNAL(clicked()),this,SLOT(filesearch()));
	connect(btnContour,SIGNAL(clicked()),this,SLOT(getParam()));
}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/17 10:44
// 权    限:  private 
// 返    回:  void
// 方法说明:  文件查找
//*************************************
void ATest::filesearch()
{
	QString dir=QFileDialog::getOpenFileName(this,
		tr("文件路径"),
		QDir::currentPath(),
		"File (*.txt)");
	if (!dir.isEmpty())
	{
		filename=dir;
		//QMessageBox::about(this,tr("通知"),tr("文件读取成功!"));
	}
	else
	{
		QMessageBox::about(this,tr("警告"),tr("文件读取失败!"));
	}
	fileedit->setText(filename);
}

//*************************************
// 作    者:  朱兴宇
// 时    间:  2015/7/16 20:24
// 权    限:  private 
// 返    回:  void
// 方法说明:  获取参数,读取文件,数据与阈值比较,1*36*104*104
//*************************************
void ATest::getParam()
{
	float yuzhi=valueedit->text().toFloat();		//读取用户指定的阈值
	ifstream infiles(filename.toStdString());		//打开将要读的文件
	ofstream outfile("E:/Project/Data/re01.txt");	//打开将要写的文件
	string datastr;									//每一行数据读取到datastr中
	vector<float> data;								//存放所有数据
	vector<int> data01;								//存放所有数据的转换后的01代码
	float pervalue;									//每一个数据值,用来与阈值比较
	int rowindex;									//控制当前读取的行数

	
	int n=0;										//读取指定行数数据
	rowindex=1;										//控制读取高度
	while(getline(infiles,datastr))
	{
		if (n>104*(rowindex-1)+1)					//第一行和第二行不读取
		{			
			vector<string> result=split(datastr,"\t");
			for (vector<string>::const_iterator it=result.begin()+3;it!=result.end();it++)
			{	
				pervalue=atof((*it).c_str());		//每一行中的每一个数据
				if (pervalue<yuzhi)					//数据与阈值比较
				{
					data01.push_back(0);			//小,则为0
				}
				else
				{
					data01.push_back(1);			//大,则为1
				}
				data.push_back(pervalue);			//将每个数据存储起来
			}
		}	
		if (n>104*rowindex)							//超过104行结束存储,因为105行意味着高度层为2
		{
			break;
		}
		n++;
	}	
	infiles.close();

	//将01代码数据存储起来
	//产生列序号
	for (int i=1;i<105;i++)
	{
		if (i<10)
		{
			outfile<<i<<"  ";
		}
		else if(i<100)
		{
			outfile<<i<<" ";
		}	
		else
		{
			outfile<<i;
		}
	}
	outfile<<endl;

	for (int i=0;i<104;i++)
	{
		for (int j=0;j<104;j++)
		{
			n=i*104+j;
			outfile<<data01[n]<<"  ";
		}
		outfile<<endl;
	}  
	outfile.close(); 

	//对数据进行处理,每四个数据处理一次,即一个矩形,数据和01代码以及位置都是按照矩形逆时针方向读取
	vector<int> flag(4);//每个矩形对应的四个顶点的01代码
	vector<float> datav(5);//0到3存储的是四个顶点对应的数据,4存放的是阈值
	vector<float> locate(8);//四个顶点对应的坐标值(x,y)
	vector<float> temp;//存放每个矩形插值得到的位置数据
	
	int index;
	for (int i=0;i<103;i++)//最后一行不需要处理
	{
		for (int j=0;j<103;j++)//最后一列不需要处理
		{
			index=i*104+j;

			flag[0]=data01[index];
			flag[1]=data01[index+104];
			flag[2]=data01[index+105];
			flag[3]=data01[index+1];

			datav[0]=data[index];
			datav[1]=data[index+104];
			datav[2]=data[index+105];
			datav[3]=data[index+1];
			datav[4]=yuzhi;				//存放阈值

			locate[0]=i;
			locate[1]=j;
			locate[2]=i+1;
			locate[3]=j;
			locate[4]=i+1;
			locate[5]=j+1;
			locate[6]=i;
			locate[7]=j+1;

			temp=interpolate(flag,datav,locate);
			for (int k=0;k<temp.size();k++)
			{
				result.push_back(temp[k]);
			}
		}
	}
	drawtf=true;	//位置数据全部获取到,接下来绘制点位置,即连接点即可
 }
void ATest::paintEvent(QPaintEvent *)
{
	QPainter painter(this); //this为绘图设备,即表明在该部件上进行绘制 
	painter.setPen(QColor(0,0,0,20));
	for (int i=0;i<104;i++)//最后一行不需要处理
	{ 
		for (int j=0;j<104;j++)//最后一列不需要处理
		{
			painter.drawLine(QPoint(i*7+250,j*7.5+25),QPoint(i*7+250,(j+1)*7.5+25));
			painter.drawLine(QPoint(i*7+250,j*7.5+25),QPoint((i+1)*7+250,j*7.5+25));
		}
	}
	painter.setPen(QColor(255,0,0));
	if (drawtf==true)
	{
		for (int i=0;i<result.size()-4;i+=4)//每隔4个数据,即每隔2个点,每个点对应xy值
		{
			painter.drawLine(result[i]*7+250, result[i+1]*7.5+25, result[i+2]*7+250, result[i+3]*7.5+25);
		}
	}
}

 四.结果

1.部分01代码图:

      等值线算法「建议收藏」

2.部分等值线图:

     等值线算法「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167656.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常用电平转换芯片_硬件电路设计教程

    常用电平转换芯片_硬件电路设计教程在设计数字电路的时候,经常会遇到控制电压不一致,尤其是ARM与一些芯片的电平不一致,比如ARM是5V供电,芯片是3.3V,或者反过来。虽然有的芯片两种电压兼容,不如STM32系列的ARM在3.3V供电的情况的下仍可以兼容5V输入,但是为了安全起见,一般都会使用电平转换芯片。电平转换芯片有两个电源分别为VCCA,对应A1-A8输入;VCCB,对应B1-B8输入.OE使能低…

    2022年8月10日
    5
  • query did not return a unique_json.parsearray(string,class)

    query did not return a unique_json.parsearray(string,class)query.uniqueResult()和query.getSingleResult()当我使用query.getSingleResult()返回实例时,提示有错,不知道什么原因。按提示修改后还是有错后来使用query.uniqueResult()方法解决问题。publicstaticDepartmentgetDepartment(Sessionsession,Strin

    2022年9月28日
    0
  • matlab中@的用法[通俗易懂]

    matlab中@的用法[通俗易懂]@是用于定义函数句柄的操作符。函数句柄既是一种变量,可以用于传参和赋值;也是可以当做函数名一样使用。举例:sin是matlab中的一个函数,但sin只是函数名,还不是函数句柄,不可以用于传参。f=@sin;这行代码定义了一个函数句柄,变量名是f。这样就可以当做参数传递了(这就是上面代码中的意义所在),而且还可以跟sin函数按相同的语法规则使用:g=f;%g也是函数句柄,其“值”和f一样…

    2022年7月17日
    12
  • Javaweb实现旅游管理系统(商城项目)(一)

    Javaweb实现旅游管理系统(商城项目)(一)一.选题的意义及选题内容概述随着信息资源的逐步网络化,信息消费者将被笼罩在巨大的信息网络之中,并由此而具备充分的获取信息的能力。此时,消费者对信息的需求将更具针对性,更为个性化。因此,网络信息服务具有传统信息服务所不具备的双向性,消费者能够更多地参与信息服务的过程,从而加速个性化服务时代的到来。锻炼自己的操作能力,将大学理论课程的学习转化为动手能力提高的基础。通过本系统,用户可以方便查询旅

    2022年6月6日
    102
  • Custom view overrides onTouchEvent but not performClick

    Custom view overrides onTouchEvent but not performClick在一个View里面覆盖了onTouchEvent方法,会报warningCustomview overridesonTouchEventbutnotperformClick处女座的我,受不了warning解决:1,再覆盖一个方法:@OverridepublicbooleanperformClick(){returnsuper.perfo

    2022年6月29日
    19
  • Script failed for StoredProcedure ‘………’ Index was outside the bounds of the array.(Microsof…

    Script failed for StoredProcedure ‘………’ Index was outside the bounds of the array.(Microsof…本地数据库远程登陆数据库服务器,右击存储过程,报错如下:原因:本地数据库版本2008R2,但服务器数据库版本2012,版本不一致导致的。转载于:https://www.cnblogs.com/vitaminC/p/6907827.html…

    2022年7月26日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号