問題:
原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。
方法:
使用之前的方法刪除錯誤的邊緣點之後,餘下的點中還存在偏離的點需要進一步修正。
由於邊界的起點不一定正確,所以先遍歷邊界點,找出離中心最近的點,從該點出發來查詢待
修正的點。
判斷是否需要修正的條件:
1)如果當前點和前面乙個點相距太大,則當前點需要向中心點平移一段距離才行
2)如果當前點和前乙個點相距偏大,且當前點、前一點、中心點三點形成的角度是鈍角,則認為
當前點嚴重偏離中心點,需要作進一步修正。
修正的方法也依照上述兩種情況分開處理:
1)如果當前點和前面點的距離太大,則前一點無法作為當前點的參考點,
考慮從中心點出發,向當前點方 向移動,找到最後乙個掩膜標記的點作為替換點;
2)否則,直接參考前面點和中心點的距離dis,將當前點向中心點方向移動,
當距離中心點小於等於dis 時,則認為可以停止移動了。
為了加快修正的速度,對於需要修正的一段圓弧,弧上的每個點的移動步數都參考圓弧起點的
移動步數,而不用每個點都使用上面的兩個判斷來結束移動。
最終的實踐效果較好。
**如下:
int beginid=0;
vector
centerdis;
int cx=centerx-vecresult[0].x;
int cy=centery-vecresult[0].y;
int cdis=cx*cx+cy*cy;
centerdis.push_back(cdis);
int dx,dy,dis;
for(int i=1;iif(cdis//最後乙個點和起始點求距離
if(beginid==0)
else
beginid++;
queue
changeid;
int newsize=size+1;
for (int i = 1; i <= size; i++)
else
if(dis>=100)
else
if(abscdis>100)
else
float
cos=(cx*x1+cy*y1)/sqrt(1.0*(cx*cx+cy*cy)*(x1*x1+y1*y1));
if(cos
<0.01)//為鈍角}}
}int step=movelen;
int changesize=changeid.size();
if(changesize==1)
vecresult[icur].x=newx;
vecresult[icur].y=newy;
}else
}else
break;
step=movelen;
//要把<=換成!=,因為有可能起點的id大於終點的id
for(int icur=ibegin;icur!=iend;icur=(icur+1)%newsize)
step=maxmove-i;
vecresult[icur].x=newx;
vecresult[icur].y=newy;
}else
step--;}}
}else
vecresult[icur].x = newx;
vecresult[icur].y = newy;
}} }}
vecresult.erase(vecresult.begin()+beginid);
out.close();
//再做一次凸包修正
vecresult = grahamscan(vecresult);
專案記錄 處理兩個相交圓方法探索1
問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 先使用邊緣點計算出新的中心點的座標b,保留相距中心點的最短距離radius。如果中心點座標a和b點的距離超過了radius,則認為當前圖中存在兩個相交的圓,需要對邊 緣做進一步的處理。依據...
專案記錄 處理兩個相交圓方法探索2
問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法還存在乙個隱蔽的問題是,之前的方法假設了邊緣上的第乙個點絕對是正確的。但是在實際情況中,第乙個點不一定可以作為正確點。所以在之前的方法的基礎上還要做一 下改進。中標記圓弧進入...
C 判斷兩個圓是否相交
定義乙個point類,其屬性包括點的座標,提供計算兩點之間距離的方法 定義乙個圓circle類,其屬性包括圓心和半徑 建立兩個圓形物件,提示使用者輸入,判斷兩圓是否相交。include include using namespace std class point double getdist co...