c++实现 给定直角停车位两个点,求取剩余两点坐标。
//2018-09-08-fourmi /*************************include head files************************************************/
#include<iostream>
#include<math.h>
#include<vector>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<fstream>
/*******************************************************************************************/ /**********************Define variables*****************************************************/
#define pi 3.1415926
#define POINT pair<double,double>
#define VECT vector<vector<double> >
const int MAX_ITER=100000;
const double eps=0.0000001;
/*******************************************************************************************/ using namespace std; /*****************************Vector_Transformation****************************************/
POINT Vector_Transformation(POINT &pt,double num1,double num2,double num3,double num4)
{
POINT result;
result.first=pt.first*num1+pt.second*num3;
result.second=pt.first*num2+pt.second*num4; return result; }
/*******************************************************************************************/ /***************************FUNCTIONS_ABOUT_SVD*********************************************/
double get_norm(double *x, int n){
double r=0; for(int i=0;i<n;i++)
r+=x[i]*x[i];
return sqrt(r);
} double normalize(double *x, int n){
double r=get_norm(x,n); if(r<eps)
return 0;
for(int i=0;i<n;i++)
x[i]/=r;
return r;
} inline double product(double*a, double *b,int n){
double r=0; for(int i=0;i<n;i++)
r+=a[i]*b[i];
return r;
} void orth(double *a, double *b, int n){//|a|=1
double r=product(a,b,n); for(int i=0;i<n;i++)
b[i]-=r*a[i]; } bool svd(VECT A, int K, VECT &U, vector<double> &S, VECT &V){
int M=A.size();
int N=A[0].size();
double *left_vector=new double[M];
double *next_left_vector=new double[M];
double *right_vector=new double[N];
double *next_right_vector=new double[N];
double diff=1;
double r=-1;
int col=0; U.clear();
V.clear();
S.clear();
S.resize(K,0);
U.resize(K);
for(int i=0;i<K;i++)
U[i].resize(M,0);
V.resize(K);
for(int i=0;i<K;i++)
V[i].resize(N,0); for(int col=0;col<K;col++){ while(1){
for(int i=0;i<M;i++)
left_vector[i]= (float)rand() / RAND_MAX;
if(normalize(left_vector, M)>eps)
break;
} for(int iter=0;diff>=eps && iter<MAX_ITER;iter++){
memset(next_left_vector,0,sizeof(double)*M);
memset(next_right_vector,0,sizeof(double)*N);
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
next_right_vector[j]+=left_vector[i]*A[i][j]; r=normalize(next_right_vector,N);
if(r<eps) break;
for(int i=0;i<col;i++)
orth(&V[i][0],next_right_vector,N);
normalize(next_right_vector,N); for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
next_left_vector[i]+=next_right_vector[j]*A[i][j];
r=normalize(next_left_vector,M);
if(r<eps) break;
for(int i=0;i<col;i++)
orth(&U[i][0],next_left_vector,M);
normalize(next_left_vector,M);
diff=0; for(int i=0;i<M;i++){
double d=next_left_vector[i]-left_vector[i];
diff+=d*d;
} memcpy(left_vector,next_left_vector,sizeof(double)*M);
memcpy(right_vector,next_right_vector,sizeof(double)*N);
} if(r>=eps){
S[col]=r;
memcpy((char *)&U[col][0],left_vector,sizeof(double)*M);
memcpy((char *)&V[col][0],right_vector,sizeof(double)*N);
}else{
cout<<r<<endl;
break;
}
} delete [] next_left_vector;
delete [] next_right_vector;
delete [] left_vector;
delete [] right_vector; return true;
}
/*******************************************************************************************/ /**********************GET_THE_BIGGEST_SINGULAR_VALUE***************************************/
vector<double> GET_THE_BIGGEST_SINGULAR_VALUE(POINT vec,int m,int n,int k)
{
//分解一个1*2的矩阵A,求其前1个奇异值和奇异向量 VECT A;
A.resize(m); for(int i=0;i<m;i++)
{
A[i].resize(n);
}
A[0][0]=vec.first;
A[0][1]=vec.second; VECT U;
vector<double> S;
VECT V;
svd(A,k,U,S,V);
return S;
}
/*******************************************************************************************/ /************************CAL_THIRD_AND_FORTH_POINTS*****************************************/
POINT * cal_reset_TWO_points(POINT &pt1,POINT &pt2)
{
static POINT arr[2];
POINT vecFromSecToFirst,vec,pt3,pt4;
int x1,y1,x2,y2,exemplarStart,exemplarEnd;
double distance,angle,s,sideLength;
double slantAngleInRadians = (double(90)/180)*pi;
double LongSideMin=47.9042;
double verticalPSSideLength=195;
double parallelPSSideLength=83;
int matrix_rows=1;
int matrix_cols=2;
int top_k_max=1; x1=pt1.first;
y1=pt1.second;
x2=pt2.first;
y2=pt2.second; distance = sqrt(pow((x1-x2),2)+pow((y1-y2),2)); if (distance < LongSideMin) //说明是短库位
sideLength = verticalPSSideLength;
else //说明是平行长库位
sideLength = parallelPSSideLength; vecFromSecToFirst.first=pt1.first-pt2.first;
vecFromSecToFirst.second=pt1.second-pt2.second;
vec=Vector_Transformation(vecFromSecToFirst,cos(slantAngleInRadians),-sin(slantAngleInRadians), sin(slantAngleInRadians), cos(slantAngleInRadians)); if ((pt2.first-pt1.first)==0)
{
angle=pi/2;
}
else
{
angle=abs(atan2(vecFromSecToFirst.second,vecFromSecToFirst.first));
} s=GET_THE_BIGGEST_SINGULAR_VALUE(vec,matrix_rows,matrix_cols,top_k_max)[0];
vec.first=vec.first/s;
vec.second=vec.second/s; pt3.first=pt2.first+vec.first*sideLength;
pt3.second=pt2.second+vec.second*sideLength;
pt4.first=pt1.first+vec.first*sideLength;
pt4.second=pt1.second+vec.second*sideLength;
arr[0]=pt3;
arr[1]=pt4; return arr;
}
/*******************************************************************************************/ /*****************************************MAIN()********************************************/
int main()
{ POINT * arr;
POINT pt1(171,145);
POINT pt2(171,213);
arr=cal_reset_TWO_points(pt1,pt2);
std::cout<<arr[0].first<<" "<<arr[0].second<<std::endl;
std::cout<<arr[1].first<<" "<<arr[1].second<<std::endl; return 0; }
/*******************************************************************************************/
c++实现 给定直角停车位两个点,求取剩余两点坐标。的更多相关文章
- 对于给定的整数集合S,求出最大的d,使得a+b+c=d。
对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...
- 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米
/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...
- HDU 4607 Park Visit 两次DFS求树直径
两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R: ans = ...
- C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)
获取随机数 举例:0-9 Random random = new Random(); int j = random.Next(0, 9); 0.1两个值被取值的概率相等 int a = Math.Ab ...
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
SELECT INTO和INSERT INTO SELECT的区别 数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...
- 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>
"""给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...
- python中对两个 list 求交集,并集和差集
python中对两个 list 求交集,并集和差集: 1.首先是较为浅白的做法: >>> a=[1,2,3,4,5,6,7,8,9,10] >>> b=[1,2,3 ...
- R语言两种方式求指定日期所在月的天数
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...
- 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能
权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...
随机推荐
- SpringBoot单元测试示例2
package cn.coreqi.security.controller; import org.junit.Before; import org.junit.Test; import org.ju ...
- win7系统查看硬盘序列号步骤
1.在开始那里输入cmd,打开命令窗口: 2.输入diskpart,按enter键,进入底盘查看选项: 3.输入list disk,按回车键: list disk:查看电脑上有几块硬盘: 输入sele ...
- Linux 指定运行时动态库路径【转】
转自:http://www.cnblogs.com/cute/archive/2011/02/24/1963957.html 众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/l ...
- 定制化rpm包及本地yum仓库搭建
为方便本地yum的管理,一般都是在公司局域网内搭建本地yum仓库,实现公司内部快速安装常用软件. 步骤如下: 1.搭建要实现本地yum管理的软件,测试该软件搭建成功与否: 2.定制rpm包及其相关依赖 ...
- Webpack2 中的 NamedModulesPlugin 与 HashedModuleIdsPlugin
要讨论Webpack 2中新增的这两个plugin的功能,还要先从使用Webpack打包的项目的前端资源缓存方案说起. 通常在使用了Webpack的项目中我们会使用CommonsChunkPlugin ...
- DUILIB入门简明教程
电子书下载: DUILIB入门简明教程.chm 文章作者: Alberl 电子书制作: 邓学彬 目录: 2013 duilib入门简明教程 -- 前言(1) 2013 duilib入门简明教程 ...
- boost.asio包装类st_asio_wrapper开发教程(一)
一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...
- cocos开发学习记录
场景的创建和切换 https://blog.csdn.net/lin453701006/article/details/56334578
- Mudo C++网络库第十章学习笔记
C++编译链接精要 C++语言的三大约束: 与C兼容, 零开销(zero overhead)原则, 值语义; 兼容C语言的编译模型与运行模型, 也就是锁能直接使用C语言的头文件和库; 头文件包含具有传 ...
- $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制
1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...