锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Key Words: HLR, Outline Edge, Sihouette Edge OpenCASCADE涓叧浜庨殣钘忕嚎娑堥櫎HLR綆楁硶鐨勬弿榪板氨鏄竴鍙ヨ瘽錛歍hese algorithms are based on the principle of comparing each edge of the shape to be visualized with each of its faces, and calculating the visible and the hidden parts of each edge. 鍗蟲牴鎹潰鍒ゆ柇姣忔潯杈笶dge鐨勯伄鎸″叧緋伙紝璁$畻鍑鴻竟Edge鍙鍜屼笉鍙閮ㄥ垎銆傛墍浠LR綆楁硶鐨勮緭鍏ヤ富瑕佷負杈瑰拰闈紝璁$畻閬尅鍏崇郴渚濊禆綰塊潰姹備氦綆楁硶銆傚浜庣簿紜殑HLR綆楁硶渚濊禆綺劇‘鐨勭嚎闈㈡眰浜ょ畻娉曪紝PolyAlgo綆楁硶渚濊禆澶氭綰夸笌緗戞牸姹備氦綆楁硶銆傝緭鍏ョ殑杈逛腑闄や簡BREP涓殑杈逛互澶栵紝榪樻湁涓綾繪槸鏍規嵁鎶曞獎鏂瑰悜璁$畻寰楁潵鐨勶紝鍗沖杞粨綰縊utline錛屼篃縐頒負Contour綰褲侫CIS鐨凱HLR涓О杞粨綰縎ihouette Edge銆?/p>
杞粨綰跨殑璁$畻鏄疕LR涓瘮杈冨叧閿殑涓姝ワ紝鏈枃浠penCASCADE涓畝鍗曠殑浜屾鏇查潰鐨勮疆寤撶嚎璁$畻鍏ユ墜鏉ョ悊瑙f洸闈㈢殑杞粨綰挎蹇碉紝涓虹悊瑙d換鎰忔洸闈㈣疆寤撶嚎璁$畻鎵撲笅鍩虹銆?/p>
OpenCASCADE鐨凥LR涓嬌鐢ㄧ被HLRTopoBRep_OutLiner鏉ヨ綆楀杞粨綰褲傝疆寤撶嚎鐨勮綆椾緷璧栨姇褰辨柟鍚戝強鎶曞獎鏂瑰紡錛屼富瑕佽綆楅昏緫鍦ㄥ嚱鏁癋ill()涓細 鎶曞獎鏂瑰紡涓昏鍒嗕負閫忚鎶曞獎Perspective鍜屽鉤琛屾姇褰憋紝宸ョ▼鍥劇敓鎴愪竴鑸嬌鐢ㄥ鉤琛屾姇褰辨柟寮忋傚疄闄呰綆楃被鏄疌ontap_Contour錛屽湪綾籆ontap_Contour涓張鏍規嵁鎶曞獎鏇查潰綾誨瀷鍒嗕負涓ょ綾誨瀷鏉ュ鐞嗭細 鍏朵腑鍑芥暟PerformAna()涓鴻綆楀鉤闈€佺悆闈€佸渾鏌遍潰銆佸渾閿ラ潰鐨勫杞粨綰匡紝鏈緇堜細浣跨敤綾籆ontap_ContAna銆傚叾涓瑼na涓篈nalytical瑙f瀽鏇查潰鐨勬剰鎬濓紝榪欓噷鎸囪兘鐢ㄨВ鏋愯〃杈懼紡琛ㄧず鐨勪簩嬈℃洸闈€?/p>
綾籆ontap_ContAna鑳借綆楃悆闈€佸渾鏌遍潰鍜屽渾閿ラ潰鐨勫杞粨綰緾ontour錛屼笅闈㈡垜浠富瑕佹潵鐪嬬湅榪欎笁綾婚潰鐨勫杞粨綰胯綆楃粨鏋溿?/p>
瀵逛簬騫寵鎶曞獎鐞冮潰浼氱敓鎴愪互鎶曞獎鏂瑰悜涓烘硶鍚戯紝浠ョ悆鍗婂緞涓哄崐寰勭殑涓涓渾錛屼唬鐮佸涓嬫墍紺猴細 濡備笅鍥炬墍紺轟腑鐨勭豢鑹茬殑綰匡細 瀵逛簬騫寵鎶曞獎鍦嗘煴闈細鐢熸垚涓ゆ潯鐩寸嚎錛岃嫢鎶曞獎鏂瑰悜涓庡渾鏌遍潰娉曞悜騫寵鏃朵笉鐢熸垚杞粨綰匡紝榪欐椂灝辨槸浣跨敤鍦嗘煴浣撲腑鐨勪笂涓嬩袱涓渾鐨勮竟銆備唬鐮佸涓嬫墍紺猴細 鐢熸垚鐨勪袱鏉$洿綰挎柟鍚戜負鍦嗘煴闈㈢殑杞存柟鍚戯細 鍦嗛敟闈㈢殑杞粨綰跨敓鎴愬嚱鏁伴昏緫綾諱技錛岀暀緇欒鑰呰嚜琛屽垎鏋愮悊瑙c?/p>
緇間笂鎵榪幫紝BREP鐨凥LR綆楁硶闇瑕佽綆楁ā鍨嬬殑澶栬疆寤撶嚎銆傚鐞冧綋鐨凚REP杈規湁涓や釜閫鍖栬竟錛堟瀬鐐癸級錛屽強涓や釜閲嶅悎杈癸紝鑻ユ潵鎶曞獎瀹炶川涓婂彧鏈夐噸鍚堣竟涓殑涓鏉¤竟鏈夌敤錛岃岃繖涓竟榪樻槸涓崐鍦嗐備粠鐞嗚В 綆鍗曠殑浜屾鏇查潰澶栬疆寤撶嚎璁$畻鍑芥暟鍏ユ墜錛屽啀鍘繪繁鍏ョ悊瑙d換鎰忔洸闈㈢殑澶栬疆寤撶嚎璁$畻鏂規硶銆?/p>
鐞嗚ВHLR瀹炵幇鍘熺悊錛屽彲浠ラ噸鏋凥LR浠g爜錛屼篃鍙互瀹屽叏鑷繁鍔ㄦ墜錛屽紑鍙戝嚭婊¤凍瀹為檯闇姹傜殑鑷姩鍑哄浘紼嬪簭錛岃嚜鍔ㄥ嚭鍥炬槸宸ョ▼綾昏璁¤蔣浠朵腑鐩稿鏍稿績鐨勫姛鑳斤紝鐩墠鍥藉唴鍩轟簬PDMS鍋氳嚜鍔ㄥ嚭鍥劇浉鍏寵蔣浠跺紑鍙戠殑灝辨湁寰堝瀹躲傛湰鐫寮鏀劇殑蹇冩佸垎浜繖浜涚浉瀵規瘮杈冨叧閿姛鑳界殑鍘熺悊錛岃鍥藉唴榪欎簺浜у搧鑳芥憜鑴卞熀浜嶢utoCAD/BricsCAD寮鍙戞帴鍙f垨PDMS Draft鐨勯檺鍒訛紝寮鍙戝嚭鏇村ソ鐢ㄣ佹洿鑷敱鐏墊椿鐨勮蔣浠躲?/p> 鐢ㄨ綆楁満鐢熸垚涓夌淮鐗╀綋鐨勭湡瀹炲浘褰紝鏄綆楁満鍥懼艦瀛︾爺絀剁殑閲嶈鍐呭銆傜湡瀹炲浘褰㈠湪浠跨湡妯℃嫙銆佸嚑浣曢犲瀷銆佸箍鍛婂獎瑙嗗拰縐戝璁$畻鍙鍖栫瓑璁稿棰嗗煙閮芥湁鐫騫挎硾搴旂敤銆傚湪鐢ㄦ樉紺鴻澶囨弿榪扮墿浣撶殑鍥懼艦鏃訛紝蹇呴』鎶婁笁緇翠俊鎭粡榪囨煇縐嶆姇褰卞彉鎹㈠湪浜岀淮鐨勬樉紺哄鉤闈笂緇樺埗鍑烘潵銆備粠涓夌淮鎶曞獎鍒頒簩緇寸殑闄嶇淮鎿嶄綔錛屼細瀵艱嚧鍥懼艦鐨勪簩涔夋с傝娑堥櫎榪欑被浜屼箟鎬э紝灝卞繀欏誨湪緇樺埗鏃舵秷闄よ閬尅鐨勪笉鍙鐨勭嚎鎴栭潰錛屼範鎯笂縐頒箣涓烘秷闄ら殣钘忕嚎Hidden Line Removal鍜岄殣钘忛潰Hidden Face Removal銆?/p>
榪欐槸娓叉煋鏄劇ず涓婂娑堥殣鐨勯渶姹傦紝鍦ㄦ牴鎹笁緇存ā鍨嬭嚜鍔ㄧ敓鎴愬伐紼嬪浘鐨勫伐紼嬭璁¤蔣浠朵腑錛屽娑堥殣鐨勯渶姹傛湁鎵涓嶅悓銆?/p>
宸ョ▼璁捐杞歡涓庢満姊拌璁¤蔣浠朵笉鍚岋紝宸ョ▼璁捐杞歡涓嬈″嚭鍥炬秷闅愮殑妯″瀷閲忓ぇ錛屽鍑哄浘鐨勭畻娉曡姹備富瑕佹湁錛?/p>
鍏跺疄鏈鍚庢葷粨鎴愪竴鍙ヨ瘽灝辨槸涓閿牴鎹ā鍨嬬敓鎴愯兘浜や粯鐨勫浘綰搞傝櫧鐒剁幇鍦ㄦ妧鏈笂鍏峰涓夌淮妯″瀷涓嬭濺闂寸殑鑳藉姏錛屼絾鏄洰鍓嶄簩緇村浘綰鎬緷鐒舵槸璁捐浜や粯銆佸姞宸ュ埗閫犱富瑕佷緷鎹傚伐紼嬬被璁捐杞歡涓昏鐨勫姛鑳藉氨鏄揩閫熷緩妯★紝紕版挒媯嫻嬪拰鑷姩鍥劇焊鐢熸垚銆傚綋妯″瀷閲忓ぇ鏃訛紝娑堥殣閫熷害蹇強鑷姩鐢熸垚鐨勬爣娉ㄦ枃瀛楁帓鍒楁暣榻愶紙鎴栨弧瓚沖伐紼嬩範鎯級鎴愪簡浜岀淮鍥劇焊鑷姩鐢熸垚鐨勬牳蹇冩妧鏈紝涔熸槸紼嬪簭澶勭悊涓殑闅劇偣銆?/p>
鍑犱綍鍐呮牳涓鑸兘鎻愪緵HLR綆楁硶錛岀敤鏉ユ牴鎹ā鍨嬫姇褰辯敓鎴愪簩緇村伐紼嬪浘銆侽penCASCADE鐨凥LR鎻愪緵浜嗛殣钘忕嚎娑堥殣綆楁硶銆?/p>
https://www.spatial.com/zh/products/cgm-hlr-hidden-line-removal OpenCASCADE 鎻愪緵浜嗕袱縐嶆秷闅愮畻娉曪細HLRBRep_Algo鍜孒LRBRep_PolyAlgo銆傝繖浜涚畻娉曢兘鏄熀浜庣浉鍚岀殑鍘熺悊錛氭瘮杈冨艦鐘舵瘡鏉¤竟鐩稿姣忎釜闈㈢殑鍙鎬э紝騫?璁$畻姣忔潯杈圭殑鍙閮ㄥ垎涓庢秷闅愰儴鍒嗐傜畻娉曢氳繃璁$畻鍦ㄦ寚瀹氭姇褰辨柟鍚戜笂鐨勭墿浣撴樉紺虹壒鎬э紝鍘婚櫎鎴栨爣璁拌闈㈤伄鎸$殑杈廣傝繖涓や釜綆楁硶涔熶笌涓浜涙彁鍙栧姛鑳介厤鍚堜嬌鐢紝濡傞噸鏋勪竴 涓畝鍖栫殑妯″瀷絳夛紝綆鍖栧悗鏂扮殑妯″瀷鐢辮竟緇勬垚錛屽氨鏄湪鎶曞獎鏂瑰悜涓婄殑杞粨綰褲?/p>
OpenCASCADE鐨凥LR涓皢杈瑰垎涓轟互涓嬬被鍨嬶細 浠庣被HLRBRep_HLRToShape鍜岀被HLRBRep_PolyHLRToShape涓粰鍑轟簡榪欎簺杈圭殑涓浜涘畾涔夈傚叾涓璖harp Edge琛ㄧずC0榪炵畫錛堥潪G1榪炵畫錛夌殑杈癸紝灝辨槸涓鑸珽dge錛?/p>
Smooth Edge琛ㄧずG1榪炵畫錛堥潪G2 榪炵畫錛夌殑杈癸紱 Sewn Edge琛ㄧずG2榪炵畫鐨勮竟錛?/p>
Outline Edge琛ㄧず妯″瀷鐨勮疆寤撹竟錛岃繖縐嶇被鍨嬬殑杈逛笉鍦˙REP鏁版嵁涓紝闇瑕佹牴鎹姇褰辨柟鍚戠敓鎴愶紱 Isoparameter Edge琛ㄧず闈㈢殑絳夊弬綰跨敓鎴愮殑杈癸紝榪欑綾誨瀷鐨勮竟涓嶄篃涓嶅湪BREP鏁版嵁涓紱 鍏朵腑Sharp Edge銆丼mooth Edge鍜孲ewn Edge涓鑸兘鏄疊REP涓殑EDGE鏁版嵁錛岃孫utline Edge鍜孖soparameter Edge鏄牴鎹緗澶栫敓鎴愮殑杈廣傜悊瑙h竟鐨勮繖浜涘畾涔夛紝鏂逛究瀵笻LR綆楁硶榪涜鐞嗚В銆侶LR綆楁硶鏄浉瀵圭畝鍗曠殑綆楁硶錛屼富瑕佹槸灝卞皢涓婅堪浜旂綾誨瀷鐨勮竟涓庨潰榪涜姹備氦錛屽垽鏂伄鎸″叧緋匯?/p>
鐩墠OpenCASCADE涓殑HLR綆楁硶浠g爜鍐欏緱鏈夌偣涔憋紝涓婃鍦ㄦ繁鍦硂gg鐨勪縿緗楁柉寮鍙戜漢鍛樻彁鍒拌閲嶆瀯HLR閮ㄥ垎鐨勪唬鐮併傛繁鍏ョ悊瑙?HLR綆楁硶錛屼負鑷姩鐢熸垚鍥劇焊鍔熻兘鎵撲笅鍩虹銆?/p>
eryar@163.com OpenCASCADE涓嚑浣曟洸綰夸笌鏇查潰姹備氦浣跨敤綾籊eomAPI_IntCS錛屾槸瀵圭被IntCurveSurface_HInter鐨勭畝鍗曞皝瑁呫傚湪IntCurveSurface_HInter涓鏇茬嚎鍜屾洸闈㈡眰浜ゅ垎涓轟互涓嬪嚑縐嶇被鍨嬶細 鏈枃涓昏浠嬬粛鏇茬嚎涓庢洸闈㈡眰浜ょ殑瀹炵幇鍘熺悊銆?/p>
浜屾鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜や嬌鐢↖ntAna_ConicQuad璁$畻錛屼富瑕佹濊礬鏄皢鏇茬嚎鐢ㄥ弬鏁版柟紼嬭〃紺猴紝浠e叆浜屾鏇查潰鐨勪唬鏁版柟紼嬨備簩嬈℃洸闈㈠彲浠ヤ嬌鐢ㄤ簩嬈″欏瑰紡琛ㄧず錛屽皢浜屾鏇茬嚎涓庝簩嬈℃洸闈㈢浉浜よ〃紺烘垚涓涓欏瑰紡鏂圭▼錛屼嬌鐢╩ath_DirectPolynomialRoots瀵瑰欏瑰紡鏂圭▼榪涜姹傝В銆?/p>
浜屾鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜ゅ皢鏇查潰浣跨敤IntCurveSurface_Polyhedron鍦║錛孷涓婇噰鏍風鏁e緱鍒癵rid緗戞牸銆傝繖涓被瀹炵幇涓嶪ntPolyh_MaillageAffinage綾誨姛鑳芥湁閲嶅銆?/p>
IntCurveSurface_ThePolygon澶氭綰夸笌Intf_InterferencePolygonPolyhedron 緗戞牸姹備氦錛屾牴鎹孌電嚎涓庣綉鏍兼眰浜ゆ儏鍐碉紝鎵懼埌鍒濆鍊鹼紝浣跨敤IntImp_IntCS璁$畻綺劇‘鍊箋備笌鏇查潰姹備氦鐨凪arching綆楁硶綾諱技錛屼嬌鐢ㄨ凱浠f硶鍘昏綆楃簿紜氦鐐廣傝凱浠f柟紼嬩負IntImp_ZerCSParFunc錛屽啓鍑鴻繖涓柟紼嬬殑Value()鍊艱綆楀拰Derivatives()寰垎璁$畻鍏紡銆?/p>
灝嗘洸綰夸笌鏇查潰姹備氦闂杞寲涓烘眰鏇查潰鍙傛暟u,v鍜屾洸綰垮弬鏁皐錛屼嬌鏇茬嚎C(w)鏇查潰S(u,v)涓婄殑鐐歸噸鍚堬紝寤虹珛鍑芥暟濡備笅錛?/p>
F(u,v,w)=S(u,v) - C(w) 鎵姹傜殑綺劇‘浜ょ偣婊¤凍鏂圭▼F(u,v,w)=0錛孎涓轟竴鍚湁涓変釜鍧愭爣鐨勭煝閲忥紝瀵瑰簲鍑芥暟Value()錛?/p>
Fx(u,v,w)=Sx(u,v) - Cx(w) = 0 Fy(u,v,w)=Sy(u,v) - Cy(w) = 0 Fz(u,v,w)=Sz(u,v) - Cz(w) = 0 涓婇潰涓哄惈鏈変笁涓柟紼嬬殑浠,v,w涓哄彉閲忕殑闈炵嚎鎬ф柟紼嬬粍錛岀簿紜氦鐐瑰氨鏄潪綰挎ф柟紼嬬粍鐨勮В銆備嬌鐢ㄧ被math_FunctionSetRoot搴旂敤Newton-Raphson榪唬娉曟眰瑙i潪綰挎ф柟紼嬬粍鐨勮В銆備嬌鐢∟ewton榪唬娉曟湁涓墠鎻愭潯浠舵槸瑕佹眰闈炵嚎鎬ф柟紼嬬粍涓闃跺彲瀵鹼紝鍗寵鍐欏嚭Jacobian榪唬鐭╅樀錛屽嵆涓婅堪鍑芥暟Derivatives()鐨勫疄鐜板師鐞嗭細 鑷敱鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜ntCurveSurface_TheQuadCurvExactInter 錛岄氳繃綾籌ntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter寤虹珛浜屾鏇查潰涓庢洸綰夸箣闂寸殑鍑芥暟錛屾槸姹傝В鏇茬嚎涓婂弬鏁癠鐨勪竴鍏冨嚱鏁般?/p>
鑷敱鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜ゅ拰浜岀淮鑷敱鏇茬嚎姹備氦綾諱技錛岄噰鐢ㄧ殑紱繪暎娉曘傚嵆灝嗘洸綰塊氳繃閲囨牱紱繪暎鎴愬孌電嚎Polygon錛屽皢鏇查潰閲囨牱鐢熸垚緗戞牸Polyhedron錛岄氳繃綾籌ntCurveSurface_TheInterferenceOfHInter鏉ヨ綆楀孌電嚎涓庣綉鏍肩殑鐩鎬氦銆?/p>
鍖匢ntf涓昏鐢ㄦ潵璁$畻浜岀淮澶氭綰褲佷笁緇村孌電嚎鍙婄綉鏍肩殑鐩鎬氦銆傛牴鎹鏁h綆楃殑綺椾氦鐐癸紝鍐嶆牴鎹被IntCurveSurface_TheExactHInter浣跨敤榪唬娉曟眰寰楃簿紜氦鐐廣傝繖涓濇兂涓庢洸闈㈠拰鏇查潰姹備氦鐩稿悓銆?/p>
鏇茬嚎涓庢洸闈㈡眰浜ょ殑緇撴灉涓昏涔熸槸淇濆瓨鍦ㄧ被IntCurveSurface_Intersection瀵硅薄涓紝榪欎釜綾葷殑璁捐涓庝簩緇存洸綰挎眰浜ょ被浼鹼紝涓嶅鐩存帴銆?/p>
鍙互鐪嬪埌IntCurveSurface_Intersection榪欎釜綾葷殑鏋勯犲嚱鏁版槸protected鐨勶紝鎰忔濇槸涓嶈兘鐩存帴浣跨敤錛岄氳繃媧劇敓綾籌ntCurveSurface_HInter璋冪敤SetValues()鍑芥暟灝嗘眰浜ょ粨鏋滀繚瀛樿搗鏉ャ傛眰浜ょ粨鏋滀負浜ょ偣IntCurveSurface_IntersectionPoint鍜屼氦綰縄ntCurveSurface_IntersectionSegment銆?/p>
鍏朵腑浜ょ偣涓璉ntCurveSurface_IntersectionPoint淇濆瓨浜嗕笁緇村潗鏍囩偣錛屼氦鐐瑰湪鏇查潰涓婄殑U,V鍙傛暟錛屼氦鐐瑰湪鏇茬嚎涓婄殑鍙傛暟U鍙婄浉浜ょ姸鎬併備氦綰夸富瑕佹槸綰跨幇闈㈠拰閲嶅悎閮ㄥ垎鐨勫嚑浣曞寮傛儏鍐墊暟鎹?/p>
浠庣被鍥句笂鍙互鐪嬪嚭錛岃繖涓璺悓鏍風敤鍒頒簡HLR綆楁硶涓紝鐞嗚В榪欎釜濂楄礬瀵圭悊瑙LR綆楁硶鏈夊府鍔┿?/p>
緇間笂鎵榪幫紝OpenCASCADE涓皢鏇茬嚎涓庢洸闈㈡眰浜ゆ牴鎹洸綰垮拰鏇查潰綾誨瀷鐨勪笉鍚屽垎鍒鐞嗐備簩嬈℃洸綰挎洸闈㈡眰浜や緷璧朓ntAna鍖咃紝鑷敱鏇茬嚎鍜岃嚜鐢辨洸闈㈡眰浜や嬌鐢ㄧ鏁f硶錛屾渶緇堝疄鐜扮畻娉曚笌涓や釜鏇查潰姹備氦鐨凪arching綆楁硶綾諱技錛岄氳繃紱繪暎寰楀埌鐨勭簿浜ょ偣錛屽啀浠e叆榪唬鏂圭▼姹傚緱綺劇‘瑙c傚叾涓妸鏇茬嚎鎴栨洸闈㈢鏁g殑閲囨牱鐐規病鏈夎冭檻鏇茬嚎鎴栨洸闈㈢殑鏇茬巼絳夛紝閲囨牱鐐規暟閲忚緝澶э紝浼氬獎鍝嶆ц兘 銆傛洸闈㈤噰鏍風鏁d唬鐮佷笌鏇查潰姹備氦涓殑鏈夐噸澶嶃備粠鍑犱綍姹備氦綾諱腑鍙互鐪嬪埌娌℃湁瀹瑰樊鐨勮緭鍏ワ紝鍙互鎬濊冧竴涓嬭繖涓棶棰樸?/p>
TKGeomAlgo涓櫎浜嗘嫙鍚堢畻娉曞錛屽ぇ閮ㄥ垎浠g爜涓昏灝辨槸綰跨嚎姹備氦銆佺嚎闈㈡眰浜ゅ強闈㈤潰姹備氦綆楁硶銆傜悊瑙h繖浜涚畻娉曠殑瀹炵幇鍘熺悊錛屼負Boolean綆楁硶鐨勬眰浜ら昏緫鎵撲笅鍩虹銆?/p>
OpenCASCADE涓浜岀淮鏇茬嚎姹備氦鍜屼笁緇存洸綰挎眰浜ゆ槸涓嶅悓鐨勶紝涓夌淮鏇茬嚎姹備氦緇熶竴浣跨敤紱繪暎娉曪紝浜岀淮鏇茬嚎姹備氦鏍規嵁鏇茬嚎綾誨瀷鐨勪笉鍚屽垎縐嶇被鍨嬭繘琛屽鐞嗐備簩緇存洸綰挎眰浜や腑榪樻彁渚涗簡璁$畻鑷氦鐨勭洿鎺ユ帴鍙c傚湪TKGeomAlgo涓紝涓昏鍐呭灝辨槸鎷熷悎銆佹眰浜ょ畻娉曪紝鐞嗚В姹備氦綆楁硶鐨勫疄鐜板師鐞嗭紝杈懼埌鑳介槄璇誨拰淇敼婧愮爜鐨勭姸鎬侊紝鑳藉鍒嗘瀽鍜岃В鍐沖疄闄呴亣鍒扮殑闂錛岀悊瑙penCASCADE鐨勮兘鍔涜竟鐣岋紝鏍規嵁闇瑕侀夋嫨鎵闇瑕佺殑鍔熻兘錛屼嬌杞歡緇撴灉鍙帶銆傛湰鏂囦富瑕佷粙緇嶄簩緇存洸綰跨浉浜ょ殑瀹炵幇鍘熺悊銆?/p>
鐢變簬OpenCASCADE寮鍙戞椂闂寸浉瀵逛箙榪滐紝鍦ㄤ簩緇存洸綰挎眰浜ょ浉鍏充唬鐮佷腑澶ч噺浣跨敤浜嗗畯瀹氫箟鐨勬柟寮忔潵瀹炵幇C++ 鐨勬ā鏉縯emplate鑳藉姏錛屽畯瀹氫箟鍦ㄧ被鐨刋XX_0.cxx鏂囦歡涓紝瀵瑰簲妯℃澘瀹炵幇鍦?.gxx涓細 榪欑瀹炵幇鏂瑰紡浼氳浠g爜鐨勫彲璇繪у彉宸紝涓嶅埄浜庝唬鐮佺淮鎶ゃ傚簲璇ョ敤C++鐨勬柟寮忓榪欎簺*.gxx浠g爜閲嶆瀯錛屽寮轟唬鐮佸彲璇繪у拰鍙淮鎶ゆс?/p>
浜岀淮姹備氦浣跨敤綾籊eom2dAPI_InterCurveCurve錛?榪欎釜綾繪槸瀵圭被Geom2dInt_GInter鐨勫皝瑁呫傚湪綾籊eom2dInt_GInter涓紝濡傛灉鍙緭鍏ヤ竴鏉℃洸綰匡紝鍙互璁$畻鑷氦錛屽鏋滆緭鍏ヤ袱鏉℃洸綰匡紝璁$畻涓ゆ潯鏇茬嚎鐨勭浉浜ゃ?/p>
榪欎簺綾婚兘鏄粠綾籌ntRes2d_Intersection媧劇敓錛?/p>
浠庝笂鍥懼彲鐭ワ紝浜岀淮姹備氦緇撴灉綾籌ntRes2d_Intersection鐩稿叧媧劇敓綾誨彲鐭ヤ簩緇存眰浜や笌HLR綆楁硶涔熸湁鍏崇郴錛岀悊瑙d簩緇存洸綰挎眰浜ら昏緫錛屽鐞嗚ВHLR浠g爜涔熸湁甯姪銆?/p>
褰撳彧杈撳叆涓鏉℃洸綰挎椂錛屽彲浠ュ鏇茬嚎榪涜鑷氦璁$畻錛屼富瑕佸疄鐜伴昏緫涓猴細鑻ヤ負鏅氫簩嬈℃洸綰匡紝鍒欎笉浼氳嚜浜わ紱鑻ユ槸鍏朵粬鏇茬嚎錛屼嬌鐢ㄧ鏁f硶瀵規洸綰胯繘琛岃嚜浜よ綆椼備唬鐮佸涓嬪浘鎵紺猴細 浜岀淮鏇茬嚎姹備氦緇撴灉淇濆瓨鍒扮被IntRes2d_Intersection涓紝涓昏鍖呭惈涓ら儴鍒嗭細 鍥犱負綾籌ntRes2d_Interseciton鐨勬瀯閫犲嚱鏁皃rotected錛屾墍浠ヤ笉鑳界洿鎺ヤ嬌鐢ㄨ繖涓被錛岄兘鏄氳繃鍏舵淳鐢熺被浣跨敤鍑芥暟SetValues()灝嗚綆楀緱鍒扮殑浜ょ偣鍜屼氦綰挎暟鎹繚瀛樿搗鏉ャ傝繖閲岀被鐨勮璁℃瘮杈冪箒鐞愶紝浠g爜鍙鎬ц緝宸?/p>
OpenCASCADE瀵逛簬浜岀淮鏇茬嚎姹備氦榪涜鍒嗙被澶勭悊錛屾牴鎹洸綰跨被鍨嬫槸浜屾鏇茬嚎銆佸弬鏁版洸綰垮垎鎴愪笁綾伙細浜屾鏇茬嚎涓庝簩嬈℃洸綰挎眰浜ゃ佷簩嬈℃洸綰夸笌鍙傛暟鏇茬嚎姹備氦鍜屽弬鏁版洸綰夸笌鍙傛暟鏇茬嚎姹備氦錛屼笉鍚岀殑姹備氦綾誨瀷閲囩敤涓嶅悓鐨勭瓥鐣ュ彲浠ユ彁楂樻眰浜ゆц兘鍜岀ǔ瀹氭с備嬌鐢ㄧ鏁f硶璁$畻浜岀淮鏇茬嚎鑷氦銆備粠姹備氦緇撴灉鏉ョ湅錛屼篃澶勭悊浜嗗嚑浣曞寮傞棶棰橈紝鍗蟲洸綰塊噸鍙犳儏鍐點?/p>
瀵逛簬鏇茬嚎姹備氦榪樻湁寰堝ぇ鏀硅繘絀洪棿錛?/p>
鏇茬嚎鍙互鐢ㄤ唬鏁版柟紼嬭〃紺猴紝濡傚渾鍙互鐢╔^2+Y^2=R^2琛ㄧず錛屼篃鍙互鐢ㄥ弬鏁版柟紼媂(u)=RCos(u), Y(u)=RSin(u)琛ㄧず銆傝鍒ゆ柇鐐規槸涓嶆槸鍦ㄧ嚎涓婏紝鐢ㄦ洸綰夸唬鏁版柟紼嬪彲浠ュ緢鐩存帴寰楀嚭緇撴灉錛屼絾鏄嬌鐢ㄥ弬鏁版柟紼嬪氨娌℃湁閭d箞鐩存帴銆傝繖涔熸槸鍙傛暟鏇茬嚎涓婄偣鐨勫弽姹傞棶棰橈紝鍙傛暟鏇茬嚎涓婄偣鐨勫弽姹傞棶棰樺簲鐢ㄥ箍娉涳紝濡傚墠闈㈡墍榪板垽鏂偣鏄惁鍦ㄦ洸綰夸笂銆佺偣鍚戞洸綰挎姇褰便佺偣涓庣嚎鐨勬眰浜ゃ佺偣鍦ㄥ弬鏁版洸綰夸笂鐨勫弬鏁扮瓑錛岄兘涓庣偣鐨勫弽姹傞棶棰樼浉鍏熾傛湰鏂囦富瑕佺粨鍚堜唬鐮佷粙緇峅penCASCADE鏇茬嚎涓婄偣鐨勫弽姹傚疄鐜板師鐞嗗強浣跨敤榪囩▼涓殑涓浜涙敞鎰忎簨欏廣?/p>
鍦ㄣ奣he NURBS Book銆嬩功涓皢鐐圭殑鍙嶆眰闂褰掔粨涓虹偣鍚戞洸綰挎姇褰辮窛紱繪渶鐭殑闂錛屽涓嬪浘鎵紺猴細 寤虹珛鍑芥暟f(u)=C’(u).(C(u) - P)琛ㄧず鐐瑰埌鏇茬嚎璺濈錛屽綋f(u)=0鏃朵負鐐瑰埌鏇茬嚎鐨勬渶鐭窛紱伙紝涓嶇鐐筆鏄惁鍦ㄦ洸綰夸笂銆傚嚑浣曟剰涔夋槸鐐瑰埌鏇茬嚎浠繪剰鐐圭殑鍚戦噺涓庝換鎰忕偣澶勭殑鍒囧悜閲忕偣縐負闆訛紝琛ㄧず鍦ㄤ袱涓悜閲忓瀭鐩寸殑鏃跺欐眰寰楁瀬鍊肩偣銆傛敞鎰忔暟瀛︽柟紼嬩腑鍨傜洿榪欎釜鍑犱綍鎰忎箟銆?/p>
OpenCASCADE涓疄鐜版洸綰夸笂鐐圭殑鍙嶆眰鍘熺悊涓庛奣he NURBS Book銆嬩功涓竴鑷淬傜偣鐨勫弽姹備嬌鐢ㄧ被GeomLib_Tool::Parameter()鍑芥暟錛?/p>
杈撳叆鏇茬嚎銆佺偣鍜屾渶澶ц窛紱伙紝璁$畻鐐規槸鍚﹀湪鏇茬嚎涓婂強鑻ュ湪鏇茬嚎涓婏紝鐐瑰搴斿弬鏁版洸綰跨殑鍙傛暟U銆?/p>
綾籈xtrema_ExtPC璁$畻鐐筆鍒扮嚎C鐨勬瀬鍊糆xtrema銆傛牴鎹唬鐮佹敞閲婂彲浠ョ湅鍑虹偣鐨勫弽姹傛暟瀛︽柟紼嬩笌銆奣he NURBS Book銆嬩功涓竴鑷達細 鏁板鏂圭▼瀵瑰簲鐨勭被鐨勫彉閲忎負myF錛岀被鍚嶄負Extrema_FuncExtPC錛屼粠綾籱ath_FunctionWithDerivative媧劇敓錛屾墍浠ュ繀欏誨疄鐜頒袱涓叧閿櫄鍑芥暟Value()鍜孌erivative()銆傚叾浠g爜娉ㄩ噴璇存槑浜嗚繖涓や釜鍑芥暟鐨勫疄鐜扮粏鑺傦細 鍏朵腑F(u)瀵瑰簲鍑芥暟Value(): DF(u)瀵瑰簲鍑芥暟Derivative()錛屾渶鍚庝嬌鐢∟ewton娉昺ath_FunctionRoots瀵規柟紼嬭繘琛屾眰鏍廣?/p>
OpenCASCADE涓偣鐨勫弽姹侴eomLib_Tool::Parameter()銆佺偣鍚戞洸綰挎姇褰盙eomAPI_ProjectPointOnCurve銆佺偣涓庢洸綰跨殑浜ょ偣IntTools_Context::ComputeVE絳夌畻娉曢兘鏄嬌鐢ㄤ簡Extrema_ExtPC綾匯?/p>
褰撲嬌鐢℅eomLib_Tool::Parameter()鍑芥暟鏉ュ垽鏂偣鏄惁鍦ㄦ洸綰夸笂鏃訛紝娉ㄦ剰绔偣澶勭偣鐨勫弽姹傝婊¤凍鍨傜洿鐨勬潯浠訛紝鍗充嬌鐐逛笌鏇茬嚎鏌愪釜绔偣璺濈灝忎簬MaxDist鏃訛紝涔熸槸榪斿洖false銆傚嵆瀵逛簬鏇茬嚎绔偣澶勭殑鎯呭喌闇瑕佽嚜宸遍鍏堝鐞嗭紝鐩存帴綆楃偣P涓庢洸綰跨鐐硅窛紱諱笌MaxDist姣旇緝錛屽厛澶勭悊绔偣銆?/p>
鍙互鐪嬪埌榪欓噷涔熷鐞嗙殑绔偣澶勭殑鎯呭喌錛屼絾鏄渶鍚庢病鏈変笌MaxDist鏈夊叧緋伙紝鏈鍚庡宸槸Precision::SquareConfusion()銆?/p>
OpenCASCADE涓轟簩緇存洸綰挎彁渚涗簡姹備氦鍙婅嚜浜ょ殑綾?Geom2dAPI_InterCurveCurve錛氬綋浼犲叆涓涓簩緇村嚑浣曟洸綰挎椂鍙互璁$畻鑷氦self-intersections銆備絾鏄病鏈夋彁渚涚洿鎺ョ殑涓夌淮鍑犱綍鏇茬嚎姹備氦鐨勭被錛屼篃娌℃湁鐩存帴鐨勮綆楄嚜浜ょ殑綾匯傛湁浜哄悓瀛﹂棶OpenCASCADE鏈夋病鏈変笁緇存洸綰胯嚜浜ょ殑鍔熻兘錛屽叾瀹炵悊瑙d袱涓狤dge姹備氦綆楁硶鍚庯紝鍙互鑷繁瀹炵幇涓涓嚜浜ゅ嚱鏁般?/p>
鍥犱負OpenCASCADE涓袱鏉′笁緇存洸綰挎眰浜ょ殑綾繪槸IntTools_EdgeEdge錛屽叾瀹炵幇鍘熺悊鏄熀浜庡寘鍥寸洅鐨勫垎鍓叉硶銆傚熀浜庤繖涓垎鍓查掑綊鎬濇兂錛屽疄鐜拌嚜浜や篃鍙互鍙傝冭繖涓濊礬銆傜畻娉曠殑嫻佺▼涓猴細杈撳叆涓鏉¤璁$畻鑷氦鐨勮竟Edge錛屽杈硅繘琛岀鏁i噰鏍鳳紝灝嗛噰鏍峰緱鍒扮殑姣忔鏇茬嚎鐨勫寘鍥寸洅鐢熸垚BVH榪涜鐩鎬氦媯嫻嬶紝灝咮VH涓寘鍥寸洅鐩鎬氦鐨勪袱鏉℃洸綰胯皟鐢↖ntTools_EdgeEdge鏉ヨ綆楃浉浜ゃ?/p>
紱繪暎寰楀埌鐨勬洸綰挎浼氭瘮杈冨錛屽鏋滅敤涓や釜寰幆鏉ユ嫻嬩袱涓ゆ洸綰挎鐨勭浉浜ゆ儏鍐墊ц兘宸紝鍙互寮曞叆BVH鎻愰珮鎬ц兘銆?/p>
鍙互閫氳繃鎻掑糏nterpolate鏉ユ瀯閫犳洸綰挎祴璇曪紝鎸囧畾鍑犱釜鑷氦鐐規潵鏋勯犳彃鍊兼洸綰褲傝綆楃粨鏋滃涓嬪浘鎵紺猴細 涓庢洸綰挎眰浜ゅ師鐞嗙被浼鹼紝閮芥槸浣跨敤紱繪暎鐨勬柟娉曪紝鍙互鎬濊冧竴涓嬫暟鍊肩畻娉曞浣曞鐞嗐?/p>
OpenCASCADE涓彁渚涗簡浜岀淮鍑犱綍鏇茬嚎鐨勬眰浜ょ被Geom2dAPI_InterCurveCurve錛屽搴斿埌涓夌淮鍑犱綍鍙彁渚涗簡GeomAPI_IntCS, GeomAPI_IntSS錛屾病鏈夋彁渚涘嚑浣曠殑GeomAPI_IntCC姹備氦綾匯傝繖浜涘嚑浣曟眰浜や竴鑸嬌鐢ㄧ殑鏄暟鍊肩畻娉曪紝鍗寵В鏂圭▼銆傚浜庝袱鏉″嚑浣曟洸綰縋(u1), Q(u2)錛屾眰浜ゅ氨鏄ВP(u1) - Q(u2) = 0榪欎釜鏂圭▼銆備負浠涔堝浜庝笁緇村嚑浣曟洸綰挎病鏈夋彁渚涙暟鍊肩畻娉曪紵 瀵逛簬鎷撴湸杈規彁渚涗簡姹備氦綆楁硶IntTools_EdgeEdge錛岃繖涓被鏄嬌鐢ㄧ被浼間簬鏇查潰姹備氦鐨勭鏁g綉鏍兼硶錛屼嬌鐢ㄤ簡紱繪暎鍖呭洿鐩掓硶銆?/p>
鍩轟簬鍖呭洿鍚堢洅鐨勭畻娉曟槸涓掑綊綆楁硶錛岀畻娉曟濊礬錛?/p>
絎竴嬈℃槸鍒嗗埆鍒嗘垚2閮ㄥ垎錛?/p>
鍦ㄩ掑綊鍑芥暟FindSolutions()涓紝鍙幓瀵圭涓鏉¤竟榪涜鍙傛暟鍒嗗壊鎴?閮ㄥ垎錛?/p>
絎竴涓緟鍔╁嚱鏁版槸FindParameters()錛岀敤鏉ユ洿鏂扮浜屾潯杈瑰湪絎竴鏉¤竟鐨勭殑鍖呭洿鐩掍腑鐨勫弬鏁拌寖鍥達紝浣跨敤榪欎釜鍙傛暟鑼冨洿鏇存柊鍖呭洿鐩掋?/p>
絎簩涓緟鍔╁嚱鏁版槸CheckCoincidence()錛岀敤鏉ユ嫻嬩袱孌佃竟鏄惁閲嶅悎銆傜涓姝ユ槸蹇熻綆楋紝瀵硅竟閲囨牱10涓偣錛岃嫢閫氳繃鍒濇綺楁嫻嬶紝鍚庨潰鍐嶆繁鍏ヨ綆椼傝繖浜涚畻娉曢兘涓嶅お楂樻晥銆?/p>
絎笁涓緟鍔╁嚱鏁版槸IsIntersection()鐢ㄦ潵鍒ゆ柇涓よ竟鏉″湪鍙傛暟鑼冨洿鍐呮槸鍚︾浉浜ゃ?/p>
灝嗕袱鏉¤竟姹備氦榪囩▼涓殑鍖呭洿鐩掓樉紺哄嚭鏉ワ紝鏂逛究鏌ョ湅鐞嗚В綆楁硶銆傚厛嫻嬭瘯涓や釜鍦嗕箣闂寸殑鐩鎬氦錛?/p>
鍏朵腑絎竴鏉¤竟鏄豢鑹茬殑鍦嗭紝姹備氦榪囩▼涓殑鍖呭洿鐩掍篃鐢ㄧ豢鑹茶〃紺猴紱絎簩鏉¤竟鏄孩鑹茬殑鍦嗭紝姹備氦榪囩▼涓殑鍖呭洿鐩掍篃鐢ㄧ孩鑹茶〃紺恒傚洜涓哄渾鏄棴鍚堢殑錛岀涓嬈¢兘鍒嗗壊鎴?閮ㄥ垎銆傚皢涓婇潰浜ょ偣澶勭悊鏀懼ぇ錛?/p>
鍚庨潰閮芥槸灝嗙涓鏉¤竟鍒嗗壊鎴?閮ㄥ垎錛岀劧鍚庡垎鍒敤榪?閮ㄥ垎鐨勫寘鍥寸洅鍘繪壘涓庣浜屾潯杈圭浉浜ょ殑鍙傛暟鑼冨洿錛屽啀鏇存柊絎簩鏉¤竟鐨勫寘鍥寸洅銆傜戶緇斁澶т笂闈氦鐐瑰錛?/p>
鍙戠幇瀵逛簬涓や釜鍦嗙殑姹備氦錛屾墽琛屼簡100嬈★紝鏁堢巼涓嶉珮銆傚張鐢ㄤ袱涓狟鏍鋒潯鏇茬嚎姹備氦鏉ユ祴璇曪細 鍙戠幇瀵逛簬B鏍鋒潯鏇茬嚎姹備氦閫熷害杈冨揩銆?/p>
鏇茬嚎姹備氦闇瑕佽冭檻閲嶅悎閮ㄥ垎錛宱pencascae涓病鏈変嬌鐢ㄦ暟鍊肩畻娉曟潵璁$畻錛岃屾槸閲囩敤鍩轟簬鍖呭洿鐩掔殑綆楁硶鏉ュ鐞嗐傝繖縐嶇畻娉曚竴鑸儏鍐典笅鍙互蹇熸壘鍒版眰浜よВ錛屾湁鏃墮掑綊杈冩繁錛屽浜庡熀鏈洸綰垮彲浠ュ儚鏇查潰姹備氦涓鏍峰垎綾誨鐞嗕互鎻愰珮鎬ц兘銆俹pencascade涓浜庝笁緇存洸綰挎眰浜ょ畻娉曟ц兘榪樻湁浼樺寲絀洪棿銆?/p>
闄や簡鍦∣penCASCADE鍏ラ棬鎸囧崡涓帹鑽愮殑涔︾睄涔嬪錛岃繕鏈変竴浜涜繘闃剁殑涔︾睄錛屾斁鍦ㄩ偅鍎挎湁鏃墮棿灝辯湅鐪嬶紝鎬諱細鏈変簺鏀惰幏銆傛偀鎬т笉瓚籌紝鍙湁鍕よ兘琛ユ嫏銆傚浜庣湅涓嶆噦鐨勶紝鍙兘鐢?ldquo;涔﹁鐧鵑亶錛屽叾涔夎嚜瑙?rdquo;瀹夋叞涓涓嬭嚜宸便?/p>
鐜嬪厓 鏁板澶ц緸鍏?nbsp; 宸ュ叿涔?nbsp; 鏂逛究涓浜涘畾涔夛紝鍏紡錛屽畾鐞嗙殑鏌ユ壘銆?/p>
銆婅綆楁満杈呭姪鍑犱綍璁捐瀵艱銆嬫瘮杈冨叏闈㈠湴浠嬬粛浜嗚綆楁満杈呭姪鍑犱綍璁捐鐨勫彂灞曞巻鍙插強鍏朵富瑕佸唴瀹瑰拰鏈鏂拌繘灞曪紝鍖呮嫭鐜頒唬鐨凾鏍鋒潯鏇茬嚎鏇查潰銆?/p>
銆婃牱鏉″嚱鏁頒笌璁$畻鍑犱綍銆嬪彊榪版牱鏉″嚱鏁板拰璁$畻鍑犱綍鐨勫熀鏈悊璁哄拰鏂規硶錛屽悓鏃訛紝鎬葷粨浜嗕綔鑰呭嚑騫存潵鍦ㄨ棰嗗煙涓殑鐮旂┒鎴愭灉. 銆婄幇浠f暟瀛﹀熀紜涓涗功165錛氭暎涔辨暟鎹嫙鍚堢殑妯″瀷銆佹柟娉曞拰鐞嗚錛堢浜岀増錛夈嬩粙緇嶄簡澶氬厓鏁d貢鏁版嵁鎷熷悎鐨勪竴鑸柟娉曪紝鍖呮嫭澶氬厓鏁d貢鏁版嵁澶氶」寮忔彃鍊箋佸熀浜庝笁瑙掑墫鍒嗙殑鎻掑兼柟娉曘丅oole鍜屼笌Loons鏇查潰銆丼ibson鏂規硶鎴栬嚜鐒墮偦榪戞硶銆丼hepard鏂規硶銆並riging鏂規硶銆佽杽鏉挎牱鏉℃柟娉曘丮Q鎷熸彃鍊兼硶銆佸緞鍚戝熀鍑芥暟鏂規硶銆佽繍鍔?灝忎簩涔樻硶銆侀殣鍑芥暟鏍鋒潯鏂規硶銆丷鍑芥暟娉曠瓑銆傚悓鏃惰繕鐗瑰埆浠嬬粛浜嗚繎騫存潵鍥介檯涓婅秺鏉ヨ秺鐑茍鍦ㄦ棤緗戞牸寰垎鏂圭▼鏁板艱В鏂歸潰鏈夎澶氬簲鐢ㄧ殑寰勫悜鍩哄嚱鏁版柟娉曞強鍏剁浉鍏崇悊璁恒?/p>
涓昏鍐呭鍖呮嫭鍑犱綍鍋忓井鍒嗘柟紼嬬殑鏋勯犳柟娉曘佸悇縐嶅井鍒嗗嚑浣曠畻瀛愮殑紱繪暎鍖栨柟娉曞強鍏剁鏁f牸寮忕殑鏀舵暃鎬с佸嚑浣曞亸寰垎鏂圭▼鏁板兼眰瑙g殑鏈夐檺宸垎娉曘佹湁闄愬厓娉曚互鍙婃按騫抽泦鏂規硶錛岃繕鍖呮嫭鍑犱綍鍋忓井鍒嗘柟紼嬪湪鏇查潰騫蟲粦銆佹洸闈㈡嫾鎺ャ丯杈規礊濉ˉ銆佽嚜鐢辨洸闈㈣璁°佹洸闈㈤噸鏋勩佹洸闈㈡仮澶嶃佸垎瀛愭洸闈㈡瀯閫犱互鍙婁笁緇村疄浣撳嚑浣曞艦鍙樹腑鐨勫簲鐢ㄣ?/p>
钂欑毊錛?strong>Skinning錛夊氨鏄皢涓綈囨埅闈㈡洸綰匡紙section curves錛夎瀺鍚堝湪涓璧風敓鎴愭洸闈㈢殑榪囩▼銆傝挋鐨彧鏄?strong>鏀炬牱錛?strong>Lofting錛夌殑鏂板悕璇嶏紝鏀炬牱鍙互榪芥函鍒拌綆楁満娌℃湭璇炵敓鐨勬椂鍊欙紝浠庨偅鏃跺埌鐜板湪錛屽畠涓鐩村湪閫犺埞銆佹苯杞﹀拰鑸┖宸ヤ笟涓騫挎硾鍦板簲鐢ㄣ?/p>
鎵帬錛?strong>Sweep錛夌爺絀剁殑鏄竴鏉℃埅闈㈡洸綰挎部浠繪剰璺緞鏇茬嚎鎵帬鐨勯棶棰樸傛牴鎹壂鎺犳洸闈㈢殑瀹氫箟錛屾壂鎺犳洸闈㈡湭蹇呴兘鑳借〃紺烘垚NURBS褰㈠紡錛屾墍浠ヤ竴鑸噰鐢ㄦ嫙鍚堢畻娉曟潵閫艱繎銆備竴縐嶇畻娉曟槸鍩轟簬钂欑毊娉曪紝娌跨潃璺緞鏇茬嚎鍙樻崲鍜岄噰鏍種涓埅闈紝鐒跺悗灝嗗畠浠綔涓烘埅闈㈡洸綰胯繘琛岃挋鐨傞殢鐫閲囨牱鏁伴噺N鐨勫鍔狅紝鐢熸垚鐨勬嫙鍚堟洸闈㈢簿搴︿篃灝嗘彁楂樸?/p>
鏈枃涓昏浠嬬粛OpenCASCADE涓壂鎺犻犲瀷綆楁硶鐨勪嬌鐢紝闄や簡涓婇潰涓鑸殑鎵帬鏇查潰錛岃繕鏈変竴浜涢珮綰х敤娉曘?/p>
鍦―Raw Test Harness涓緭鍏ュ懡浠etsweep鍙互鐪嬪埌鏈夋寚瀹氬紩瀵?綰縂uide鐨勯夐」錛?/p>
榪欎釜寮曞綰縂uide鏈変粈涔堢敤鍛紵涓嬮潰緇欏嚭涓涓ず渚嬶細 鍏朵腑Profile鏄壂鎺犳埅闈紝Spine涓烘壂鎺犺剨綰匡紝Guide涓烘壂鎺犲紩瀵肩嚎銆傛壂鎺犵粨鏋滃氨鏄竴涓灪鏃嬬殑閽誨ご妯″瀷銆傚湪Draw Test Harness鐨勪緥瀛愪腑錛岀粰鍑轟袱涓叧浜庡紩瀵肩嚎鎵帬鐨勭ず渚嬶紝涓や釜閽誨ご錛?/p>
鎶婅繖涓や釜渚嬪瓙鐞嗚В鍩烘湰鑳芥帉鎻℃壂鎺犵畻娉曠殑浣跨敤鏂規硶錛屼粠榪欎袱涓緥瀛愬彲浠ョ湅鍑猴紝OpenCASCADE鎵帬閫犲瀷鑳藉姏榪樹笉閿欍?/p>
鎵帬榪樻湁涓涓兘鍔涙槸浣挎壂鎺犳埅闈㈠瀭鐩翠簬涓涓敮鎾戦潰錛岃繖鏄竴涓湁鐢ㄧ殑閫夐」銆備笅闈㈣繕鏄湪Draw Test Harness涓祴璇曚竴涓嬶細 OpenCASCADE涓壂鎺犻犲瀷綆楁硶鍔熻兘榪樻瘮杈冨己澶э紝闄や簡鏀寔甯歌鐨勬壂鎺犲錛岃繕鏀寔甯﹀紩瀵肩嚎鐨勬壂鎺狅紝鍙婂甫寮曞綰跨殑澶氫釜鎴潰鐨勫彉褰㈡壂鎺狅紝榪樻敮鎸佹埅闈㈠緇堝瀭鐩翠簬鏀寔闈㈢殑鎵帬閫夐」銆傛壂鎺犵殑鍏抽敭鏄‘瀹氭埅闈㈢殑鍙樻崲瑙勫垯錛屽簳灞傜殑钂欑毊鎷熷悎綆楁硶榪樻槸姣旇緝紼沖畾鐨勩傛妸Draw Test Harness涓袱涓捇澶寸殑渚嬪瓙鐞嗚В鍚庯紝鍩烘湰涓婂簲璇ヨ兘澶熸帉鎻penCASCADE涓壂鎺犻犲瀷鐨勪嬌鐢ㄦ柟娉曘?/p>
OpenCASCADE涓闈㈢殑鐩鎬氦瀹氫箟濡備笅鍥炬墍紺猴細 涓夌淮絀洪棿涓袱涓甫鏈塆eometry Surface鐨勯潰Face錛屽綋涓や釜Surface涔嬮棿鐨勮窛紱誨皬浜嶧ace涓殑瀹瑰樊Tolerance錛屽垯璁や負鏄浉浜ょ殑銆備竴鑸袱涓潰涔嬮棿鐩鎬氦寰楀埌鐨勬槸浜ょ嚎錛岃繕鏈変竴浜涙儏鍐靛緱鍒扮殑鏄氦鐐癸紝濡備笅鍥炬墍紺猴細 甯冨皵榪愮畻涓潰鐨勭浉浜ゆ槸鐩稿澶嶆潅鐨勯棶棰橈紝闄や簡鑰冭檻涓婅堪浜ょ嚎鍜屼氦鐐圭殑闂浠ュ錛岃繕瑕佽冭檻鏈夐噸鍙犵殑鎯呭喌錛涘浜庢柊鐢熸垚鐨勪氦綰匡紝榪樿鑰冭檻鐢熸垚PCurve錛涜嫢闈笂鏈夊紑瀛旓紝榪樿灝嗙┛榪囧紑瀛斿尯鍩熺殑浜ょ嚎鎺掗櫎絳夛紱鏈鍚庤鑰冭檻濡備綍淇濆瓨闈㈢浉浜ょ殑緇撴灉銆傜浉浜ょ殑璁$畻鍦ㄥ嚱鏁幫細 鏈緇堟槸璋冪敤IntTools_FaceFace鏉ヨ綆椾袱涓潰鐨勭浉浜ゃ傚茍灝嗚綆楃粨鏋滀氦綰垮拰浜ょ偣錛屾槸鍚﹂噸鍙犵瓑淇℃伅淇濆瓨鍒癇OPDS_InterfFF涓細 綾籅OPDS_FaceInfo鐢ㄦ潵瀛樺偍浠ヤ笅淇℃伅錛?/p>
娉ㄦ剰PBo31鍜孭BSc1錛屼竴涓姸鎬佹槸On錛屼竴涓姸鎬佹槸Section銆傚湪鐩鎬氦澶勭悊綾籅OPAlgo_PaveFiller涓氳繃鍑芥暟BOPAlgo_PaveFiller::UpdateFaceInfo灝嗚繖浜涚浉浜ょ殑鐘舵佹洿鏂般?/p>
浠庡墠闈㈢殑鏂囩珷鍏充簬媯嫻嬭竟涓庤竟銆佽竟涓庨潰鏄惁鏈夐噸鍙犳椂閲囩敤浜嗗浐瀹氶噰鏍風偣鏉ュ鐞嗙殑涓嶄弗璋ㄧ殑閫昏緫鏉ョ湅錛屽垽鏂嚎鐨勯噸鍙犳槸涓鏉傜殑闂錛屽垽鏂潰涓庨潰鐨勯噸鍙犲氨鐩稿鏇村鏉傘傛湰鏂囧厛浠庣畝鍗曞叆鎵嬶紝鍏堢湅瀵逛簬鏈綆鍗曠殑涓や釜騫抽潰閲嶅彔鐨勬嫻嬶紝寮曞嚭澶у瀵逛簬浠繪剰涓や釜闈㈤噸鍙犲尯鍩熸嫻嬬殑鎬濊冦傚榪欑鐗規畩鐨勬儏鍐靛鐞嗗湪IntTools_FaceFace涓殑鍑芥暟PerformPlanes()涓疄鐜般傚叾涓嬌鐢ㄤ簩嬈℃洸闈㈢殑鍑犱綍姹備氦娉曡繘琛屽鐞嗭紝婧愮爜濡備笅錛?/p>
閫氳繃婧愮爜鍙互鐪嬪嚭錛岃嫢涓や釜騫抽潰涔嬮棿鐨勬硶鍚戝す瑙掑皬浜嶵olAng鍙婅窛紱誨皬浜嶵ol鏃訛紝鍒欒涓轟袱涓潰鏄竴鏍風殑IntAna_Same錛涘綋璺濈澶т簬Tol鏃訛紝鍒欒涓烘病鏈夌浉浜ntAna_Empty銆?/p>
瀵逛簬閲嶅彔鐨勫鉤闈紝灝唗heTangentFaces璁劇疆鎴恡rue琛ㄧず鏄噸鍙犵殑銆傝繖閲岀暀涓嬩竴涓棶棰樺ぇ瀹舵濊冿細濡備綍鍒ゆ柇鑷敱鏇查潰鐨勯噸鍙犳儏鍐碉紵 褰撻潰涓婃湁瀛旀礊鏃訛紝榪樿瀵逛氦綰胯繘琛屽鐞嗭紝浠ユ帓闄ゆ帀瀛旀礊涓殑浜ょ嚎銆傚綋浣跨敤IntTools_FaceFace鏉ヨ綆椾袱涓潰鐨勪氦綰挎椂錛屽彲浠ョ湅鍒頒氦綰跨殑鑼冨洿涓嶆紜紝娌℃湁澶勭悊瀛旀礊鎯呭喌錛岀敋鑷充篃娌℃湁澶勭悊闈㈢殑杈圭晫銆傚涓嬪浘鎵紺虹孩鑹茬殑浜ょ嚎涓轟嬌鐢↖ntTools_FaceFace璁$畻寰楀埌鐨勶細 褰撲嬌鐢˙OPAlgo_PaveFiller璁$畻浜ょ嚎騫剁粨鍚圥aveBlock寰楀埌浜ょ嚎鏄劇ず濡備笅鍥炬墍紺猴細 铏界劧璁$畻涓や釜闈箣闂寸殑鐩鎬氦澶勭悊鏈緇堟槸璋冪敤鐨処ntTools_FaceFace錛屼絾鏄寰楀埌姝g‘鐨勪氦綰塊渶瑕佷嬌鐢ㄧ被BOPAlgo_PaveFiller銆傝繖閲屼篃鐣欎笅闂渚涘ぇ瀹舵濊冿細涓轟粈涔圛ntTools_FaceFace璁$畻鐨勪氦綰胯寖鍥翠笉姝g‘錛熶負浠涔圔OPAlgo_PaveFiller璁$畻鐨勪氦綰挎紜紵 緇間笂鎵榪幫紝甯冨皵鏁版嵁涓潰鐨勭浉浜ょ殑緇撴灉鍙兘鏈変氦綰匡紝涔熷彲鑳芥湁浜ょ偣銆傚皢姹備氦緇撴灉淇濆瓨鍒癋aceInfo涓備粠綆鍗曠殑涓や釜騫抽潰閲嶅彔鏉ョ湅錛屽皢閲嶅彔鐨勭姸鎬佺敤鍙橀噺theTangetFaces鏉ヤ繚瀛樸傞偅浠繪剰涓や釜鏇查潰閲嶅彔濡備綍鍒ゆ柇鍛紵闈㈢殑鐩鎬氦铏界劧鎻愪緵綾籌ntTools_FaceFace鏉ヨ綆楋紝浣嗘槸娌℃湁姝g‘澶勭悊浜ょ嚎鐨勮寖鍥達紝涓轟粈涔圔OPAlgo_PaveFiller涓彲浠ユ紜鐞嗕氦綰垮憿錛?/p>
紲濆ぇ瀹朵腑縐嬪浗搴嗚妭鏃ュ揩涔愶紒 鍦∣penCASCADE涓浜庤竟鐨勭浉浜ゅ垎涓轟笁綾伙細杈逛笌鐐癸紝杈逛笌杈癸紝杈逛笌闈紝杈逛笌鐐圭殑鐩鎬氦宸茬粡褰掔粨涓虹偣涓庤竟鐨勭浉浜ゅ鐞嗕簡錛岃竟鐨勭浉浜や富瑕佸鐞嗚竟涓庤竟錛岃竟涓庨潰鐨勭浉浜ゃ傝竟涓庤竟銆佽竟涓庨潰鐨勭浉浜や細寮曞叆涓涓柊鐨勬暟鎹粨鏋?鍏叡閮ㄥ垎Common Part錛岀敤浜庝繚瀛橀噸鍙犵殑鍏叡閮ㄥ垎鏁版嵁銆?/p>
瀵逛簬涓ゆ潯杈圭殑鐩鎬氦鏄寚鍦ㄤ袱鏉¤竟鐨勬煇浜涘湴鏂圭殑璺濈灝忎簬杈圭殑瀹瑰樊涔嬪拰錛屼富瑕佸垎涓轟袱縐嶆儏鍐碉紝涓縐嶆槸涓ゆ潯杈瑰彧鏈変竴涓氦鐐圭殑鎯呭喌錛涗竴縐嶆槸鏈夐噸鍙犻儴鍒嗙殑鎯呭喌錛涘厛鐪嬪彧鏈変竴涓氦鐐規儏鍐碉細 鎴戜滑鍦―RAW涓氳繃鑴氭湰鏋勯犳渶綆鍗曠殑鎯呭喌鏉ユ祴璇曘?/p>
鍦ㄥ鐞嗚竟涓庤竟鐩鎬氦鐨勫嚱鏁癇OPAlgo_PaveFiller::PerformEE()涓紝瀵規瘡涓ゆ潯杈硅皟鐢˙OPAlgo_EdgeEdge榪涜姹備氦銆備粠榪欓噷鍙互鐪嬪埌Pave Block鐨勪嬌鐢紝鐩稿綋浜庡姣忎袱鏉¤竟涓婄殑姣忓Pave Block閮ㄥ垎榪涜姹備氦銆傝繖閲屾湁涓浜涗紭鍖栫┖闂達紝鐩墠鏄嬌鐢ㄧ殑涓や釜寰幆澶勭悊錛屽彲浠ュ皾璇曚嬌鐢˙VH鏉ユ彁鍗囦竴浜涙ц兘銆傚綋姣忓Pave Block瀵瑰簲鐨勭偣鐨勭儲寮曞彿涓鑷存椂錛屽嵆姣忓Pave Block鐨勭鐐歸噸鍙犳椂錛屼嬌鐢ㄥ揩閫熻綆楃殑綆楁硶鏉ュ垽鏂槸鍚︽湁閲嶅彔銆?/p>
瀵逛簬杈圭殑姹備氦緇撴灉淇濆瓨鍒癇OPDS_InterfEE涓紝閮戒細淇濆瓨鏄摢涓ゆ潯杈圭浉浜ゅ強鐩鎬氦鐨勫叕鍏遍儴鍒嗐傚浜庣浉浜や簬涓鐐圭殑鍏叡閮ㄥ垎鐨勭被鍨嬩負TopAbs_VERTEX錛屽浜庢湁閲嶅彔閮ㄥ垎鐨勫叕鍏遍儴鍒嗙被鍨嬩負TopAbs_EDGE錛?/p>
褰撲袱杈規潯鏈夐噸鍙犻儴鍒嗘椂錛屽涓嬪浘鎵紺猴細 濡備綍媯嫻嬩袱鏉¤竟鐨勫叕鍏遍儴鍒嗗憿錛熷湪鍑芥暟IntTools_EdgeEdge::IsCoincident()涓疄鐜幫細 浠庝笂榪頒唬鐮佸彲浠ョ湅鍑猴紝瀵逛簬閲嶅彔閮ㄥ垎鐨勬嫻嬫槸灝嗕竴鏉¤竟鏍規嵁媯嫻嬭寖鍥村垎鎴?3孌甸噰鏍風偣錛岃綆楁瘡涓偣鍒板彟涓鏉¤竟鐨勮窛紱伙紝婊¤凍鏉′歡鐨勯噰鏍風偣鐨勬暟閲忚秴榪?2涓紝鍩烘湰璁や負鏄噸鍙犵殑銆備粠榪欓噷鍙互鐪嬪嚭榪欐牱媯嫻嬮噸鍙犵◢寰湁鐐逛笉涓ヨ皚銆傚浐瀹氶噰鏍風偣鏁伴噺瀵逛簬灝忔鏇茬嚎鏉ヨ鏁伴噺榪囧ぇ錛屽浜庡緢闀跨殑鏇茬嚎鏉ヨ鏁伴噺鍙堝亸灝忥紝榪欓噷鏈夊緟鎻愰珮銆傚鏋滈噸鍙狅紝鍒欏皢鍏叡閮ㄥ垎鐨勬暟鎹繚瀛樿搗鏉ワ細 瀵逛簬嫻嬭瘯鐨凾CL鑴氭湰涓嶄細璧拌繖涓氱敤鐨勫垽鏂祦紼嬶紝浼氱洿鎺ユ湁IntTools_EdgeEdge::ComputeLineLine()鍑芥暟鏉ュ鐞嗚繖縐嶇壒孌婃儏鍐碉細 浠庝繚瀛樼殑鏁版嵁鍙互鐪嬪嚭錛屽叕鍏遍儴鍒嗙殑鐩鎬氦綾誨瀷涓篢opAbs_VERTEX錛屽強浜ょ偣鍒嗗埆鍦ㄤ袱鏉¤竟涓婄殑鍙傛暟銆傚叧浜庢湁閲嶅彔閮ㄥ垎鐨勪袱鏉¤竟鐩鎬氦錛屽悓瀛︿滑鍙互鑷浣跨敤DRAW鑴氭湰鏉ユ祴璇曚竴涓嬨?/p>
杈逛笌闈㈢殑鐩鎬氦浼氶亣鍒板拰杈逛笌杈圭浉浜ょ被浼肩殑鎯呭喌錛屽嵆浼氭湁閲嶅彔閮ㄥ垎Common Part銆備篃鍒嗕負涓ょ鎯呭喌錛屼竴縐嶆儏鍐墊槸杈逛笌闈㈠彧鏈変竴涓氦鐐圭殑鎯呭喌錛屼氦鐐瑰彲鑳戒細鏈夊涓紱涓縐嶆儏鍐墊槸鏈夐噸鍙犻儴鍒嗙殑鎯呭喌銆?/p>
鎴戜滑鍙互鍦ㄤ嬌鐢ㄨ剼鏈潵嫻嬭瘯涓涓嬮噸鍙犵殑鎯呭喌錛?/p>
浠庝唬鐮佷腑鍙互鐪嬪嚭褰撹竟鐨勭鐐瑰湪闈笂鏃訛紝鍒欎細鍒ゆ柇杈逛笌闈細涓嶄細閲嶅彔Coincidence銆傚垽鏂昏緫涓庡垽鏂竟鏄惁閲嶅彔綾諱技錛岄兘鏄嬌鐢ㄥ浐瀹?3涓噰鏍風偣鐨勬柟寮忓鐞嗭紝騫跺姞涓婂畾浣嶅櫒鏉ュ垽鏂偣鏄惁鍦ㄩ潰涓婏紝鍥犱負闈笂鍙兘浼氭湁瀛旀礊錛?/p>
姹備氦緇撴灉涓庤竟涓庤竟鐩鎬氦綾誨瀷錛屼細淇濆瓨杈逛笌闈㈢殑绱㈠紩錛屽強鍏叡閮ㄥ垎鐨勬暟鎹傞櫎浜嗕繚瀛樿繖浜涙暟鎹互澶栵紝榪樺拰鐐逛笌闈㈢浉浜や竴鏍鳳紝鏇存柊闈笂鐨勪俊鎭疐aceInfo錛屽嵆鏈夊摢浜涜竟鍦ㄩ潰涓娿?/p>
緇間笂鎵榪幫紝杈逛笌杈廣佽竟涓庨潰鐩鎬氦浼氬緱鍒板叕鍏遍儴鍒咰ommon Part錛屽叕鍏遍儴鍒嗗彲鑳芥槸鐐癸紝涔熷彲鑳芥槸閲嶅彔鐨勮竟銆傚湪榪囨護鐩鎬氦鐨勮竟涓庤竟銆佽竟涓庨潰鏃墮兘鏈変竴瀹氱殑浼樺寲絀洪棿錛屽嵆浣跨敤BVH鏉ュ姞閫熸嫻嬬浉浜ら儴鍒嗐傚湪蹇熷垽鏂竟涓庤竟鏄惁閲嶅彔銆佽竟涓庨潰鏄惁閲嶅彔閮ㄥ垎鐨勪唬鐮侀噰鐢ㄥ浐瀹氭暟閲忕殑閲囨牱鐐圭殑澶勭悊鏂瑰紡涓嶅お涓ヨ皚銆傚皢鐩鎬氦鐨勭粨鏋滃強榪囩▼鏁版嵁閮戒繚瀛樺埌BOPDS_DS涓綔涓哄悗闈㈢畻娉曚嬌鐢ㄣ?/p>
ImGui 鏄竴涓敤浜嶤++鐨勭敤鎴風晫闈㈠簱錛岃法騫沖彴銆佹棤渚濊禆錛屾敮鎸丱penGL銆丏irectX絳夊縐嶆覆鏌揂PI錛屾槸涓縐嶅嵆鏃禪I錛圛mmediate Mode User Interface錛夊簱錛屼繚鐣欐ā寮忎笌鍗蟲椂妯″紡鐨勫尯鍒弬鑰?a target="_blank" rel="noopener">淇濈暀妯″紡涓庡嵆鏃舵ā寮?/strong>銆侷mGui娓叉煋闈炲父蹇紝浣嗙晫闈笂鏈夊ぇ閲忕殑鏁版嵁闆嗛渶瑕佹覆鏌撳彲鑳戒細鏈変竴浜涢棶棰橈紝闇瑕佷嬌鐢ㄤ竴浜涚紦瀛樻妧宸с傜紦瀛樺彧鏄伩鍏嶆暟鎹殑鏇存柊閫昏緫鑰楁椂澶箙褰卞搷娓叉煋錛屽疄闄呮覆鏌撹繃紼嬩笉瀛樺湪鐡墮銆?/p>
IMGUI寰堣交閲忥紝榪樻敮鎸佽法騫沖彴錛屽浜庡皬鐨勬祴璇曠▼搴廔MGUI鏄悊鎯崇殑GUI銆?/p>
鍩轟簬opencascade鐨刧lfw sample鍔犲叆IMGUI錛岃繖鏍峰氨鍙互寮鍙戜竴浜涘甫鏈塆UI鐨勭▼搴忋傝繖浜涚▼搴忓皬宸т笖鑳芥柟渚胯法騫沖彴錛岀湅涓婂幓鏁堟灉涔熶笉閿欍?/p>
鐜板湪灝哋cctImgui寮婧愶紝寮婧愬湴鍧錛歨ttps://github.com/eryar/OcctImgui 浣跨敤Premake鏉ョ敓鎴愯В鍐蟲柟妗堬紝鍙渶瑕佸皢premake5.lua涓殑鐩稿叧絎笁鏂瑰簱鐨勮礬寰勪慨鏀逛竴涓嬶紝鍗沖彲浠ョ洿鎺ョ紪璇戣繍琛屻?/p>
鐩墠occt鐨勮鍥句綔涓烘暣涓儗鏅紝涓嬩竴姝ュ彲浠ュ仛鎴愬儚CADRays涓偅鏍鳳紝灝唎cct鐨勮鍥句綔涓鴻鍥劇殑涓閮ㄥ垎錛岃繖鏍峰氨鍙互浣跨敤IMGUI鐨凞ocking鍔熻兘銆?/p>
浣跨敤IMGUI涔熷彲浠ュ紑鍙戝嚭寰圕ool鐨勭晫闈紝鏈鍚庢斁涓や釜鍩轟簬IMGUI寮鍙戠殑鍥懼艦鐣岄潰錛?/p>
https://github.com/adriengivry/Overload https://github.com/sasobadovinac/CADRays https://github.com/MeshInspector/MeshLib 鍦∣penCASCADE涓紝甯冨皵鐩稿叧鐨勭畻瀛怬perator鏈塆eneral Fuse Operator(GFA)錛孊oolean Operator(BOA)錛孲ection Operator(SA)錛孲plitter Operator(SPA)錛岃繖浜涘竷灝旂畻瀛愰兘鍏辯敤涓濂楁暟鎹粨鏋凚OPDS_DS錛屽叾涓瓨鍌ㄤ簡杈撳叆鏁版嵁鍙婁腑闂寸粨鏋滄暟鎹傚竷灝旂畻瀛愬寘鍚袱閮ㄥ垎錛?/p>
鐢辨鍙錛屽竷灝旀暟鎹瓸OPDS_DS鏄竷灝旀搷浣滀腑鐨勬暟鎹腑杞珯錛屽皢甯冨皵鎿嶄綔鐨勮緭鍏ユ暟鎹強涓棿璁$畻緇撴灉鏁版嵁閮戒繚瀛樿搗鏉ャ傛湰鏂囦富瑕佷粙緇岯OPDS_DS淇濆瓨鐨勬暟鎹?/p>
BOPDS_DS涓瓨鍌ㄧ殑淇℃伅鏈夛細 榪欓噷鐨凷hapes鏄ā鍨嬩俊鎭疊OPDS_ShapeInfo錛屽瓨鍌ㄦā鍨嬬被鍨嬶紝鍖呭洿鐩掔瓑鏁版嵁錛?/p>
榪欓噷搴旇涓嶉渶瑕佸啀鍙﹀淇濆瓨myType錛屽洜涓哄湪myShape涓彲浠ョ洿鎺ヨ幏鍙栫被鍨嬩俊鎭傛ā鍨嬩俊鎭湪鍒濆鍖栧嚱鏁癐nit()涓潵璁劇疆錛屼富瑕佹槸鍖呭洿鐩掔瓑淇℃伅錛?/p>
鍦ㄥ垵濮嬪寲鍑芥暟涓氳繃涓や釜閫掑綊鍑芥暟TotalShapes()鍜孖nitShape()鏉ユ敹闆嗘墍鏈夋ā鍨嬫暟鎹紝鐒跺悗鍐嶅垎鍒綆楃偣銆佽竟銆侀潰鐨勫寘鍥寸洅銆傝繖浜涘寘鍥寸洅鏁版嵁涓哄悗闈嬌鐢˙VH鐩鎬氦媯嫻嬪仛鍑嗗銆?/p>
鐩鎬氦鏁版嵁Interferences涓昏鐢ㄦ潵淇濆瓨姹備氦緇撴灉鏁版嵁錛屼嬌鐢ㄤ簡綆鍗曠殑媧劇敓鍏崇郴錛屼笉鍚岀殑鐩鎬氦綾誨瀷寰楀埌涓嶅悓鐨勭浉浜ょ粨鏋溿?/p>
淇濆瓨鐨勬暟鎹湁錛?/p>
鍏朵腑Index1鍜孖ndex2涓虹浉浜ょ殑涓や釜妯″瀷鍦˙OPDS_DS涓殑绱㈠紩鍙楓傚浜庣偣Vertex鍜岃竟Edge鐨勭浉浜ょ粨鏋滐紝淇濆瓨浜嗙浉浜ょ偣鍦ㄨ竟涓婄殑鍙傛暟myParam錛?/p>
鍦―RAW涓緭鍏ョ浉鍏崇殑鍛戒護鍙互鏂逛究鍦板榪欎簺鏁版嵁緇撴瀯榪涜Debug銆?/p>
浠庢簮鐮佸彲浠ョ湅鍑猴紝鍦ㄥ仛姹備氦鐨勫垵濮嬪嚱鏁頒腑鍑嗗浜嗕笁閮ㄥ垎鏁版嵁錛屼竴涓槸BOPDS_DS錛屼竴涓槸BOPDS_Iterator錛岃繕鏈変竴閮ㄥ垎鏄紦瀛樼殑姹備氦宸ュ叿鐨勬暟鎹甀ntTools_Context銆傚悗闈㈠皢緇撳悎DRAW浠g爜瀵笴++婧愮爜璋冭瘯錛屽垎鏋愬竷灝旀搷浣滀腑姹備氦鏁版嵁BOPDS_DS淇濆瓨鐨勫叿浣撴暟鎹?/p>
OpenCASCADE涓柊鐨勫竷灝斿伐鍏稵KBO鐩稿宸茬粡搴熷純鐨凾KBool浠g爜鏇磋鑼冿紝鏇存槗浜庣悊瑙c備笌ModelingData鍜孧odelingAlgorithms澶х殑妯″潡緇勭粐涓鏍鳳紝涓昏涔熸槸鏁版嵁緇撴瀯Data Structure+綆楁硶Algorithm鐨勭粍緇囧艦寮忋?/p>
鍏朵腑BOPDS涓哄竷灝斾腑鐨勬暟鎹粨鏋勯儴鍒嗭紝BOPAlgo涓哄竷灝斾腑鐨勭畻娉曢儴鍒嗐傜悊瑙g畻娉曠殑鍓嶆彁鏄厛鐞嗚В鏁版嵁緇撴瀯DS(Data Structure)錛屾墍浠ュ厛浠庢暟鎹粨鏋勫叆鎵嬶紝鏉ユ繁鍏ョ悊瑙e竷灝旀搷浣溿傛湰鏂囧厛浠庣畝鍗曠殑鏁版嵁緇撴瀯BOPDS_Iterator寮濮嬪婧愮爜榪涜鍒嗘瀽銆?/p>
浠庣被鐨勬敞閲婂彲浠ョ湅鍑猴紝榪唬鍣˙OPDS_Iterator鏈変互涓嬩袱涓姛鑳斤細 - 鎵懼嚭鍖呭洿鐩掔浉浜ょ殑Shape錛?/p>
- 閬嶅巻鐩鎬氦鐨勪竴瀵筍hape錛?/p>
鍏朵腑鏍稿績鐨勭畻娉曞湪鍑芥暟Intersect()涓紝浠g爜濡備笅鎵紺猴細 鍦ㄦ眰浜ゅ嚱鏁癐ntersect涓嬌鐢˙VH蹇熸壘鍑哄寘鍥寸洅鏈夌浉浜ょ殑姣忓Shape錛屽茍浠ョ儲寮曠殑褰㈠紡璁板綍涓嬫潵銆備粠榪欎釜鍑芥暟涓彲浠ョ湅鍑哄竷灝旀搷浣滄槸鍚︿嬌鐢∣BB鐨勯夐」鐨勪綔鐢細褰撲笉浣跨敤OBB鏃訛紝鍙互AABB鍖呭洿鐩掓潵媯嫻嬬浉浜ょ殑Shape錛涘綋浣跨敤OBB鏃訛紝鍦ˋABB鐨勫熀紜涓婅繘涓姝ヤ嬌鐢ㄥ寘鍥存洿绱у瘑鐨凮BB鏉ユ嫻嬬浉浜わ紝鍙互鎺掗櫎閮ㄥ垎銆傚綋鐩鎬氦鐨勬ā鍨嬩腑浠ABB媯嫻嬪氨鑳芥嫻嬪嚭鏉ョ殑錛屽啀鎵撳紑OBB閫夐」錛屼笉浼氭彁楂樻ц兘錛屽弽鑰屼細鏈夋墍闄嶄綆銆備負浜嗗噺灝戣繖涓獎鍝嶏紝鍦↖ntTools_Context涓紦瀛楥aching榪欎簺OBB錛岄伩鍏嶆瀯閫燨BB甯︽潵鐨勬ц兘鎹熷け銆?/p>
甯冨皵榪唬鍣˙OPDS_Iterator閫氳繃BVH鎵懼嚭姹備氦鐨勬ā鍨嬩腑姣忓鍖呭洿鐩掓湁鐩鎬氦鐨勬ā鍨嬪茍鎻愪緵閬嶅巻姣忓鍖呭洿鐩掔浉浜ょ殑妯″瀷鐨勫姛鑳斤紝涓哄悗闈㈡眰浜や綔鍑嗗銆備粠鍏朵唬鐮佸疄鐜板彲浠ョ湅鍑哄竷灝旈夐」浣跨敤OBB瀵規ц兘鎻愰珮鏄湁闄愮殑錛屽綋浣跨敤AABB鑳芥嫻嬪嚭鏉ョ殑錛屽啀浣跨敤OBB浼氶檷浣庢ц兘銆傚綋浣跨敤AABB媯嫻嬪嚭鏉ョ浉浜わ紝浣哋BB涓嶇浉浜ょ殑鍦烘櫙瀵規ц兘鎻愬崌鏄庢樉銆?/p>
浠婃棩鏄?#8220;涔濅竴鍏簨鍙?#8221;92鍛ㄥ勾錛岃惤鍚庡氨瑕佹尐鎵擄紝鍚捐緢浠嶉渶鍔姏銆?/p> 緇忓父鐢╒isual Studio鍐欎竴浜涘皬紼嬪簭鏉ラ獙璇丱penCASCADE鐨勫姛鑳斤紝姣忔鍒涘緩欏圭洰鍚庨兘閰嶇疆澶存枃浠訛紝搴撹礬寰勶紝紼嬪簭榪愯鏃惰繕瑕侀厤緗瓺ebug鐨勭幆澧冨彉閲忥紝姣旇緝楹葷儲銆備篃灝濊瘯榪嘋Make鍜孮Make錛岄兘涓嶅お鐞嗘兂銆侰Make瀛︿範鏇茬嚎闄″抄涓鐐癸紝榪樹細鐢熸垚涓鍫嗘枃浠躲俀Make綆鍗曚簺錛屼絾鏄湁鐨勯夐」涓嶆敮鎸併傜洿鍒扮湅鍒頒竴涓紑婧愮殑娓告垙紼嬪簭Overload錛岀湅鍏剁紪璇戣鏄庝嬌鐢ㄤ簡Premake鏉ユ瀯寤恒?/p>
浣跨敤IMGUI鐢熸垚鐨勮蔣浠剁晫闈㈡瘮杈冮叿鐐紝浣跨敤Premake鐢熸垚Visual Studio瑙e喅鏂規銆?/p>
鏋勫緩緋葷粺錛圔uildSystem錛夋槸鐢ㄦ潵浠庢簮鐮佺敓鎴愮敤鎴峰彲浠ヤ嬌鐢ㄧ殑鐩爣錛圱argets錛夌殑鑷姩鍖栧伐鍏楓傜洰鏍囧彲浠ュ寘鎷簱錛屽彲鎵ц鏂囦歡錛屾垨鑰呯敓鎴愮殑鑴氭湰絳夌瓑銆?/p>
欏圭洰妯″潡渚濊禆鍏崇郴緇存姢 錛?/p>
鐩爣鐨勫彲閰嶇疆鍖栵紙涓嶅悓緋葷粺錛歐indows錛孧ac…錛涗笉鍚屽鉤鍙幫細Win32錛學in64錛孉md64…錛?/p>
鐩爣鐢熸垚鐨勮嚜鍔ㄥ寲 涓昏鐢ㄤ簬鎻愰珮寮鍙戜漢鍛樼殑鏁堢巼涓庣ǔ瀹氾紝嫻嬭瘯涓庡彂甯冪殑鏁堢巼 -鍑忓皯寮鍙戜漢鍛樼殑鐭ヨ瘑鎴愭湰錛堟瘮濡傚鍚屼竴嫻佺▼錛屼絾澶氱騫沖彴錛屽縐嶅紑鍙戠幆澧冨樊寮傚寲鐨勪簡瑙o級 -鍑忓皯欏圭洰欏圭洰鍙樺姩鐨勭淮鎶ゆ垚鏈?/p>
– VisualStudio 鐨勭紪璇戦夐」瑙勫垯錛岄厤緗柟娉?/p>
– Xcode 鐨勭紪璇戦夐」瑙勫垯錛岄厤緗柟娉?/p>
– 鍏朵粬銆傘傘?/p>
-鍑忓皯妯″潡鐨勭淮鎶ゆ垚鏈?/p>
– 鍗忓悓浜哄憳瀵瑰伐紼嬫枃浠訛紝鐩綍鐨勪慨鏀瑰啿紿?/p>
鍑忓皯騫沖彴錛岀郴緇熺敓鎴愮殑宸紓鍖栨垚鏈紙鍙互綆媧佸湴閰嶇疆涓嶅悓鐨勫鉤鍙頒笌緋葷粺錛?/p>
– 閫氳繃綆鍗曠殑閰嶇疆錛屽彲浠ョ伒媧伙紝蹇熷湴娣誨姞錛屼慨鏀癸紝鏇存柊妯″潡 – 鍙互鏂逛究鐨勫鐞嗕緷璧栧叧緋伙紝鎻愰珮紼沖畾鎬у拰緙栬瘧閫熷害 浣跨敤鑴氭湰鍜岄厤緗枃浠訛紝瀹炵幇鑷姩娓呯悊錛岀敓鎴愭墍闇騫沖彴錛岀郴緇燂紝璋冭瘯鐜錛屾祴璇曟祦紼嬶紝鐒跺悗鍙戝竷鐗堟湰銆?/p>
鎬葷殑鏉ヨ錛屽氨鏄嬌鐢熸垚榪囩▼鏇村姞綆媧侊紝鐏墊椿錛岄珮鏁堬紝鑷姩鍖栥?/p>
涓繪祦鐨勫彲浠ヨ法騫沖彴錛屾敮鎸丆++鐨勬瀯寤虹郴緇?/p>
- CMake - Scons - Premake 鍏朵粬榪樻湁 GNU Make錛孏NU autotools錛孉pache Ant錛堜富瑕佺敤浜嶫ava錛夛紝Gradle錛堜富瑕佺敤浜嶫ava錛?/p>
Premake 鏄竴縐嶅懡浠ゅ伐鍏鳳紝閫氳繃璇誨彇欏圭洰鑴氭湰錛屾潵鐢熸垚鍚勭寮鍙戠幆澧冪殑欏圭洰鏂囦歡銆備富瑕佺敤浜庯細 鐢熸垚寮鍙戜漢鍛樺枩嬈㈢殑騫沖彴錛屽伐鍏烽泦錛堝崗鍚屽紑鍙戠殑浜哄憳錛屽彲浠ヤ嬌鐢ㄤ笉鍚岀殑騫沖彴鍜屽紑鍙戝伐鍏鳳級 閫氳繃鑴氭湰淇濇寔涓嶅悓騫沖彴錛屽伐鍏烽泦涓嬬殑欏圭洰閰嶇疆鍚屾錛堟瘮濡傛柊寤烘枃浠跺す錛屽紩鍏ユ柊鐨勫簱鏂囦歡錛?/p>
閫氳繃鑴氭湰鏉ュ揩閫熸洿鏂拌澶氫笉鍚岀殑澶у瀷浠g爜搴擄紝騫墮噸鏂扮敓鎴愰」鐩紙姣斿瀵逛緷璧栫殑澶氱钁楀悕搴撶殑鐗堟湰鏇存柊錛?/p>
蹇熷崌綰у伐鍏烽泦鐨勭増鏈紙姣斿鏃犵紳鍦頒粠VisualStudio 2010鍗囩駭鍒癡isualStudio 2019錛?/p>
鐩墠鏀寔錛?/p>
Microsoft Visual Studio 2005-2019 GNU Make錛屽寘鎷?Cygwin 鍜?MinGW XCode Codelite Premake 5.0 鐩墠鏀寔錛?/p>
32 鍜?64 浣嶅鉤鍙?/p>
Xbox 360錛堜粎鏀寔Visual Studio錛?/p>
鎻掍歡妯″潡鍙互鏀寔鍏朵粬璇█錛屾鏋訛紝鍜屽伐鍏烽泦 Premake 鏄瓨綺圭殑鏃х増C搴旂敤紼嬪簭錛屽彂甯冧負涓涓崟涓殑錛岄潪甯稿皬鐨別xe鏂囦歡銆傛敮鎸佸畬鏁寸殑Lua鑴氭湰鐜 寮婧愬湴鍧錛歨ttps://github.com/premake/premake-core 涓嬭澆鍦板潃錛歨ttps://premake.github.io/ 瀹炰緥鍦板潃錛?a >https://github.com/wuguyannian/tutorial_premake 浣跨敤premake鏉ユ瀯寤轟竴涓嬌鐢ㄤ簡glfw, occt鍜宨mgui鐨勭▼搴忋備粠閰嶇疆鏂囦歡鍙互鐪嬪嚭錛岄厤緗瘮CMake瑕佺畝鍗曪細 閫氳繃premake鐢熸垚鐨刅isual Studio瑙e喅鏂規寰堝共鍑錛屾病鏈夊浣欑殑鏂囦歡銆傚悗闈㈠啀瑕佸啓涓涓皬鐨勯獙璇佺▼搴忔椂錛屽彧闇瑕佸鍒秔remake5.lua淇敼涓涓嬪嵆鍙紝寰堟柟渚褲傚浜庡皬鐨勯獙璇佺▼搴忔潵璇達紝浣跨敤premake鏄悊鎯崇殑鏋勫緩宸ュ叿銆?/p>
1 Introduction
2 Outline Builder
3 Contap_ContAna
4 Conclusion
1 Introduction
2 HLR
3 杈圭殑鍒嗙被
]]>1 Introduction
2 浜屾鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜?/h2>
3 浜屾鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜?/h2>
4 鑷敱鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜?/h2>
5 鑷敱鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜?/h2>
6 姹備氦緇撴灉
7 Conclusion
]]>1 Introduction
2 姹備氦鍒嗙被
3 鑷氦璁$畻
4 姹備氦緇撴灉
5 Conclusion
]]>1 Introduction
2 瀹炵幇鍘熺悊
3 娉ㄦ剰浜嬮」
]]>1 Introduction
2 Self-Intersection
3 Test
1 Introduction
2 杈呭姪鍑芥暟
3 嫻嬭瘯
4 Conclusion
]]>
]]>1 Introduction
2 Sweep with Guide
3 Sweep on Face
4 Conclusion
]]>1 Introduction
2 Face Info
3 Tangent Face
4 Hole
5 Conclusion
]]>1 Introduction
2 Edge/Edge Interferences
//=======================================================================
//function : IsCoincident
//purpose :
//=======================================================================
Standard_Boolean IntTools_EdgeEdge::IsCoincident()
{
Standard_Integer i, iCnt, aNbSeg, aNbP2;
Standard_Real dT, aT1, aCoeff, aTresh, aD;
Standard_Real aT11, aT12, aT21, aT22;
GeomAPI_ProjectPointOnCurve aProjPC;
gp_Pnt aP1;
//
aTresh=0.5;
aNbSeg=23;
myRange1.Range(aT11, aT12);
myRange2.Range(aT21, aT22);
//
aProjPC.Init(myGeom2, aT21, aT22);
//
dT=(aT12-aT11)/aNbSeg;
//
iCnt=0;
for(i=0; i <= aNbSeg; ++i) {
aT1 = aT11+i*dT;
myGeom1->D0(aT1, aP1);
//
aProjPC.Perform(aP1);
aNbP2=aProjPC.NbPoints();
if (!aNbP2) {
continue;
}
//
aD=aProjPC.LowerDistance();
if(aD < myTol) {
++iCnt;
}
}
//
aCoeff=(Standard_Real)iCnt/((Standard_Real)aNbSeg+1);
return aCoeff > aTresh;
}
3 Edge/Face Interferences
//=======================================================================
//function : IsCoincident
//purpose :
//=======================================================================
Standard_Boolean IntTools_EdgeFace::IsCoincident()
{
Standard_Integer i, iCnt;
Standard_Real dT, aT, aD, aT1, aT2, aU, aV;
gp_Pnt aP;
TopAbs_State aState;
gp_Pnt2d aP2d;
//
GeomAPI_ProjectPointOnSurf& aProjector=myContext->ProjPS(myFace);
Standard_Integer aNbSeg=23;
if (myC.GetType() == GeomAbs_Line &&
myS.GetType() == GeomAbs_Plane)
aNbSeg = 2; // Check only three points for Line/Plane intersection
const Standard_Real aTresh = 0.5;
const Standard_Integer aTreshIdxF = RealToInt((aNbSeg+1)*0.25),
aTreshIdxL = RealToInt((aNbSeg+1)*0.75);
const Handle(Geom_Surface) aSurf = BRep_Tool::Surface(myFace);
aT1=myRange.First();
aT2=myRange.Last();
Standard_Real aBndShift = 0.01 * (aT2 - aT1);
//Shifting first and last curve points in order to avoid projection
//on surface boundary and rejection projection point with minimal distance
aT1 += aBndShift;
aT2 -= aBndShift;
dT=(aT2-aT1)/aNbSeg;
//
Standard_Boolean isClassified = Standard_False;
iCnt=0;
for(i=0; i <= aNbSeg; ++i) {
aT = aT1+i*dT;
aP=myC.Value(aT);
//
aProjector.Perform(aP);
if (!aProjector.IsDone()) {
continue;
}
//
aD=aProjector.LowerDistance();
if (aD > myCriteria) {
if (aD > 100. * myCriteria)
return Standard_False;
else
continue;
}
//
++iCnt;
//We classify only three points: in the begin, in the
//end and in the middle of the edge.
//However, exact middle point (when i == (aNbSeg + 1)/2)
//can be unprojectable. Therefore, it will not be able to
//be classified. Therefore, points with indexes in
//[aTreshIdxF, aTreshIdxL] range are made available
//for classification.
//isClassified == TRUE if MIDDLE point has been chosen and
//classified correctly.
if(((0 < i) && (i < aTreshIdxF)) || ((aTreshIdxL < i ) && (i < aNbSeg)))
continue;
if(isClassified && (i != aNbSeg))
continue;
aProjector.LowerDistanceParameters(aU, aV);
aP2d.SetX(aU);
aP2d.SetY(aV);
IntTools_FClass2d& aClass2d=myContext->FClass2d(myFace);
aState = aClass2d.Perform(aP2d);
if(aState == TopAbs_OUT)
return Standard_False;
if(i != 0)
isClassified = Standard_True;
}
//
const Standard_Real aCoeff=(Standard_Real)iCnt/((Standard_Real)aNbSeg+1);
return (aCoeff > aTresh);
}
4 Conclusion
1 IMGUI
2 OcctImgui
3 Next
]]>1 Introduction
2 BOPDS_DS
//=======================================================================
//function : Init
//purpose :
//=======================================================================
void BOPDS_DS::Init(const Standard_Real theFuzz)
{
Standard_Integer i1, i2, j, aI, aNb, aNbS, aNbE, aNbSx;
Standard_Integer n1, n2, n3, nV, nW, nE, aNbF;
Standard_Real aTol, aTolAdd;
TopAbs_ShapeEnum aTS;
TopoDS_Iterator aItS;
TColStd_ListIteratorOfListOfInteger aIt1, aIt2, aIt3;
TopTools_ListIteratorOfListOfShape aIt;
BOPDS_IndexRange aR;
Handle(NCollection_BaseAllocator) aAllocator;
TopTools_MapOfShape aMS;
//
// 1 Append Source Shapes
aNb=myArguments.Extent();
if (!aNb) {
return;
}
//
myRanges.SetIncrement(aNb);
//
aNbS=0;
aIt.Initialize(myArguments);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aSx=aIt.Value();
//
aNbSx=0;
TotalShapes(aSx, aNbSx, aMS);
//
aNbS=aNbS+aNbSx;
}
aMS.Clear();
//
myLines.SetIncrement(2*aNbS);
//-----------------------------------------------------scope_1 f
aAllocator=
NCollection_BaseAllocator::CommonBaseAllocator();
//
//
i1=0;
i2=0;
aIt.Initialize(myArguments);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aS=aIt.Value();
if (myMapShapeIndex.IsBound(aS)) {
continue;
}
aI=Append(aS);
//
InitShape(aI, aS);
//
i2=NbShapes()-1;
aR.SetIndices(i1, i2);
myRanges.Append(aR);
i1=i2+1;
}
//
aTolAdd = Max(theFuzz, Precision::Confusion()) * 0.5;
myNbSourceShapes = NbShapes();
//
// 2 Bounding Boxes
//
// 2.1 Vertex
for (j=0; j<myNbSourceShapes; ++j) {
BOPDS_ShapeInfo& aSI=ChangeShapeInfo(j);
//
const TopoDS_Shape& aS=aSI.Shape();
//
aTS=aSI.ShapeType();
//
if (aTS==TopAbs_VERTEX) {
Bnd_Box& aBox=aSI.ChangeBox();
const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&aS);
const gp_Pnt& aP=BRep_Tool::Pnt(aV);
aTol = BRep_Tool::Tolerance(aV);
aBox.SetGap(aTol + aTolAdd);
aBox.Add(aP);
}
}
3 Interferences
4 DRAW
]]>1 Introduction
2 BOPDS_Iterator
//! The class BOPDS_Iterator is
//! 1.to compute intersections between BRep sub-shapes
//! of arguments of an operation (see the class BOPDS_DS)
//! in terms of theirs bounding boxes
//! 2.provides interface to iterate the pairs of
//! intersected sub-shapes of given type
class BOPDS_Iterator
{
public:
//=======================================================================
// function: Intersect
// purpose:
//=======================================================================
void BOPDS_Iterator::Intersect(const Handle(IntTools_Context)& theCtx,
const Standard_Boolean theCheckOBB,
const Standard_Real theFuzzyValue)
{
const Standard_Integer aNb = myDS->NbSourceShapes();
// Prepare BVH
BOPTools_BoxTree aBoxTree;
aBoxTree.SetSize (aNb);
for (Standard_Integer i = 0; i < aNb; ++i)
{
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(i);
if (!aSI.HasBRep())
continue;
const Bnd_Box& aBox = aSI.Box();
aBoxTree.Add (i, Bnd_Tools::Bnd2BVH (aBox));
}
// Build BVH
aBoxTree.Build();
// Select pairs of shapes with interfering bounding boxes
BOPTools_BoxPairSelector aPairSelector;
aPairSelector.SetBVHSets (&aBoxTree, &aBoxTree);
aPairSelector.SetSame (Standard_True);
aPairSelector.Select();
aPairSelector.Sort();
// Treat the selected pairs
const std::vector<BOPTools_BoxPairSelector::PairIDs>& aPairs = aPairSelector.Pairs();
const Standard_Integer aNbPairs = static_cast<Standard_Integer> (aPairs.size());
Standard_Integer iPair = 0;
const Standard_Integer aNbR = myDS->NbRanges();
for (Standard_Integer iR = 0; iR < aNbR; ++iR)
{
const BOPDS_IndexRange& aRange = myDS->Range(iR);
for (; iPair < aNbPairs; ++iPair)
{
const BOPTools_BoxPairSelector::PairIDs& aPair = aPairs[iPair];
if (!aRange.Contains (aPair.ID1))
// Go to the next range
break;
if (aRange.Contains (aPair.ID2))
// Go to the next pair
continue;
const BOPDS_ShapeInfo& aSI1 = myDS->ShapeInfo (aPair.ID1);
const BOPDS_ShapeInfo& aSI2 = myDS->ShapeInfo (aPair.ID2);
const TopAbs_ShapeEnum aType1 = aSI1.ShapeType();
const TopAbs_ShapeEnum aType2 = aSI2.ShapeType();
Standard_Integer iType1 = BOPDS_Tools::TypeToInteger (aType1);
Standard_Integer iType2 = BOPDS_Tools::TypeToInteger (aType2);
// avoid interfering of the shape with its sub-shapes
if (((iType1 < iType2) && aSI1.HasSubShape (aPair.ID2)) ||
((iType1 > iType2) && aSI2.HasSubShape (aPair.ID1)))
continue;
if (theCheckOBB)
{
// Check intersection of Oriented bounding boxes of the shapes
const Bnd_OBB& anOBB1 = theCtx->OBB (aSI1.Shape(), theFuzzyValue);
const Bnd_OBB& anOBB2 = theCtx->OBB (aSI2.Shape(), theFuzzyValue);
if (anOBB1.IsOut (anOBB2))
continue;
}
Standard_Integer iX = BOPDS_Tools::TypeToInteger (aType1, aType2);
myLists(iX).Append (BOPDS_Pair (Min (aPair.ID1, aPair.ID2),
Max (aPair.ID1, aPair.ID2)));
}
}
}
3 Conclusion
1 浠涔堟槸鏋勫緩緋葷粺
2 涓轟粈涔堜嬌鐢ㄦ瀯寤虹郴緇?/h2>
3 甯歌鐨勬瀯寤虹郴緇?/h2>
4 浠涔堟槸Premake
5 浣跨敤Premake
workspace "OcctImgui"
configurations {"Debug", "Release"}
system "Windows"
platforms {"Win64"}
architecture "X64"
language "C++"
project "OcctImgui"
kind "ConsoleApp"
language "C++"
targetdir "build/bin/%{cfg.buildcfg}"
objdir "build/obj/%{cfg.buildcfg}"
files { "**.h", "**.cpp"}
-- Header files.
includedirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/inc",
"C:/glfw-3.3.8/include"
}
-- Library files.
links
{
"TKernel", "TKMath", "TKG2d", "TKG3d", "TKGeomBase", "TKGeomAlgo", "TKBRep", "TKTopAlgo", "TKPrim", "TKMesh", "TKService", "TKOpenGl", "TKV3d",
"glfw3"
}
filter "configurations:Debug"
defines { "DEBUG" }
symbols "On"
libdirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/libd",
"C:/glfw-3.3.8/lib"
}
debugenvs
{
"path=%path%;C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/bind"
}
filter "configurations:Release"
defines { "NDEBUG" }
symbols "Off"
optimize "On"
libdirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/lib",
"C:/glfw-3.3.8/lib"
}
debugenvs
{
"path=%path%;C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/bin"
}
]]>