我正在制作一个几何库,但我很困惑,计算一个段与另一个段的交集的函数的返回类型应该是什么。返回的值有时是一个点,有时是一个段(重叠情况),有时是一个空集。根据我的想法,可以有 3 种方法来解决这个问题,如下所示: 1. 返回一个联合(段,空,点) 2. 当交点是一个点并且两个点都为NAN 当交集为空集 3. 返回一个向量(空集为 0 个元素,pnt 为 1 个元素,段为 2 个元素)
请让我知道是否有任何替代方案以及每种设计的优缺点。此外,哪个设计应该是一个好的设计以及为什么。我有兴趣制作一个健壮的架构,它允许单管道,因此几乎不需要重写代码以及可扩展(在添加功能和处理所有边缘情况方面)
以下是我的参考代码(其返回类型为矢量)
vector<pnt> seg::inter(seg z){
vector<pnt> ans;
if(p1==p2){if(z.doesinter(p1)){ans.pb(p1);}}
else if(z.p1==z.p2){
if(doesinter(z.p1)) ans.pb(z.p1);}
else{
pnt p1p2=(p2-p1);
pnt q1=p1p2*pnt(0,1);
long double h1,h2;
if(abs((z.p2-z.p1).dot(q1))<=eps){
pnt r1((z.p1-p1)/(p2-p1)),r2((z.p2-p1)/(p2-p1));
if(abs(r1.y)<=eps){//colinear case
h1=r1.x;
h2=r2.x;
if(h1>h2)swap(h1,h2);
if(h2>=0&&h1<=1){//add eps
h1=max(0.0L,h1);h2=min(1.0L,h2);
ans.pb(p1+p1p2*h1);
if(doublecompare(h1,h2)==-1)ans.pb(p1+p1p2*h2);}}}
else{
h1 = ((p1-z.p1).dot(q1))/((z.p2-z.p1).dot(q1));
pnt q2 = (z.p2-z.p1)*pnt(0,1);
h2 = ((z.p1-p1).dot(q2))/((p2-p1).dot(q2));
if(h1+eps>=0&&h1-eps<=1&&h2+eps>=0&&h2-eps<=1) ans.pb(z.p1+(z.p2-z.p1)*h1);}}
return ans;}