任意离散点曲线求交点c++实现 您所在的位置:网站首页 matlab求两个平面曲线的交点 任意离散点曲线求交点c++实现

任意离散点曲线求交点c++实现

2023-08-16 20:52| 来源: 网络整理| 查看: 265

已知两条曲线上的点坐标(xi,yi),求二者交点。只需对曲线上线段进行遍历求线段交点即可,效果如下

                               

下面是c++代码实现

头文件 CalLineCrossPt.h

#include "stdafx.h" #include using namespace std; typedef struct tagPosition { double x; double y; tagPosition(double _x,double _y) { x=_x; y=_y;} tagPosition() {}; bool operator==(const tagPosition & pt) { return (x==pt.x && y==pt.y);} }CPosition; CPosition IsLineCross(CPosition pt1,CPosition pt2,CPosition pt3,CPosition pt4); void CalTwoLineCrossPoint(CPosition *_coord1,int _num1, CPosition *_coord2, int _num2,CPosition mincal,CPosition maxcal, vector &_crosspts); void CalMulLinesCrossPoint(CPosition **_coord, int _numline, int *_numpt, vector &_crosspts);

实现文件 CalLineCrossPt.cpp

//================================================================ // 功能: 离散曲线求交点 // // 作者: jiangjp [email protected] // 单位: China University of Geosciences (Wuhan) // 日期: 2013/8/13 //================================================================ #include "stdafx.h" #include "CalLineCrossPt.h" void CalMulLinesCrossPoint(CPosition **_coord, int _numline, int *_numpt, vector &_crosspts) { float xmin1,xmax1,xmin2,xmax2; // 存储两条线所在矩形区域的两个端点(最大最小坐标) float ymin1,ymax1,ymin2,ymax2; CPosition mincal,maxcal; // 存储两条线所在区域重叠形成的矩形区域两端点(最大最小坐标) CPosition *linemin=new CPosition[_numline]; // 开辟空间存储每条测线的x,y值最小点 CPosition *linemax=new CPosition[_numline]; // 开辟空间存储每条测线的x,y值最大点 vector tmpcrosspt; for(int i=0;iymax2) // 如果两线所在区域重叠则不需要计算交点 continue; else { mincal.x=xmin1>xmin2 ? xmin2 : xmin1; mincal.y=ymin1>ymin2 ? ymin2 : ymin1; maxcal.x=xmax1>xmax2 ? xmax1 : xmax2; maxcal.y=ymax1>ymax2 ? ymax1 : ymax2; } CalTwoLineCrossPoint(_coord[i],_numpt[i], _coord[j],_numpt[j],mincal, maxcal,tmpcrosspt); int numcrosspt=tmpcrosspt.size(); for (int k=0;kpt2.y ? pt2.y: pt1.y; float ymax1=pt1.y>pt2.y ? pt1.y: pt2.y; float xmin2=pt3.x>pt4.x ? pt4.x: pt3.x; float xmax2=pt3.x>pt4.x ? pt3.x: pt4.x; float ymin2=pt3.y>pt4.y ? pt4.y: pt3.y; float ymax2=pt3.y>pt4.y ? pt3.y: pt4.y; if(xmin1>xmax2 || xmin2>xmax1 || ymin1>ymax2 || ymin2>ymax2) return CPosition(-1,-1); if(pt1.x==pt2.x) // 当线段1斜率不存在 { if(pt3.x==pt4.x){ // 当线段2斜率不存在 return CPosition(-1,-1); // 当交点不存在返回(-1,-1)点 } else // 当线段2斜率存在 { float k2=(pt4.y-pt3.y)/(pt4.x-pt3.x); // 计算线段2斜率 float x=pt1.x; float y=k2*(x-pt3.x)+pt3.y; // 将线段1的点x坐标带入线段2 float xmin2=pt3.x>pt4.x ? pt4.x : pt3.x; float xmax2=pt3.x>pt4.x ? pt3.x : pt4.x; float ymin1=pt1.y>pt2.y ? pt2.y :pt1.y; float ymax1=pt1.y>pt2.y ? pt1.y :pt2.y; if( x>=xmin2 && x=ymin1 && ypt2.x ? pt2.x :pt1.x; float xmax1=pt1.x>pt2.x ? pt1.x :pt2.x; float ymin2=pt3.y>pt4.y ? pt4.y :pt3.y; float ymax2=pt3.y>pt4.y ? pt3.y :pt4.y; if( x>=xmin1 && x=ymin2 && ypt2.x ? pt2.x : pt1.x; float xmax1=pt1.x>pt2.x ? pt1.x : pt2.x; float xmin2=pt3.x>pt4.x ? pt4.x : pt3.x; float xmax2=pt3.x>pt4.x ? pt3.x : pt4.x; if((x>=xmin1 && x=xmin2 && x


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有