ソースを参照

修改路径计算时角度计算和重合计算的bug

liulei 5 年 前
コミット
a53d8f938b
2 ファイル変更8 行追加13 行削除
  1. 7 12
      card_path.cpp
  2. 1 1
      line.h

+ 7 - 12
card_path.cpp

@@ -282,7 +282,6 @@ static std::vector<base_path> init_path(std::vector<base_path> & ret,vertex_list
 			{
 				point p_0=point::min(p0,p1);
 				point p_1=point::max(p0,p1);
-
 				int p00=v.add(p_0,0,0);
 				int p10=v.add(p_1,0,0);
 
@@ -324,18 +323,14 @@ static std::vector<base_path> init_path(std::vector<base_path> & ret,vertex_list
 			line_v lj=ret[j].as_line(v);
 			if(!lj.is_same(li,1)) //li线段两个点在lj直线上
 				continue;
-
 			line_v ij=lj.projection(li);//重叠
 
 			if(ij.empty())
-				continue;
-
-			
+				continue;			
 
 			point p0=li.as_line().projection(v[ret[j][0]]);
 			point p1=li.as_line().projection(v[ret[j][1]]);
 
-
 			p0=point::min(p0,v[ret[i][0]]);
 			p1=point::max(p1,v[ret[i][1]]);
 
@@ -399,7 +394,7 @@ static std::vector<base_path> init_path(std::vector<base_path> & ret,vertex_list
 	std::vector<std::vector<int>> p0(ret.size());
 	std::vector<base_path> ret2;
 	for(int i=0,len=ret.size();i<len;i++)
-	{
+	{;
 		p0[i].push_back(ret[i][0]);
 		for(int j=i+1;j<len;j++)
 		{
@@ -408,17 +403,17 @@ static std::vector<base_path> init_path(std::vector<base_path> & ret,vertex_list
 			point cr=ret[i].cross(v,ret[j]);
 			if(cr.empty())
 				continue;
-
+			
 			if(in_no_cross(cr))
 				continue;
-
+			
 			double arg=fabs(ret[i].as_line(v).arg()-ret[j].as_line(v).arg());
 			while(arg>PI/2) 
-				arg-=PI/2;
-
+				arg=PI-arg;
+			
 			if(arg/PI*180<5)//相交小于5度,不切分已有路径
 				continue;
-
+			
 			int id=v.add(cr,arg,v[ret[i][0]].sid0,v[ret[j][0]].sid0);
 			p0[i].push_back(id);
 			p0[j].push_back(id);

+ 1 - 1
line.h

@@ -223,7 +223,7 @@ struct line_v:line//线段
 		if(o[1] < t[0] || t[1] < o[0])
 			return line_v(point(0,0),point(0,0));
 
-		return line_v(point::max(t[0],o[0]),point::min(t[1],o[1]));
+		return line_v(point::min(t[0],o[0]),point::max(t[1],o[1]));
 	}
 
 	bool empty()const