多线程 1
载入中...
搜索中...
未找到
线.hpp
浏览该文件的文档.
1//
2// 线.hpp
3// 多线程
4//
5// Created by 赵明明 on 2023/6/15.
6//
7
8#ifndef 线__hpp
9#define 线__hpp
10
11#include <stdio.h>
12#include <string.h>
13#include "矩阵.hpp"
14
15class 线{
16public:
17 float 斜率=0;
18 float 截距=0;
19 float Inf=3.4*pow(10,38);
20public:
21 线(float k,float b):斜率(k), 截距(b){
22 }
24 矩阵* p1=(*(两个点))["0,:"];
25 矩阵* p2=(*(两个点))["1,:"];
26 矩阵 pd=*(p2)-*(p1);
27 if(pd[0]!=0 and pd[1]/pd[0]<Inf){
28 斜率=pd[1]/pd[0];
29 截距=(*p1)[1]-(*p1)[0]*斜率;
30 }else{
31 斜率=Inf;
32 截距=(*p1)[0];
33 }
34 return *(this);
35 };
36 矩阵 求交点(线 线1,线 线2){
37 矩阵 * 交点=NULL;
38 float x=Inf;
39 float y=Inf;
40 if(线2.斜率<Inf && 线1.斜率==Inf){
41 if(线2.斜率==0){
42 y=线2.截距;
43 x=线1.截距;
44 }else{
45 x=线2.截距;
46 y=线1.斜率*x*线1.截距;
47 }
48 }
49 else if(线1.斜率<Inf && 线2.斜率==Inf){
50 if(线1.斜率==0){
51 y=线1.截距;
52 x=线2.截距;
53 }else{
54 x=线1.截距;
55 y=线2.斜率*x*线2.截距;}
56 }else if(线1.斜率==线2.斜率){
57 if(线1.截距==线2.截距){//重合的线,有无数交点,x,y分别为Inf和-Inf
58 x=Inf;
59 y=-Inf;
60 //return *(交点);
61 }else{//平行线,无交点,
62 //return *(交点);
63 x=-Inf;
64 y=Inf;
65 }
66 }else{
67 float 分母=线2.斜率-线1.斜率;
68 if(分母!=0){
69 x=(线1.截距-线2.截距)/分母;
70 y=(线1.截距*线2.斜率-线2.截距*线1.斜率)/分母;
71 }
72 }
73 交点=new 矩阵(1,2,(float)0);
74 (*交点)[0]=x;
75 (*交点)[1]=y;
76
77 return *(交点);
78 };
79 friend ostream& operator<<(ostream &out,线& line){
80 cout<<"斜率:"<<line.斜率<<"截距:"<<line.截距<<endl;
81 return out;
82 }
83 float 向量叉乘(矩阵 矩阵1,矩阵 矩阵2){
84 assert(矩阵1.w==2 and 矩阵1.h==1);
85 assert(矩阵2.w==2 and 矩阵2.h==1);
86 return 矩阵1[0]*矩阵2[1]-矩阵1[1]*矩阵2[0];
87 }
88 矩阵* 线段交点(矩阵& 线1的两个点,矩阵& 线2的两个点,float* 被替换的序号){
89 // 被替换的序号维Inf时,线段无交点
90 // 被替换的喜好不维Inf时,线段有交点
91 线 线1=线(0,0);
92 线1.斜率和截距(&线1的两个点);
93 线 线2=线(0,0);
94 线2.斜率和截距(&线2的两个点);
95 矩阵 * 交点=new 矩阵(1,2,(float)0);
96
97 矩阵 交点暂存=线1.求交点(线1,线2);
98 if(交点暂存[0]==Inf and 交点暂存[1]==-Inf){//无数交点,取线1的第一个点作为交点
99 //交点暂存[0]=线1的两个点[0];
100 //交点暂存[1]=线1的两个点[1];
101 // 两直线平行且截距相同
102
103 // 如果两条直线的斜率正常
104 if(线1.斜率<Inf){
105 // 两直线的端点排序
106 矩阵* 小大1=线1的两个点.minmax(0);
107 矩阵* 小大2=线2的两个点.minmax(0);
108 // 交叉点在的x值 最小值的最大值 至 最大值的最小值间
109 int leftx = (*小大1)[0];
110 if(leftx<((*小大2)[0])){
111 leftx=(*小大2)[0];
112 }
113 int rightx = (*小大1)[2];
114 if(rightx<((*小大2)[2])){
115 rightx=(*小大2)[2];
116 }
117 // 这里可能有很多点,但这里只取最左侧的点
118 for(int i=leftx;i<leftx+1;i++){
119 //交点->data[0]=leftx;
120 //交点->data[1]=线1.斜率*leftx+线1.截距;
121 交点暂存[0]=leftx;
122 交点暂存[1]=线1.斜率*leftx+线1.截距;
123 }
124 //如果两条直线斜率为无穷
125 }else if(线1.斜率==Inf){
126 // 两直线端点的纵轴排序,
127 矩阵* 小大1=线1的两个点.minmax(0);
128 矩阵* 小大2=线2的两个点.minmax(0);
129 //交叉点 最小值的最大值 至 最大值的最小值间
130 int lowy = (*小大1)[1];
131 if(lowy<((*小大2)[1])){
132 lowy=(*小大2)[1];
133 }
134 int highty = (*小大1)[3];
135 if(highty<((*小大2)[3])){
136 highty=(*小大2)[3];
137 }
138 // 这里可能有很多点,但这里只取最下侧的点
139 for(int i=lowy;i<lowy+1;i++){
140 //交点->data[1]=lowy;
141 //交点->data[0]=线1.截距;
142 交点暂存[1]=lowy;
143 交点暂存[0]=线1.截距;
144
145 }
146
147 }
148 }
149 if(交点暂存[0]==-Inf and 交点暂存[1]==Inf){//无交点
150 *被替换的序号=Inf;
151 return 交点;
152 }
153
154 交点->data[0]=交点暂存[0];
155 交点->data[1]=交点暂存[1];
156
157 矩阵* 交点2=交点->r_(交点,交点);
158
159
160 矩阵 点差=线2的两个点-*(交点2);
161 矩阵 点差1=线1的两个点-*(交点2);
162 点差.精度(3);
163 点差1.精度(3);
164 /*
165 cout<<"线1的两个点,线2的两个点,点差1";
166 cout<<线1的两个点;
167 cout<<线2的两个点;
168 cout<<点差1;
169 */
170 *被替换的序号=Inf;
171 float small_value=0.0000001;
172 if( (((*(点差["0,0"]))[0])*((*(点差["1,0"]))[0]))<=small_value and (((*(点差["0,1"]))[0])*((*(点差["1,1"]))[0]))<=small_value and (((*(点差1["0,0"]))[0])*((*(点差1["1,0"]))[0]))<=small_value and (((*(点差1["0,1"]))[0])*((*(点差1["1,1"]))[0]))<=small_value){
173 for(int i=0;i<2;i++){
174 stringstream ss;
175 ss<<i<<",:";
176 //cout<<向量叉乘(*(点差["0,:"]),*(点差1[ss.str()]))<<endl;
177
178 if(向量叉乘(*(点差["0,:"]),*(点差1[ss.str()]))<=0){
179 *被替换的序号=i;
180 线1的两个点.data[i*2+0]=(*(交点))[0];
181 线1的两个点.data[i*2+1]=(*(交点))[1];
182 return 交点;
183 }
184 }
185 }
186
187 return 交点;
188 }
189};
190#endif /* __hpp */
基本的矩阵计算类,用于完成各种矩阵初始化、最大最小、取值、加减乘除、精度设置等矩阵计算
Definition 矩阵.hpp:25
float * data
储存矩阵元素的数组
Definition 矩阵.hpp:40
void 精度(int n=5)
设置矩阵内的数据精度,小数点后保留5位
Definition 矩阵.hpp:124
int w
矩阵的宽度,即列数
Definition 矩阵.hpp:32
矩阵 * r_(矩阵 *矩阵1, 矩阵 *矩阵2)
按行合并
Definition 矩阵.hpp:314
int h
矩阵的高度,即行数
Definition 矩阵.hpp:34
矩阵 * minmax(void)
求矩阵中所有元素的最大值,最小值
Definition 矩阵.hpp:196
Definition 线.hpp:15
矩阵 * 线段交点(矩阵 &线1的两个点, 矩阵 &线2的两个点, float *被替换的序号)
Definition 线.hpp:88
线(float k, float b)
Definition 线.hpp:21
矩阵 求交点(线 线1, 线 线2)
Definition 线.hpp:36
float 截距
Definition 线.hpp:18
float 斜率
Definition 线.hpp:17
float Inf
Definition 线.hpp:19
线 & 斜率和截距(矩阵 *两个点)
Definition 线.hpp:23
friend ostream & operator<<(ostream &out, 线 &line)
Definition 线.hpp:79
float 向量叉乘(矩阵 矩阵1, 矩阵 矩阵2)
Definition 线.hpp:83