//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++实现 给定直角停车位两个点,求取剩余两点坐标。的更多相关文章

  1. 对于给定的整数集合S,求出最大的d,使得a+b+c=d。

    对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...

  2. 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米

    /** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...

  3. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  4. C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)

    获取随机数 举例:0-9 Random random = new Random(); int j = random.Next(0, 9); 0.1两个值被取值的概率相等 int a = Math.Ab ...

  5. 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 ...

  6. 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>

    """给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...

  7. python中对两个 list 求交集,并集和差集

    python中对两个 list 求交集,并集和差集: 1.首先是较为浅白的做法: >>> a=[1,2,3,4,5,6,7,8,9,10] >>> b=[1,2,3 ...

  8. R语言两种方式求指定日期所在月的天数

                 R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...

  9. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能

    权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...

随机推荐

  1. 【NLP CS224N笔记】Lecture 1 - Introduction of NLP

    I. 什么是NLP NLP全称是Natural Language Processing,即自然语言处理,这是一门计算机科学.人工智能以及语言学的交叉学科. NLP涉及的几个层次由下图所示.可以看到输入 ...

  2. 【运维】Dell R710如何开启VT服务

    [前言]:           英特尔的硬件辅助虚拟化技术(Virtualization Technology,简称VT技术)是一种设计更简单.实施更高效和可靠的方法.           如果想要在 ...

  3. shiro登录验证原理

    这段时间有点忙,没咋写博客,今天打开staruml看到以前画的一张shiro原理图,先在这发一下,空了再好好进行分析.

  4. opencv处理验证码python代码

    # -*- coding: utf-8 -*- # @Time : 2019-02-11 09:39 # @Author : cxa # @File : bgr2gry.py # @Software: ...

  5. css3新属性运用

    1.css3新单位vh.vw,这个单位是相对显示窗口的宽度或高度 vh等于viewport高度的1/100.例如,如果浏览器的高是900px,1vh求得的值为9px.同理,如果显示窗口宽度为750px ...

  6. python3+selenium入门01-环境搭建

    作为一个测试,在最近两年应该有明显的感觉.那就是工作变的难找,要求变的高了,自动化测试,性能测试等.没有自动化测试能力,只会点点点工作难找不说,工资也不高.所以还是要学习一些技术.首先要学习一门编程语 ...

  7. Python3学习笔记28-HtmlTestRunner

    HtmlTestRunner是unittest模块下的一个拓展,用来生成测试报告.原生的可以自己找下下载地址,原生的看着比较丑.这次使用的是经过一些大佬优化之后的.具体GitHub地址:https:/ ...

  8. Alpha 冲刺 (6/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:感恩节~ 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 设计了拍照界面和图片上传界面 沟通了前端进度 接下 ...

  9. AviSynth AVS Importer Plugin for Adobe Premiere Pro CC 2015 x64

    Premiere CS AVS Importer x64.prm copy to Adobe\Adobe Premiere Pro CC 2015\Plug-Ins\Common\ VSFilterM ...

  10. Chrome表单文本框自动填充黄色背景色样式

    chrome表单自动填充后,input文本框的背景会变成偏黄色的,这是由于chrome会默认给自动填充的input表单加上input:-webkit-autofill私有属性,然后对其赋予以下样式: ...