專案記錄 處理兩個相交圓方法探索3

2021-07-31 05:41:04 字數 1967 閱讀 2241

問題:

原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。

方法:

使用之前的方法刪除錯誤的邊緣點之後,餘下的點中還存在偏離的點需要進一步修正。

由於邊界的起點不一定正確,所以先遍歷邊界點,找出離中心最近的點,從該點出發來查詢待

修正的點。

判斷是否需要修正的條件:

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