當(dāng)PCB外形是直角時(shí),通常工程制作外形(鑼帶)時(shí),會(huì)將直角或尖角的地方倒成圓角,主要是為了防止PCB容易劃傷板他扎傷人。
所以當(dāng)客戶沒有特殊要求時(shí),PCB外形是直角一般會(huì)默認(rèn)倒角0.5mm圓角(如下圖所示)
一.PCB板邊倒圓角點(diǎn)分析
原PCB外形如下圖圖示:看了這個(gè)PCB外形,產(chǎn)生有2個(gè)問題點(diǎn):
1.外形中哪些點(diǎn)需倒圓角?
2.如何怎么倒圓角?
1.外形中哪些點(diǎn)需倒圓角?
看下圖: PCB外形倒圓角的點(diǎn),剛好就是我們凸包需求出的點(diǎn),接下來我們將玩轉(zhuǎn)凸包了,只要求出凸包,那么就可以實(shí)現(xiàn)PCB板邊倒圓角啦。
求凸包的算法:我們可以借鑒算法導(dǎo)論中的查找凸包的算法(加以改進(jìn)得到新的求凸包方法,詳見【方法一】與【方法二】)
2.如何倒圓角?
在下面有說明倒角方法.
二. 求凸點(diǎn)
方法一求凸點(diǎn):【采用多輪遍歷,一遍一遍將凹點(diǎn)踢除,剩于的即是凸點(diǎn)】
方法一求凸點(diǎn): 代碼
////// 求最大多邊形最大凸包1 【采用多輪遍歷將凹點(diǎn)踢除,剩于的即是凸點(diǎn)】 /// /// /// public List s_convex_polyon1(List gSur_Point_list) { add addCOM = new add(); bool isOK = true; List PointList = new List (); var isCCW = s_isCCW(gSur_Point_list); int sum = gSur_Point_list.Count() - 1; int n = gSur_Point_list.Count(); for (int i = 0; i < n; i++) { int IndexPre = (i - 1) % sum; if (IndexPre == -1) IndexPre = sum - 1; int IndexCurrent = i % sum; int IndexNext = (i + 1) % sum; if (gSur_Point_list[IndexPre].type_point > 0) continue; if (gSur_Point_list[IndexCurrent].type_point > 0) continue; var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p); if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0)) PointList.Add(gSur_Point_list[IndexCurrent]); else isOK = false; } List Point2List = new List (PointList); while (!isOK) { isOK = true; PointList.Clear(); PointList.AddRange(Point2List); Point2List.Clear(); sum = PointList.Count() - 1; n = PointList.Count(); for (int i = 0; i < n; i++) { int IndexPre = (i - 1) % sum; if (IndexPre == -1) IndexPre = sum - 1; int IndexCurrent = i % sum; int IndexNext = (i + 1) % sum; var multiVal = multi(PointList[IndexPre].p, PointList[IndexCurrent].p, PointList[IndexNext].p); if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0)) Point2List.Add(PointList[IndexCurrent]); else isOK = false; } } return Point2List; }
方法二求凸包:【采用一邊遍歷找出凸點(diǎn)并加入隊(duì)列,并同時(shí)將隊(duì)列中的凸點(diǎn)隊(duì)列中找出凹點(diǎn)踢除】
方法二求凸包代碼:
////// 求最大多邊形最大凸包2 【采用一邊遍歷找出凸點(diǎn)并加入隊(duì)列,并同時(shí)將隊(duì)列中的凸點(diǎn)隊(duì)列中找出凹點(diǎn)踢除】 /// /// /// public List s_convex_polyon2(List gSur_Point_list) { Stack StackPoint = new Stack (); var isCCW = s_isCCW(gSur_Point_list); int sum = gSur_Point_list.Count() - 1; int n = gSur_Point_list.Count(); for (int i = 0; i < n; i++) { int IndexPre = (i - 1) % sum; if (IndexPre == -1) IndexPre = sum - 1; int IndexCurrent = i % sum; int IndexNext = (i + 1) % sum; if (gSur_Point_list[IndexPre].type_point > 0) continue; if (gSur_Point_list[IndexCurrent].type_point > 0) continue; var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p); if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0)) { L1: if (StackPoint.Count > 1) { var Top1Point = StackPoint.Pop(); var Top2Point = StackPoint.Peek(); multiVal = multi(Top2Point.p, Top1Point.p, gSur_Point_list[IndexCurrent].p); if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0)) StackPoint.Push(Top1Point); else goto L1; } StackPoint.Push(gSur_Point_list[IndexCurrent]); } } return StackPoint.Reverse().ToList(); }
方法三求凸包:【按算法導(dǎo)論Graham掃描法 各節(jié)點(diǎn)按方位角+距離 逆時(shí)針排序 依次檢查,當(dāng)不屬凸點(diǎn)于則彈出】
方法三求凸包代碼
////// 求最大多邊形最大凸包5 【按算法導(dǎo)論Graham掃描法 各節(jié)點(diǎn)按方位角+距離 逆時(shí)針排序 依次檢查,當(dāng)不屬凸點(diǎn)于則彈出】 /// 由于把各點(diǎn)的排列順序重新排序了,只支持折線節(jié)點(diǎn)(當(dāng)存在弧節(jié)點(diǎn)時(shí)會(huì)出異常 ?。?!) /// /// /// public List s_convex_polyon3(List gSur_Point_list) { var LeftBottomPoint = gSur_Point_list.OrderBy(tt => tt.p.y).ThenBy(tt => tt.p.x).FirstOrDefault(); gSur_Point_list.RemoveAt(gSur_Point_list.Count - 1); gSur_Point_list.ForEach(tt => { tt.Value = p2p_di(LeftBottomPoint.p, tt.p); tt.Angle = p_ang(LeftBottomPoint.p, tt.p); } ); gSur_Point_list = gSur_Point_list.OrderBy(tt => tt.Angle).ThenBy(tt => tt.Value).ToList(); gSur_Point_list.Add(gSur_Point_list[0]); Stack StackPoint = new Stack (); var isCCW = true; int sum = gSur_Point_list.Count() - 1; int n = gSur_Point_list.Count(); for (int i = 0; i < n; i++) { int IndexPre = (i - 1) % sum; if (IndexPre == -1) IndexPre = sum - 1; int IndexCurrent = i % sum; int IndexNext = (i + 1) % sum; var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p); if (isCCW && multiVal > 0) { L1: if (StackPoint.Count > 1) { var Top1Point = StackPoint.Pop(); var Top2Point = StackPoint.Peek(); multiVal = multi(Top2Point.p, Top1Point.p, gSur_Point_list[IndexCurrent].p); if (isCCW && multiVal > 0) StackPoint.Push(Top1Point); else goto L1; } StackPoint.Push(gSur_Point_list[IndexCurrent]); } } return StackPoint.Reverse().ToList(); }
公共方法與數(shù)據(jù)結(jié)構(gòu)
?View Code
三.板邊凸點(diǎn)倒圓角方法
方法一:也最簡(jiǎn)單的倒角方法,我們將PCB板邊凸點(diǎn)找出來后,可以直接借助genesis倒角功能就可以實(shí)現(xiàn)了
當(dāng)然但偶爾會(huì)報(bào)錯(cuò)的, 且當(dāng)N個(gè)小線段組成的尖角倒角會(huì)出錯(cuò)(要實(shí)現(xiàn)完美效果只有自己寫倒角算法啦)
方法二:自己寫倒角算法,這個(gè)算法和加內(nèi)角孔算法類似(這里只是介紹簡(jiǎn)單的倒角)考慮特殊的需要擴(kuò)展
可以參考這篇文章:https://www.cnblogs.com/pcbren/p/9665304.html
四.凸點(diǎn)加倒圓角實(shí)現(xiàn)效果
——End——
審核編輯 :李倩
-
pcb
+關(guān)注
關(guān)注
4315文章
22928瀏覽量
395467 -
PCB板
+關(guān)注
關(guān)注
27文章
1440瀏覽量
51452
原文標(biāo)題:很好的實(shí)現(xiàn)PCB板邊倒圓角~
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論