锘??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綆楁硶鐨勮緭鍏ヤ富瑕佷負(fù)杈瑰拰闈紝璁$畻閬尅鍏崇郴渚濊禆綰塊潰姹備氦綆楁硶銆傚浜庣簿紜殑HLR綆楁硶渚濊禆綺劇‘鐨勭嚎闈㈡眰浜ょ畻娉曪紝PolyAlgo綆楁硶渚濊禆澶氭綰夸笌緗戞牸姹備氦綆楁硶銆傝緭鍏ョ殑杈逛腑闄や簡BREP涓殑杈逛互澶栵紝榪樻湁涓綾繪槸鏍規(guī)嵁鎶曞獎鏂瑰悜璁$畻寰楁潵鐨勶紝鍗沖杞粨綰縊utline錛屼篃縐頒負(fù)Contour綰褲侫CIS鐨凱HLR涓О杞粨綰縎ihouette Edge銆?/p>
杞粨綰跨殑璁$畻鏄疕LR涓瘮杈冨叧閿殑涓姝ワ紝鏈枃浠penCASCADE涓畝鍗曠殑浜屾鏇查潰鐨勮疆寤撶嚎璁$畻鍏ユ墜鏉ョ悊瑙f洸闈㈢殑杞粨綰挎蹇碉紝涓虹悊瑙d換鎰忔洸闈㈣疆寤撶嚎璁$畻鎵撲笅鍩虹銆?/p>
OpenCASCADE鐨凥LR涓嬌鐢ㄧ被HLRTopoBRep_OutLiner鏉ヨ綆楀杞粨綰褲傝疆寤撶嚎鐨勮綆椾緷璧栨姇褰辨柟鍚戝強鎶曞獎鏂瑰紡錛屼富瑕佽綆楅昏緫鍦ㄥ嚱鏁癋ill()涓細(xì) 鎶曞獎鏂瑰紡涓昏鍒嗕負(fù)閫忚鎶曞獎Perspective鍜屽鉤琛屾姇褰憋紝宸ョ▼鍥劇敓鎴愪竴鑸嬌鐢ㄥ鉤琛屾姇褰辨柟寮忋傚疄闄呰綆楃被鏄疌ontap_Contour錛屽湪綾籆ontap_Contour涓張鏍規(guī)嵁鎶曞獎鏇查潰綾誨瀷鍒嗕負(fù)涓ょ綾誨瀷鏉ュ鐞嗭細(xì) 鍏朵腑鍑芥暟PerformAna()涓鴻綆楀鉤闈€佺悆闈€佸渾鏌遍潰銆佸渾閿ラ潰鐨勫杞粨綰匡紝鏈緇堜細(xì)浣跨敤綾籆ontap_ContAna銆傚叾涓瑼na涓篈nalytical瑙f瀽鏇查潰鐨勬剰鎬濓紝榪欓噷鎸囪兘鐢ㄨВ鏋愯〃杈懼紡琛ㄧず鐨勪簩嬈℃洸闈€?/p>
綾籆ontap_ContAna鑳借綆楃悆闈€佸渾鏌遍潰鍜屽渾閿ラ潰鐨勫杞粨綰緾ontour錛屼笅闈㈡垜浠富瑕佹潵鐪嬬湅榪欎笁綾婚潰鐨勫杞粨綰胯綆楃粨鏋溿?/p>
瀵逛簬騫寵鎶曞獎鐞冮潰浼?xì)鐢熸垚浠ユ姇濯勬柟鍚戜负娉曞悜锛屼互鐞冨崐寰勪负鍗婂緞鐨勪竴涓渾錛屼唬鐮佸涓嬫墍紺猴細(xì) 濡備笅鍥炬墍紺轟腑鐨勭豢鑹茬殑綰匡細(xì) 瀵逛簬騫寵鎶曞獎鍦嗘煴闈細(xì)鐢熸垚涓ゆ潯鐩寸嚎錛岃嫢鎶曞獎鏂瑰悜涓庡渾鏌遍潰娉曞悜騫寵鏃朵笉鐢熸垚杞粨綰匡紝榪欐椂灝辨槸浣跨敤鍦嗘煴浣撲腑鐨勪笂涓嬩袱涓渾鐨勮竟銆備唬鐮佸涓嬫墍紺猴細(xì) 鐢熸垚鐨勪袱鏉$洿綰挎柟鍚戜負(fù)鍦嗘煴闈㈢殑杞存柟鍚戯細(xì) 鍦嗛敟闈㈢殑杞粨綰跨敓鎴愬嚱鏁伴昏緫綾諱技錛岀暀緇欒鑰呰嚜琛屽垎鏋愮悊瑙c?/p>
緇間笂鎵榪幫紝BREP鐨凥LR綆楁硶闇瑕佽綆楁ā鍨嬬殑澶栬疆寤撶嚎銆傚鐞冧綋鐨凚REP杈規(guī)湁涓や釜閫鍖栬竟錛堟瀬鐐癸級錛屽強涓や釜閲嶅悎杈癸紝鑻ユ潵鎶曞獎瀹炶川涓婂彧鏈夐噸鍚堣竟涓殑涓鏉¤竟鏈夌敤錛岃岃繖涓竟榪樻槸涓崐鍦嗐備粠鐞嗚В 綆鍗曠殑浜屾鏇查潰澶栬疆寤撶嚎璁$畻鍑芥暟鍏ユ墜錛屽啀鍘繪繁鍏ョ悊瑙d換鎰忔洸闈㈢殑澶栬疆寤撶嚎璁$畻鏂規(guī)硶銆?/p>
鐞嗚ВHLR瀹炵幇鍘熺悊錛屽彲浠ラ噸鏋凥LR浠g爜錛屼篃鍙互瀹屽叏鑷繁鍔ㄦ墜錛屽紑鍙戝嚭婊¤凍瀹為檯闇姹傜殑鑷姩鍑哄浘紼嬪簭錛岃嚜鍔ㄥ嚭鍥炬槸宸ョ▼綾昏璁¤蔣浠朵腑鐩稿鏍稿績鐨勫姛鑳斤紝鐩墠鍥藉唴鍩轟簬PDMS鍋氳嚜鍔ㄥ嚭鍥劇浉鍏寵蔣浠跺紑鍙戠殑灝辨湁寰堝瀹躲傛湰鐫寮鏀劇殑蹇冩佸垎浜繖浜涚浉瀵規(guī)瘮杈冨叧閿姛鑳界殑鍘熺悊錛岃鍥藉唴榪欎簺浜у搧鑳芥憜鑴卞熀浜嶢utoCAD/BricsCAD寮鍙戞帴鍙f垨PDMS Draft鐨勯檺鍒訛紝寮鍙戝嚭鏇村ソ鐢ㄣ佹洿鑷敱鐏墊椿鐨勮蔣浠躲?/p> 鐢ㄨ綆楁満鐢熸垚涓夌淮鐗╀綋鐨勭湡瀹炲浘褰紝鏄綆楁満鍥懼艦瀛︾爺絀剁殑閲嶈鍐呭銆傜湡瀹炲浘褰㈠湪浠跨湡妯℃嫙銆佸嚑浣曢犲瀷銆佸箍鍛婂獎瑙嗗拰縐戝璁$畻鍙鍖栫瓑璁稿棰嗗煙閮芥湁鐫騫挎硾搴旂敤銆傚湪鐢ㄦ樉紺鴻澶囨弿榪扮墿浣撶殑鍥懼艦鏃訛紝蹇呴』鎶婁笁緇翠俊鎭粡榪囨煇縐嶆姇褰卞彉鎹㈠湪浜岀淮鐨勬樉紺哄鉤闈笂緇樺埗鍑烘潵銆備粠涓夌淮鎶曞獎鍒頒簩緇寸殑闄嶇淮鎿嶄綔錛屼細(xì)瀵艱嚧鍥懼艦鐨勪簩涔夋с傝娑堥櫎榪欑被浜屼箟鎬э紝灝卞繀欏誨湪緇樺埗鏃舵秷闄よ閬尅鐨勪笉鍙鐨勭嚎鎴栭潰錛屼範(fàn)鎯笂縐頒箣涓烘秷闄ら殣钘忕嚎Hidden Line Removal鍜岄殣钘忛潰Hidden Face Removal銆?/p>
榪欐槸娓叉煋鏄劇ず涓婂娑堥殣鐨勯渶姹傦紝鍦ㄦ牴鎹笁緇存ā鍨嬭嚜鍔ㄧ敓鎴愬伐紼嬪浘鐨勫伐紼嬭璁¤蔣浠朵腑錛屽娑堥殣鐨勯渶姹傛湁鎵涓嶅悓銆?/p>
宸ョ▼璁捐杞歡涓庢満姊拌璁¤蔣浠朵笉鍚岋紝宸ョ▼璁捐杞歡涓嬈″嚭鍥炬秷闅愮殑妯″瀷閲忓ぇ錛屽鍑哄浘鐨勭畻娉曡姹備富瑕佹湁錛?/p>
鍏跺疄鏈鍚庢葷粨鎴愪竴鍙ヨ瘽灝辨槸涓閿牴鎹ā鍨嬬敓鎴愯兘浜や粯鐨勫浘綰搞傝櫧鐒剁幇鍦ㄦ妧鏈笂鍏峰涓夌淮妯″瀷涓嬭濺闂寸殑鑳藉姏錛屼絾鏄洰鍓嶄簩緇村浘綰鎬緷鐒舵槸璁捐浜や粯銆佸姞宸ュ埗閫犱富瑕佷緷鎹傚伐紼嬬被璁捐杞歡涓昏鐨勫姛鑳藉氨鏄揩閫熷緩妯★紝紕版挒媯嫻嬪拰鑷姩鍥劇焊鐢熸垚銆傚綋妯″瀷閲忓ぇ鏃訛紝娑堥殣閫熷害蹇強鑷姩鐢熸垚鐨勬爣娉ㄦ枃瀛楁帓鍒楁暣榻愶紙鎴栨弧瓚沖伐紼嬩範(fàn)鎯級鎴愪簡浜岀淮鍥劇焊鑷姩鐢熸垚鐨勬牳蹇冩妧鏈紝涔熸槸紼嬪簭澶勭悊涓殑闅劇偣銆?/p>
鍑犱綍鍐呮牳涓鑸兘鎻愪緵HLR綆楁硶錛岀敤鏉ユ牴鎹ā鍨嬫姇褰辯敓鎴愪簩緇村伐紼嬪浘銆侽penCASCADE鐨凥LR鎻愪緵浜嗛殣钘忕嚎娑堥殣綆楁硶銆?/p>
https://www.spatial.com/zh/products/cgm-hlr-hidden-line-removal OpenCASCADE 鎻愪緵浜嗕袱縐嶆秷闅愮畻娉曪細(xì)HLRBRep_Algo鍜孒LRBRep_PolyAlgo銆傝繖浜涚畻娉曢兘鏄熀浜庣浉鍚岀殑鍘熺悊錛氭瘮杈冨艦鐘舵瘡鏉¤竟鐩稿姣忎釜闈㈢殑鍙鎬э紝騫?璁$畻姣忔潯杈圭殑鍙閮ㄥ垎涓庢秷闅愰儴鍒嗐傜畻娉曢氳繃璁$畻鍦ㄦ寚瀹氭姇褰辨柟鍚戜笂鐨勭墿浣撴樉紺虹壒鎬э紝鍘婚櫎鎴栨爣璁拌闈㈤伄鎸$殑杈廣傝繖涓や釜綆楁硶涔熶笌涓浜涙彁鍙栧姛鑳介厤鍚堜嬌鐢紝濡傞噸鏋勪竴 涓畝鍖栫殑妯″瀷絳夛紝綆鍖栧悗鏂扮殑妯″瀷鐢辮竟緇勬垚錛屽氨鏄湪鎶曞獎鏂瑰悜涓婄殑杞粨綰褲?/p>
OpenCASCADE鐨凥LR涓皢杈瑰垎涓轟互涓嬬被鍨嬶細(xì) 浠庣被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綆楁硶錛屼負(fù)鑷姩鐢熸垚鍥劇焊鍔熻兘鎵撲笅鍩虹銆?/p>
eryar@163.com OpenCASCADE涓嚑浣曟洸綰夸笌鏇查潰姹備氦浣跨敤綾籊eomAPI_IntCS錛屾槸瀵圭被IntCurveSurface_HInter鐨勭畝鍗曞皝瑁呫傚湪IntCurveSurface_HInter涓鏇茬嚎鍜屾洸闈㈡眰浜ゅ垎涓轟互涓嬪嚑縐嶇被鍨嬶細(xì) 鏈枃涓昏浠嬬粛鏇茬嚎涓庢洸闈㈡眰浜ょ殑瀹炵幇鍘熺悊銆?/p>
浜屾鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜や嬌鐢↖ntAna_ConicQuad璁$畻錛屼富瑕佹濊礬鏄皢鏇茬嚎鐢ㄥ弬鏁版柟紼嬭〃紺猴紝浠e叆浜屾鏇查潰鐨勪唬鏁版柟紼嬨備簩嬈℃洸闈㈠彲浠ヤ嬌鐢ㄤ簩嬈″欏瑰紡琛ㄧず錛屽皢浜屾鏇茬嚎涓庝簩嬈℃洸闈㈢浉浜よ〃紺烘垚涓涓欏瑰紡鏂圭▼錛屼嬌鐢╩ath_DirectPolynomialRoots瀵瑰欏瑰紡鏂圭▼榪涜姹傝В銆?/p>
浜屾鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜ゅ皢鏇查潰浣跨敤IntCurveSurface_Polyhedron鍦║錛孷涓婇噰鏍風(fēng)鏁e緱鍒癵rid緗戞牸銆傝繖涓被瀹炵幇涓嶪ntPolyh_MaillageAffinage綾誨姛鑳芥湁閲嶅銆?/p>
IntCurveSurface_ThePolygon澶氭綰夸笌Intf_InterferencePolygonPolyhedron 緗戞牸姹備氦錛屾牴鎹孌電嚎涓庣綉鏍兼眰浜ゆ儏鍐碉紝鎵懼埌鍒濆鍊鹼紝浣跨敤IntImp_IntCS璁$畻綺劇‘鍊箋備笌鏇查潰姹備氦鐨凪arching綆楁硶綾諱技錛屼嬌鐢ㄨ凱浠f硶鍘昏綆楃簿紜氦鐐廣傝凱浠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()鐨勫疄鐜板師鐞嗭細(xì) 鑷敱鏇茬嚎涓庝簩嬈℃洸闈㈡眰浜ntCurveSurface_TheQuadCurvExactInter 錛岄氳繃綾籌ntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter寤虹珛浜屾鏇查潰涓庢洸綰夸箣闂寸殑鍑芥暟錛屾槸姹傝В鏇茬嚎涓婂弬鏁癠鐨勪竴鍏冨嚱鏁般?/p>
鑷敱鏇茬嚎涓庤嚜鐢辨洸闈㈡眰浜ゅ拰浜岀淮鑷敱鏇茬嚎姹備氦綾諱技錛岄噰鐢ㄧ殑紱繪暎娉曘傚嵆灝嗘洸綰塊氳繃閲囨牱紱繪暎鎴愬孌電嚎Polygon錛屽皢鏇查潰閲囨牱鐢熸垚緗戞牸Polyhedron錛岄氳繃綾籌ntCurveSurface_TheInterferenceOfHInter鏉ヨ綆楀孌電嚎涓庣綉鏍肩殑鐩鎬氦銆?/p>
鍖匢ntf涓昏鐢ㄦ潵璁$畻浜岀淮澶氭綰褲佷笁緇村孌電嚎鍙婄綉鏍肩殑鐩鎬氦銆傛牴鎹鏁h綆楃殑綺椾氦鐐癸紝鍐嶆牴鎹被IntCurveSurface_TheExactHInter浣跨敤榪唬娉曟眰寰楃簿紜氦鐐廣傝繖涓濇兂涓庢洸闈㈠拰鏇查潰姹備氦鐩稿悓銆?/p>
鏇茬嚎涓庢洸闈㈡眰浜ょ殑緇撴灉涓昏涔熸槸淇濆瓨鍦ㄧ被IntCurveSurface_Intersection瀵硅薄涓紝榪欎釜綾葷殑璁捐涓庝簩緇存洸綰挎眰浜ょ被浼鹼紝涓嶅鐩存帴銆?/p>
鍙互鐪嬪埌IntCurveSurface_Intersection榪欎釜綾葷殑鏋勯犲嚱鏁版槸protected鐨勶紝鎰忔濇槸涓嶈兘鐩存帴浣跨敤錛岄氳繃媧劇敓綾籌ntCurveSurface_HInter璋冪敤SetValues()鍑芥暟灝嗘眰浜ょ粨鏋滀繚瀛樿搗鏉ャ傛眰浜ょ粨鏋滀負(fù)浜ょ偣IntCurveSurface_IntersectionPoint鍜屼氦綰縄ntCurveSurface_IntersectionSegment銆?/p>
鍏朵腑浜ょ偣涓璉ntCurveSurface_IntersectionPoint淇濆瓨浜嗕笁緇村潗鏍囩偣錛屼氦鐐瑰湪鏇查潰涓婄殑U,V鍙傛暟錛屼氦鐐瑰湪鏇茬嚎涓婄殑鍙傛暟U鍙婄浉浜ょ姸鎬併備氦綰夸富瑕佹槸綰跨幇闈㈠拰閲嶅悎閮ㄥ垎鐨勫嚑浣曞寮傛儏鍐墊暟鎹?/p>
浠庣被鍥句笂鍙互鐪嬪嚭錛岃繖涓璺悓鏍風(fēng)敤鍒頒簡HLR綆楁硶涓紝鐞嗚В榪欎釜濂楄礬瀵圭悊瑙LR綆楁硶鏈夊府鍔┿?/p>
緇間笂鎵榪幫紝OpenCASCADE涓皢鏇茬嚎涓庢洸闈㈡眰浜ゆ牴鎹洸綰垮拰鏇查潰綾誨瀷鐨勪笉鍚屽垎鍒鐞嗐備簩嬈℃洸綰挎洸闈㈡眰浜や緷璧朓ntAna鍖咃紝鑷敱鏇茬嚎鍜岃嚜鐢辨洸闈㈡眰浜や嬌鐢ㄧ鏁f硶錛屾渶緇堝疄鐜扮畻娉曚笌涓や釜鏇查潰姹備氦鐨凪arching綆楁硶綾諱技錛岄氳繃紱繪暎寰楀埌鐨勭簿浜ょ偣錛屽啀浠e叆榪唬鏂圭▼姹傚緱綺劇‘瑙c傚叾涓妸鏇茬嚎鎴栨洸闈㈢鏁g殑閲囨牱鐐規(guī)病鏈夎冭檻鏇茬嚎鎴栨洸闈㈢殑鏇茬巼絳夛紝閲囨牱鐐規(guī)暟閲忚緝澶э紝浼?xì)濯勫搷鎬ц兘 銆傛洸闈㈤噰鏍風(fēng)鏁d唬鐮佷笌鏇查潰姹備氦涓殑鏈夐噸澶嶃備粠鍑犱綍姹備氦綾諱腑鍙互鐪嬪埌娌℃湁瀹瑰樊鐨勮緭鍏ワ紝鍙互鎬濊冧竴涓嬭繖涓棶棰樸?/p>
TKGeomAlgo涓櫎浜嗘嫙鍚堢畻娉曞錛屽ぇ閮ㄥ垎浠g爜涓昏灝辨槸綰跨嚎姹備氦銆佺嚎闈㈡眰浜ゅ強闈㈤潰姹備氦綆楁硶銆傜悊瑙h繖浜涚畻娉曠殑瀹炵幇鍘熺悊錛屼負(fù)Boolean綆楁硶鐨勬眰浜ら昏緫鎵撲笅鍩虹銆?/p>
OpenCASCADE涓浜岀淮鏇茬嚎姹備氦鍜屼笁緇存洸綰挎眰浜ゆ槸涓嶅悓鐨勶紝涓夌淮鏇茬嚎姹備氦緇熶竴浣跨敤紱繪暎娉曪紝浜岀淮鏇茬嚎姹備氦鏍規(guī)嵁鏇茬嚎綾誨瀷鐨勪笉鍚屽垎縐嶇被鍨嬭繘琛屽鐞嗐備簩緇存洸綰挎眰浜や腑榪樻彁渚涗簡璁$畻鑷氦鐨勭洿鎺ユ帴鍙c傚湪TKGeomAlgo涓紝涓昏鍐呭灝辨槸鎷熷悎銆佹眰浜ょ畻娉曪紝鐞嗚В姹備氦綆楁硶鐨勫疄鐜板師鐞嗭紝杈懼埌鑳介槄璇誨拰淇敼婧愮爜鐨勭姸鎬侊紝鑳藉鍒嗘瀽鍜岃В鍐沖疄闄呴亣鍒扮殑闂錛岀悊瑙penCASCADE鐨勮兘鍔涜竟鐣岋紝鏍規(guī)嵁闇瑕侀夋嫨鎵闇瑕佺殑鍔熻兘錛屼嬌杞歡緇撴灉鍙帶銆傛湰鏂囦富瑕佷粙緇嶄簩緇存洸綰跨浉浜ょ殑瀹炵幇鍘熺悊銆?/p>
鐢變簬OpenCASCADE寮鍙戞椂闂寸浉瀵逛箙榪滐紝鍦ㄤ簩緇存洸綰挎眰浜ょ浉鍏充唬鐮佷腑澶ч噺浣跨敤浜嗗畯瀹氫箟鐨勬柟寮忔潵瀹炵幇C++ 鐨勬ā鏉縯emplate鑳藉姏錛屽畯瀹氫箟鍦ㄧ被鐨刋XX_0.cxx鏂囦歡涓紝瀵瑰簲妯℃澘瀹炵幇鍦?.gxx涓細(xì) 榪欑瀹炵幇鏂瑰紡浼?xì)璁╀唬鐮佺殑鍙Lу彉宸紝涓嶅埄浜庝唬鐮佺淮鎶ゃ傚簲璇ョ敤C++鐨勬柟寮忓榪欎簺*.gxx浠g爜閲嶆瀯錛屽寮轟唬鐮佸彲璇繪у拰鍙淮鎶ゆс?/p>
浜岀淮姹備氦浣跨敤綾籊eom2dAPI_InterCurveCurve錛?榪欎釜綾繪槸瀵圭被Geom2dInt_GInter鐨勫皝瑁呫傚湪綾籊eom2dInt_GInter涓紝濡傛灉鍙緭鍏ヤ竴鏉℃洸綰匡紝鍙互璁$畻鑷氦錛屽鏋滆緭鍏ヤ袱鏉℃洸綰匡紝璁$畻涓ゆ潯鏇茬嚎鐨勭浉浜ゃ?/p>
榪欎簺綾婚兘鏄粠綾籌ntRes2d_Intersection媧劇敓錛?/p>
浠庝笂鍥懼彲鐭ワ紝浜岀淮姹備氦緇撴灉綾籌ntRes2d_Intersection鐩稿叧媧劇敓綾誨彲鐭ヤ簩緇存眰浜や笌HLR綆楁硶涔熸湁鍏崇郴錛岀悊瑙d簩緇存洸綰挎眰浜ら昏緫錛屽鐞嗚ВHLR浠g爜涔熸湁甯姪銆?/p>
褰撳彧杈撳叆涓鏉℃洸綰挎椂錛屽彲浠ュ鏇茬嚎榪涜鑷氦璁$畻錛屼富瑕佸疄鐜伴昏緫涓猴細(xì)鑻ヤ負(fù)鏅氫簩嬈℃洸綰匡紝鍒欎笉浼?xì)鑷氦锛涜嫢鏄叾浠栨洸绾垮Q屼嬌鐢ㄧ鏁f硶瀵規(guī)洸綰胯繘琛岃嚜浜よ綆椼備唬鐮佸涓嬪浘鎵紺猴細(xì) 浜岀淮鏇茬嚎姹備氦緇撴灉淇濆瓨鍒扮被IntRes2d_Intersection涓紝涓昏鍖呭惈涓ら儴鍒嗭細(xì) 鍥犱負(fù)綾籌ntRes2d_Interseciton鐨勬瀯閫犲嚱鏁皃rotected錛屾墍浠ヤ笉鑳界洿鎺ヤ嬌鐢ㄨ繖涓被錛岄兘鏄氳繃鍏舵淳鐢熺被浣跨敤鍑芥暟SetValues()灝嗚綆楀緱鍒扮殑浜ょ偣鍜屼氦綰挎暟鎹繚瀛樿搗鏉ャ傝繖閲岀被鐨勮璁℃瘮杈冪箒鐞愶紝浠g爜鍙鎬ц緝宸?/p>
OpenCASCADE瀵逛簬浜岀淮鏇茬嚎姹備氦榪涜鍒嗙被澶勭悊錛屾牴鎹洸綰跨被鍨嬫槸浜屾鏇茬嚎銆佸弬鏁版洸綰垮垎鎴愪笁綾伙細(xì)浜屾鏇茬嚎涓庝簩嬈℃洸綰挎眰浜ゃ佷簩嬈℃洸綰夸笌鍙傛暟鏇茬嚎姹備氦鍜屽弬鏁版洸綰夸笌鍙傛暟鏇茬嚎姹備氦錛屼笉鍚岀殑姹備氦綾誨瀷閲囩敤涓嶅悓鐨勭瓥鐣ュ彲浠ユ彁楂樻眰浜ゆц兘鍜岀ǔ瀹氭с備嬌鐢ㄧ鏁f硶璁$畻浜岀淮鏇茬嚎鑷氦銆備粠姹備氦緇撴灉鏉ョ湅錛屼篃澶勭悊浜嗗嚑浣曞寮傞棶棰橈紝鍗蟲洸綰塊噸鍙犳儏鍐點?/p>
瀵逛簬鏇茬嚎姹備氦榪樻湁寰堝ぇ鏀硅繘絀洪棿錛?/p>
鏇茬嚎鍙互鐢ㄤ唬鏁版柟紼嬭〃紺猴紝濡傚渾鍙互鐢╔^2+Y^2=R^2琛ㄧず錛屼篃鍙互鐢ㄥ弬鏁版柟紼媂(u)=RCos(u), Y(u)=RSin(u)琛ㄧず銆傝鍒ゆ柇鐐規(guī)槸涓嶆槸鍦ㄧ嚎涓婏紝鐢ㄦ洸綰夸唬鏁版柟紼嬪彲浠ュ緢鐩存帴寰楀嚭緇撴灉錛屼絾鏄嬌鐢ㄥ弬鏁版柟紼嬪氨娌℃湁閭d箞鐩存帴銆傝繖涔熸槸鍙傛暟鏇茬嚎涓婄偣鐨勫弽姹傞棶棰橈紝鍙傛暟鏇茬嚎涓婄偣鐨勫弽姹傞棶棰樺簲鐢ㄥ箍娉涳紝濡傚墠闈㈡墍榪板垽鏂偣鏄惁鍦ㄦ洸綰夸笂銆佺偣鍚戞洸綰挎姇褰便佺偣涓庣嚎鐨勬眰浜ゃ佺偣鍦ㄥ弬鏁版洸綰夸笂鐨勫弬鏁扮瓑錛岄兘涓庣偣鐨勫弽姹傞棶棰樼浉鍏熾傛湰鏂囦富瑕佺粨鍚堜唬鐮佷粙緇峅penCASCADE鏇茬嚎涓婄偣鐨勫弽姹傚疄鐜板師鐞嗗強浣跨敤榪囩▼涓殑涓浜涙敞鎰忎簨欏廣?/p>
鍦ㄣ奣he NURBS Book銆嬩功涓皢鐐圭殑鍙嶆眰闂褰掔粨涓虹偣鍚戞洸綰挎姇褰辮窛紱繪渶鐭殑闂錛屽涓嬪浘鎵紺猴細(xì) 寤虹珛鍑芥暟f(u)=C’(u).(C(u) - P)琛ㄧず鐐瑰埌鏇茬嚎璺濈錛屽綋f(u)=0鏃朵負(fù)鐐瑰埌鏇茬嚎鐨勬渶鐭窛紱伙紝涓嶇鐐筆鏄惁鍦ㄦ洸綰夸笂銆傚嚑浣曟剰涔夋槸鐐瑰埌鏇茬嚎浠繪剰鐐圭殑鍚戦噺涓庝換鎰忕偣澶勭殑鍒囧悜閲忕偣縐負(fù)闆訛紝琛ㄧず鍦ㄤ袱涓悜閲忓瀭鐩寸殑鏃跺欐眰寰楁瀬鍊肩偣銆傛敞鎰忔暟瀛︽柟紼嬩腑鍨傜洿榪欎釜鍑犱綍鎰忎箟銆?/p>
OpenCASCADE涓疄鐜版洸綰夸笂鐐圭殑鍙嶆眰鍘熺悊涓庛奣he NURBS Book銆嬩功涓竴鑷淬傜偣鐨勫弽姹備嬌鐢ㄧ被GeomLib_Tool::Parameter()鍑芥暟錛?/p>
杈撳叆鏇茬嚎銆佺偣鍜屾渶澶ц窛紱伙紝璁$畻鐐規(guī)槸鍚﹀湪鏇茬嚎涓婂強鑻ュ湪鏇茬嚎涓婏紝鐐瑰搴斿弬鏁版洸綰跨殑鍙傛暟U銆?/p>
綾籈xtrema_ExtPC璁$畻鐐筆鍒扮嚎C鐨勬瀬鍊糆xtrema銆傛牴鎹唬鐮佹敞閲婂彲浠ョ湅鍑虹偣鐨勫弽姹傛暟瀛︽柟紼嬩笌銆奣he NURBS Book銆嬩功涓竴鑷達(dá)細(xì) 鏁板鏂圭▼瀵瑰簲鐨勭被鐨勫彉閲忎負(fù)myF錛岀被鍚嶄負(fù)Extrema_FuncExtPC錛屼粠綾籱ath_FunctionWithDerivative媧劇敓錛屾墍浠ュ繀欏誨疄鐜頒袱涓叧閿櫄鍑芥暟Value()鍜孌erivative()銆傚叾浠g爜娉ㄩ噴璇存槑浜嗚繖涓や釜鍑芥暟鐨勫疄鐜扮粏鑺傦細(xì) 鍏朵腑F(u)瀵瑰簲鍑芥暟Value(): DF(u)瀵瑰簲鍑芥暟Derivative()錛屾渶鍚庝嬌鐢∟ewton娉昺ath_FunctionRoots瀵規(guī)柟紼嬭繘琛屾眰鏍廣?/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>
鍥犱負(fù)OpenCASCADE涓袱鏉′笁緇存洸綰挎眰浜ょ殑綾繪槸IntTools_EdgeEdge錛屽叾瀹炵幇鍘熺悊鏄熀浜庡寘鍥寸洅鐨勫垎鍓叉硶銆傚熀浜庤繖涓垎鍓查掑綊鎬濇兂錛屽疄鐜拌嚜浜や篃鍙互鍙傝冭繖涓濊礬銆傜畻娉曠殑嫻佺▼涓猴細(xì)杈撳叆涓鏉¤璁$畻鑷氦鐨勮竟Edge錛屽杈硅繘琛岀鏁i噰鏍鳳紝灝嗛噰鏍峰緱鍒扮殑姣忔鏇茬嚎鐨勫寘鍥寸洅鐢熸垚BVH榪涜鐩鎬氦媯嫻嬶紝灝咮VH涓寘鍥寸洅鐩鎬氦鐨勪袱鏉℃洸綰胯皟鐢↖ntTools_EdgeEdge鏉ヨ綆楃浉浜ゃ?/p>
紱繪暎寰楀埌鐨勬洸綰挎浼?xì)姣旇緝澶氬Q屽鏋滅敤涓や釜寰幆鏉ユ嫻嬩袱涓ゆ洸綰挎鐨勭浉浜ゆ儏鍐墊ц兘宸紝鍙互寮曞叆BVH鎻愰珮鎬ц兘銆?/p>
鍙互閫氳繃鎻掑糏nterpolate鏉ユ瀯閫犳洸綰挎祴璇曪紝鎸囧畾鍑犱釜鑷氦鐐規(guī)潵鏋勯犳彃鍊兼洸綰褲傝綆楃粨鏋滃涓嬪浘鎵紺猴細(xì) 涓庢洸綰挎眰浜ゅ師鐞嗙被浼鹼紝閮芥槸浣跨敤紱繪暎鐨勬柟娉曪紝鍙互鎬濊冧竴涓嬫暟鍊肩畻娉曞浣曞鐞嗐?/p>
OpenCASCADE涓彁渚涗簡浜岀淮鍑犱綍鏇茬嚎鐨勬眰浜ょ被Geom2dAPI_InterCurveCurve錛屽搴斿埌涓夌淮鍑犱綍鍙彁渚涗簡GeomAPI_IntCS, GeomAPI_IntSS錛屾病鏈夋彁渚涘嚑浣曠殑GeomAPI_IntCC姹備氦綾匯傝繖浜涘嚑浣曟眰浜や竴鑸嬌鐢ㄧ殑鏄暟鍊肩畻娉曪紝鍗寵В鏂圭▼銆傚浜庝袱鏉″嚑浣曟洸綰縋(u1), Q(u2)錛屾眰浜ゅ氨鏄ВP(u1) - Q(u2) = 0榪欎釜鏂圭▼銆備負(fù)浠涔堝浜庝笁緇村嚑浣曟洸綰挎病鏈夋彁渚涙暟鍊肩畻娉曪紵 瀵逛簬鎷撴湸杈規(guī)彁渚涗簡姹備氦綆楁硶IntTools_EdgeEdge錛岃繖涓被鏄嬌鐢ㄧ被浼間簬鏇查潰姹備氦鐨勭鏁g綉鏍兼硶錛屼嬌鐢ㄤ簡紱繪暎鍖呭洿鐩掓硶銆?/p>
鍩轟簬鍖呭洿鍚堢洅鐨勭畻娉曟槸涓掑綊綆楁硶錛岀畻娉曟濊礬錛?/p>
絎竴嬈℃槸鍒嗗埆鍒嗘垚2閮ㄥ垎錛?/p>
鍦ㄩ掑綊鍑芥暟FindSolutions()涓紝鍙幓瀵圭涓鏉¤竟榪涜鍙傛暟鍒嗗壊鎴?閮ㄥ垎錛?/p>
絎竴涓緟鍔╁嚱鏁版槸FindParameters()錛岀敤鏉ユ洿鏂扮浜屾潯杈瑰湪絎竴鏉¤竟鐨勭殑鍖呭洿鐩掍腑鐨勫弬鏁拌寖鍥達(dá)紝浣跨敤榪欎釜鍙傛暟鑼冨洿鏇存柊鍖呭洿鐩掋?/p>
絎簩涓緟鍔╁嚱鏁版槸CheckCoincidence()錛岀敤鏉ユ嫻嬩袱孌佃竟鏄惁閲嶅悎銆傜涓姝ユ槸蹇熻綆楋紝瀵硅竟閲囨牱10涓偣錛岃嫢閫氳繃鍒濇綺楁嫻嬶紝鍚庨潰鍐嶆繁鍏ヨ綆椼傝繖浜涚畻娉曢兘涓嶅お楂樻晥銆?/p>
絎笁涓緟鍔╁嚱鏁版槸IsIntersection()鐢ㄦ潵鍒ゆ柇涓よ竟鏉″湪鍙傛暟鑼冨洿鍐呮槸鍚︾浉浜ゃ?/p>
灝嗕袱鏉¤竟姹備氦榪囩▼涓殑鍖呭洿鐩掓樉紺哄嚭鏉ワ紝鏂逛究鏌ョ湅鐞嗚В綆楁硶銆傚厛嫻嬭瘯涓や釜鍦嗕箣闂寸殑鐩鎬氦錛?/p>
鍏朵腑絎竴鏉¤竟鏄豢鑹茬殑鍦嗭紝姹備氦榪囩▼涓殑鍖呭洿鐩掍篃鐢ㄧ豢鑹茶〃紺猴紱絎簩鏉¤竟鏄孩鑹茬殑鍦嗭紝姹備氦榪囩▼涓殑鍖呭洿鐩掍篃鐢ㄧ孩鑹茶〃紺恒傚洜涓哄渾鏄棴鍚堢殑錛岀涓嬈¢兘鍒嗗壊鎴?閮ㄥ垎銆傚皢涓婇潰浜ょ偣澶勭悊鏀懼ぇ錛?/p>
鍚庨潰閮芥槸灝嗙涓鏉¤竟鍒嗗壊鎴?閮ㄥ垎錛岀劧鍚庡垎鍒敤榪?閮ㄥ垎鐨勫寘鍥寸洅鍘繪壘涓庣浜屾潯杈圭浉浜ょ殑鍙傛暟鑼冨洿錛屽啀鏇存柊絎簩鏉¤竟鐨勫寘鍥寸洅銆傜戶緇斁澶т笂闈氦鐐瑰錛?/p>
鍙戠幇瀵逛簬涓や釜鍦嗙殑姹備氦錛屾墽琛屼簡100嬈★紝鏁堢巼涓嶉珮銆傚張鐢ㄤ袱涓狟鏍鋒潯鏇茬嚎姹備氦鏉ユ祴璇曪細(xì) 鍙戠幇瀵逛簬B鏍鋒潯鏇茬嚎姹備氦閫熷害杈冨揩銆?/p>
鏇茬嚎姹備氦闇瑕佽冭檻閲嶅悎閮ㄥ垎錛宱pencascae涓病鏈変嬌鐢ㄦ暟鍊肩畻娉曟潵璁$畻錛岃屾槸閲囩敤鍩轟簬鍖呭洿鐩掔殑綆楁硶鏉ュ鐞嗐傝繖縐嶇畻娉曚竴鑸儏鍐典笅鍙互蹇熸壘鍒版眰浜よВ錛屾湁鏃墮掑綊杈冩繁錛屽浜庡熀鏈洸綰垮彲浠ュ儚鏇查潰姹備氦涓鏍峰垎綾誨鐞嗕互鎻愰珮鎬ц兘銆俹pencascade涓浜庝笁緇存洸綰挎眰浜ょ畻娉曟ц兘榪樻湁浼樺寲絀洪棿銆?/p>
闄や簡鍦∣penCASCADE鍏ラ棬鎸囧崡涓帹鑽愮殑涔︾睄涔嬪錛岃繕鏈変竴浜涜繘闃剁殑涔︾睄錛屾斁鍦ㄩ偅鍎挎湁鏃墮棿灝辯湅鐪嬶紝鎬諱細(xì)鏈変簺鏀惰幏銆傛?zhèn)熸т笉瓚籌紝鍙湁鍕よ兘琛ユ嫏銆傚浜庣湅涓嶆噦鐨勶紝鍙兘鐢?ldquo;涔﹁鐧鵑亶錛屽叾涔夎嚜瑙?rdquo;瀹夋叞涓涓嬭嚜宸便?/p>
鐜嬪厓 鏁板澶ц緸鍏?nbsp; 宸ュ叿涔?nbsp; 鏂逛究涓浜涘畾涔夛紝鍏紡錛屽畾鐞嗙殑鏌ユ壘銆?/p>
銆婅綆楁満杈呭姪鍑犱綍璁捐瀵艱銆嬫瘮杈冨叏闈㈠湴浠嬬粛浜嗚綆楁満杈呭姪鍑犱綍璁捐鐨勫彂灞曞巻鍙插強鍏朵富瑕佸唴瀹瑰拰鏈鏂拌繘灞曪紝鍖呮嫭鐜頒唬鐨凾鏍鋒潯鏇茬嚎鏇查潰銆?/p>
銆婃牱鏉″嚱鏁頒笌璁$畻鍑犱綍銆嬪彊榪版牱鏉″嚱鏁板拰璁$畻鍑犱綍鐨勫熀鏈悊璁哄拰鏂規(guī)硶錛屽悓鏃訛紝鎬葷粨浜嗕綔鑰呭嚑騫存潵鍦ㄨ棰嗗煙涓殑鐮旂┒鎴愭灉. 銆婄幇浠f暟瀛﹀熀紜涓涗功165錛氭暎涔辨暟鎹嫙鍚堢殑妯″瀷銆佹柟娉曞拰鐞嗚錛堢浜岀増錛夈嬩粙緇嶄簡澶氬厓鏁d貢鏁版嵁鎷熷悎鐨勪竴鑸柟娉曪紝鍖呮嫭澶氬厓鏁d貢鏁版嵁澶氶」寮忔彃鍊箋佸熀浜庝笁瑙掑墫鍒嗙殑鎻掑兼柟娉曘丅oole鍜屼笌Loons鏇查潰銆丼ibson鏂規(guī)硶鎴栬嚜鐒墮偦榪戞硶銆丼hepard鏂規(guī)硶銆並riging鏂規(guī)硶銆佽杽鏉挎牱鏉℃柟娉曘丮Q鎷熸彃鍊兼硶銆佸緞鍚戝熀鍑芥暟鏂規(guī)硶銆佽繍鍔?灝忎簩涔樻硶銆侀殣鍑芥暟鏍鋒潯鏂規(guī)硶銆丷鍑芥暟娉曠瓑銆傚悓鏃惰繕鐗瑰埆浠嬬粛浜嗚繎騫存潵鍥介檯涓婅秺鏉ヨ秺鐑茍鍦ㄦ棤緗戞牸寰垎鏂圭▼鏁板艱В鏂歸潰鏈夎澶氬簲鐢ㄧ殑寰勫悜鍩哄嚱鏁版柟娉曞強鍏剁浉鍏崇悊璁恒?/p>
涓昏鍐呭鍖呮嫭鍑犱綍鍋忓井鍒嗘柟紼嬬殑鏋勯犳柟娉曘佸悇縐嶅井鍒嗗嚑浣曠畻瀛愮殑紱繪暎鍖栨柟娉曞強鍏剁鏁f牸寮忕殑鏀舵暃鎬с佸嚑浣曞亸寰垎鏂圭▼鏁板兼眰瑙g殑鏈夐檺宸垎娉曘佹湁闄愬厓娉曚互鍙婃按騫抽泦鏂規(guī)硶錛岃繕鍖呮嫭鍑犱綍鍋忓井鍒嗘柟紼嬪湪鏇查潰騫蟲粦銆佹洸闈㈡嫾鎺ャ丯杈規(guī)礊濉ˉ銆佽嚜鐢辨洸闈㈣璁°佹洸闈㈤噸鏋勩佹洸闈㈡仮澶嶃佸垎瀛愭洸闈㈡瀯閫犱互鍙婁笁緇村疄浣撳嚑浣曞艦鍙樹腑鐨勫簲鐢ㄣ?/p>
钂欑毊錛?strong>Skinning錛夊氨鏄皢涓綈囨埅闈㈡洸綰匡紙section curves錛夎瀺鍚堝湪涓璧風(fēng)敓鎴愭洸闈㈢殑榪囩▼銆傝挋鐨彧鏄?strong>鏀炬牱錛?strong>Lofting錛夌殑鏂板悕璇嶏紝鏀炬牱鍙互榪芥函鍒拌綆楁満娌℃湭璇炵敓鐨勬椂鍊欙紝浠庨偅鏃跺埌鐜板湪錛屽畠涓鐩村湪閫犺埞銆佹苯杞﹀拰鑸┖宸ヤ笟涓騫挎硾鍦板簲鐢ㄣ?/p>
鎵帬錛?strong>Sweep錛夌爺絀剁殑鏄竴鏉℃埅闈㈡洸綰挎部浠繪剰璺緞鏇茬嚎鎵帬鐨勯棶棰樸傛牴鎹壂鎺犳洸闈㈢殑瀹氫箟錛屾壂鎺犳洸闈㈡湭蹇呴兘鑳借〃紺烘垚NURBS褰㈠紡錛屾墍浠ヤ竴鑸噰鐢ㄦ嫙鍚堢畻娉曟潵閫艱繎銆備竴縐嶇畻娉曟槸鍩轟簬钂欑毊娉曪紝娌跨潃璺緞鏇茬嚎鍙樻崲鍜岄噰鏍種涓埅闈紝鐒跺悗灝嗗畠浠綔涓烘埅闈㈡洸綰胯繘琛岃挋鐨傞殢鐫閲囨牱鏁伴噺N鐨勫鍔狅紝鐢熸垚鐨勬嫙鍚堟洸闈㈢簿搴︿篃灝嗘彁楂樸?/p>
鏈枃涓昏浠嬬粛OpenCASCADE涓壂鎺犻犲瀷綆楁硶鐨勪嬌鐢紝闄や簡涓婇潰涓鑸殑鎵帬鏇查潰錛岃繕鏈変竴浜涢珮綰х敤娉曘?/p>
鍦―Raw Test Harness涓緭鍏ュ懡浠etsweep鍙互鐪嬪埌鏈夋寚瀹氬紩瀵?綰縂uide鐨勯夐」錛?/p>
榪欎釜寮曞綰縂uide鏈変粈涔堢敤鍛紵涓嬮潰緇欏嚭涓涓ず渚嬶細(xì) 鍏朵腑Profile鏄壂鎺犳埅闈紝Spine涓烘壂鎺犺剨綰匡紝Guide涓烘壂鎺犲紩瀵肩嚎銆傛壂鎺犵粨鏋滃氨鏄竴涓灪鏃嬬殑閽誨ご妯″瀷銆傚湪Draw Test Harness鐨勪緥瀛愪腑錛岀粰鍑轟袱涓叧浜庡紩瀵肩嚎鎵帬鐨勭ず渚嬶紝涓や釜閽誨ご錛?/p>
鎶婅繖涓や釜渚嬪瓙鐞嗚В鍩烘湰鑳芥帉鎻℃壂鎺犵畻娉曠殑浣跨敤鏂規(guī)硶錛屼粠榪欎袱涓緥瀛愬彲浠ョ湅鍑猴紝OpenCASCADE鎵帬閫犲瀷鑳藉姏榪樹笉閿欍?/p>
鎵帬榪樻湁涓涓兘鍔涙槸浣挎壂鎺犳埅闈㈠瀭鐩翠簬涓涓敮鎾戦潰錛岃繖鏄竴涓湁鐢ㄧ殑閫夐」銆備笅闈㈣繕鏄湪Draw Test Harness涓祴璇曚竴涓嬶細(xì) OpenCASCADE涓壂鎺犻犲瀷綆楁硶鍔熻兘榪樻瘮杈冨己澶э紝闄や簡鏀寔甯歌鐨勬壂鎺犲錛岃繕鏀寔甯﹀紩瀵肩嚎鐨勬壂鎺狅紝鍙婂甫寮曞綰跨殑澶氫釜鎴潰鐨勫彉褰㈡壂鎺狅紝榪樻敮鎸佹埅闈㈠緇堝瀭鐩翠簬鏀寔闈㈢殑鎵帬閫夐」銆傛壂鎺犵殑鍏抽敭鏄‘瀹氭埅闈㈢殑鍙樻崲瑙勫垯錛屽簳灞傜殑钂欑毊鎷熷悎綆楁硶榪樻槸姣旇緝紼沖畾鐨勩傛妸Draw Test Harness涓袱涓捇澶寸殑渚嬪瓙鐞嗚В鍚庯紝鍩烘湰涓婂簲璇ヨ兘澶熸帉鎻penCASCADE涓壂鎺犻犲瀷鐨勪嬌鐢ㄦ柟娉曘?/p>
OpenCASCADE涓闈㈢殑鐩鎬氦瀹氫箟濡備笅鍥炬墍紺猴細(xì) 涓夌淮絀洪棿涓袱涓甫鏈塆eometry Surface鐨勯潰Face錛屽綋涓や釜Surface涔嬮棿鐨勮窛紱誨皬浜嶧ace涓殑瀹瑰樊Tolerance錛屽垯璁や負(fù)鏄浉浜ょ殑銆備竴鑸袱涓潰涔嬮棿鐩鎬氦寰楀埌鐨勬槸浜ょ嚎錛岃繕鏈変竴浜涙儏鍐靛緱鍒扮殑鏄氦鐐癸紝濡備笅鍥炬墍紺猴細(xì) 甯冨皵榪愮畻涓潰鐨勭浉浜ゆ槸鐩稿澶嶆潅鐨勯棶棰橈紝闄や簡鑰冭檻涓婅堪浜ょ嚎鍜屼氦鐐圭殑闂浠ュ錛岃繕瑕佽冭檻鏈夐噸鍙犵殑鎯呭喌錛涘浜庢柊鐢熸垚鐨勪氦綰匡紝榪樿鑰冭檻鐢熸垚PCurve錛涜嫢闈笂鏈夊紑瀛旓紝榪樿灝嗙┛榪囧紑瀛斿尯鍩熺殑浜ょ嚎鎺掗櫎絳夛紱鏈鍚庤鑰冭檻濡備綍淇濆瓨闈㈢浉浜ょ殑緇撴灉銆傜浉浜ょ殑璁$畻鍦ㄥ嚱鏁幫細(xì) 鏈緇堟槸璋冪敤IntTools_FaceFace鏉ヨ綆椾袱涓潰鐨勭浉浜ゃ傚茍灝嗚綆楃粨鏋滀氦綰垮拰浜ょ偣錛屾槸鍚﹂噸鍙犵瓑淇℃伅淇濆瓨鍒癇OPDS_InterfFF涓細(xì) 綾籅OPDS_FaceInfo鐢ㄦ潵瀛樺偍浠ヤ笅淇℃伅錛?/p>
娉ㄦ剰PBo31鍜孭BSc1錛屼竴涓姸鎬佹槸On錛屼竴涓姸鎬佹槸Section銆傚湪鐩鎬氦澶勭悊綾籅OPAlgo_PaveFiller涓氳繃鍑芥暟BOPAlgo_PaveFiller::UpdateFaceInfo灝嗚繖浜涚浉浜ょ殑鐘舵佹洿鏂般?/p>
浠庡墠闈㈢殑鏂囩珷鍏充簬媯嫻嬭竟涓庤竟銆佽竟涓庨潰鏄惁鏈夐噸鍙犳椂閲囩敤浜嗗浐瀹氶噰鏍風(fēng)偣鏉ュ鐞嗙殑涓嶄弗璋ㄧ殑閫昏緫鏉ョ湅錛屽垽鏂嚎鐨勯噸鍙犳槸涓鏉傜殑闂錛屽垽鏂潰涓庨潰鐨勯噸鍙犲氨鐩稿鏇村鏉傘傛湰鏂囧厛浠庣畝鍗曞叆鎵嬶紝鍏堢湅瀵逛簬鏈綆鍗曠殑涓や釜騫抽潰閲嶅彔鐨勬嫻嬶紝寮曞嚭澶у瀵逛簬浠繪剰涓や釜闈㈤噸鍙犲尯鍩熸嫻嬬殑鎬濊冦傚榪欑鐗規(guī)畩鐨勬儏鍐靛鐞嗗湪IntTools_FaceFace涓殑鍑芥暟PerformPlanes()涓疄鐜般傚叾涓嬌鐢ㄤ簩嬈℃洸闈㈢殑鍑犱綍姹備氦娉曡繘琛屽鐞嗭紝婧愮爜濡備笅錛?/p>
閫氳繃婧愮爜鍙互鐪嬪嚭錛岃嫢涓や釜騫抽潰涔嬮棿鐨勬硶鍚戝す瑙掑皬浜嶵olAng鍙婅窛紱誨皬浜嶵ol鏃訛紝鍒欒涓轟袱涓潰鏄竴鏍風(fēng)殑IntAna_Same錛涘綋璺濈澶т簬Tol鏃訛紝鍒欒涓烘病鏈夌浉浜ntAna_Empty銆?/p>
瀵逛簬閲嶅彔鐨勫鉤闈紝灝唗heTangentFaces璁劇疆鎴恡rue琛ㄧず鏄噸鍙犵殑銆傝繖閲岀暀涓嬩竴涓棶棰樺ぇ瀹舵濊冿細(xì)濡備綍鍒ゆ柇鑷敱鏇查潰鐨勯噸鍙犳儏鍐碉紵 褰撻潰涓婃湁瀛旀礊鏃訛紝榪樿瀵逛氦綰胯繘琛屽鐞嗭紝浠ユ帓闄ゆ帀瀛旀礊涓殑浜ょ嚎銆傚綋浣跨敤IntTools_FaceFace鏉ヨ綆椾袱涓潰鐨勪氦綰挎椂錛屽彲浠ョ湅鍒頒氦綰跨殑鑼冨洿涓嶆紜紝娌℃湁澶勭悊瀛旀礊鎯呭喌錛岀敋鑷充篃娌℃湁澶勭悊闈㈢殑杈圭晫銆傚涓嬪浘鎵紺虹孩鑹茬殑浜ょ嚎涓轟嬌鐢↖ntTools_FaceFace璁$畻寰楀埌鐨勶細(xì) 褰撲嬌鐢˙OPAlgo_PaveFiller璁$畻浜ょ嚎騫剁粨鍚圥aveBlock寰楀埌浜ょ嚎鏄劇ず濡備笅鍥炬墍紺猴細(xì) 铏界劧璁$畻涓や釜闈箣闂寸殑鐩鎬氦澶勭悊鏈緇堟槸璋冪敤鐨処ntTools_FaceFace錛屼絾鏄寰楀埌姝g‘鐨勪氦綰塊渶瑕佷嬌鐢ㄧ被BOPAlgo_PaveFiller銆傝繖閲屼篃鐣欎笅闂渚涘ぇ瀹舵濊冿細(xì)涓轟粈涔圛ntTools_FaceFace璁$畻鐨勪氦綰胯寖鍥翠笉姝g‘錛熶負(fù)浠涔圔OPAlgo_PaveFiller璁$畻鐨勪氦綰挎紜紵 緇間笂鎵榪幫紝甯冨皵鏁版嵁涓潰鐨勭浉浜ょ殑緇撴灉鍙兘鏈変氦綰匡紝涔熷彲鑳芥湁浜ょ偣銆傚皢姹備氦緇撴灉淇濆瓨鍒癋aceInfo涓備粠綆鍗曠殑涓や釜騫抽潰閲嶅彔鏉ョ湅錛屽皢閲嶅彔鐨勭姸鎬佺敤鍙橀噺theTangetFaces鏉ヤ繚瀛樸傞偅浠繪剰涓や釜鏇查潰閲嶅彔濡備綍鍒ゆ柇鍛紵闈㈢殑鐩鎬氦铏界劧鎻愪緵綾籌ntTools_FaceFace鏉ヨ綆楋紝浣嗘槸娌℃湁姝g‘澶勭悊浜ょ嚎鐨勮寖鍥達(dá)紝涓轟粈涔圔OPAlgo_PaveFiller涓彲浠ユ紜鐞嗕氦綰垮憿錛?/p>
紲濆ぇ瀹朵腑縐嬪浗搴嗚妭鏃ュ揩涔愶紒 鍦∣penCASCADE涓浜庤竟鐨勭浉浜ゅ垎涓轟笁綾伙細(xì)杈逛笌鐐癸紝杈逛笌杈癸紝杈逛笌闈紝杈逛笌鐐圭殑鐩鎬氦宸茬粡褰掔粨涓虹偣涓庤竟鐨勭浉浜ゅ鐞嗕簡錛岃竟鐨勭浉浜や富瑕佸鐞嗚竟涓庤竟錛岃竟涓庨潰鐨勭浉浜ゃ傝竟涓庤竟銆佽竟涓庨潰鐨勭浉浜や細(xì)寮曞叆涓涓柊鐨勬暟鎹粨鏋?鍏叡閮ㄥ垎Common Part錛岀敤浜庝繚瀛橀噸鍙犵殑鍏叡閮ㄥ垎鏁版嵁銆?/p>
瀵逛簬涓ゆ潯杈圭殑鐩鎬氦鏄寚鍦ㄤ袱鏉¤竟鐨勬煇浜涘湴鏂圭殑璺濈灝忎簬杈圭殑瀹瑰樊涔嬪拰錛屼富瑕佸垎涓轟袱縐嶆儏鍐碉紝涓縐嶆槸涓ゆ潯杈瑰彧鏈変竴涓氦鐐圭殑鎯呭喌錛涗竴縐嶆槸鏈夐噸鍙犻儴鍒嗙殑鎯呭喌錛涘厛鐪嬪彧鏈変竴涓氦鐐規(guī)儏鍐碉細(xì) 鎴戜滑鍦―RAW涓氳繃鑴氭湰鏋勯犳渶綆鍗曠殑鎯呭喌鏉ユ祴璇曘?/p>
鍦ㄥ鐞嗚竟涓庤竟鐩鎬氦鐨勫嚱鏁癇OPAlgo_PaveFiller::PerformEE()涓紝瀵規(guī)瘡涓ゆ潯杈硅皟鐢˙OPAlgo_EdgeEdge榪涜姹備氦銆備粠榪欓噷鍙互鐪嬪埌Pave Block鐨勪嬌鐢紝鐩稿綋浜庡姣忎袱鏉¤竟涓婄殑姣忓Pave Block閮ㄥ垎榪涜姹備氦銆傝繖閲屾湁涓浜涗紭鍖栫┖闂達(dá)紝鐩墠鏄嬌鐢ㄧ殑涓や釜寰幆澶勭悊錛屽彲浠ュ皾璇曚嬌鐢˙VH鏉ユ彁鍗囦竴浜涙ц兘銆傚綋姣忓Pave Block瀵瑰簲鐨勭偣鐨勭儲寮曞彿涓鑷存椂錛屽嵆姣忓Pave Block鐨勭鐐歸噸鍙犳椂錛屼嬌鐢ㄥ揩閫熻綆楃殑綆楁硶鏉ュ垽鏂槸鍚︽湁閲嶅彔銆?/p>
瀵逛簬杈圭殑姹備氦緇撴灉淇濆瓨鍒癇OPDS_InterfEE涓紝閮戒細(xì)淇濆瓨鏄摢涓ゆ潯杈圭浉浜ゅ強鐩鎬氦鐨勫叕鍏遍儴鍒嗐傚浜庣浉浜や簬涓鐐圭殑鍏叡閮ㄥ垎鐨勭被鍨嬩負(fù)TopAbs_VERTEX錛屽浜庢湁閲嶅彔閮ㄥ垎鐨勫叕鍏遍儴鍒嗙被鍨嬩負(fù)TopAbs_EDGE錛?/p>
褰撲袱杈規(guī)潯鏈夐噸鍙犻儴鍒嗘椂錛屽涓嬪浘鎵紺猴細(xì) 濡備綍媯嫻嬩袱鏉¤竟鐨勫叕鍏遍儴鍒嗗憿錛熷湪鍑芥暟IntTools_EdgeEdge::IsCoincident()涓疄鐜幫細(xì) 浠庝笂榪頒唬鐮佸彲浠ョ湅鍑猴紝瀵逛簬閲嶅彔閮ㄥ垎鐨勬嫻嬫槸灝嗕竴鏉¤竟鏍規(guī)嵁媯嫻嬭寖鍥村垎鎴?3孌甸噰鏍風(fēng)偣錛岃綆楁瘡涓偣鍒板彟涓鏉¤竟鐨勮窛紱伙紝婊¤凍鏉′歡鐨勯噰鏍風(fēng)偣鐨勬暟閲忚秴榪?2涓紝鍩烘湰璁や負(fù)鏄噸鍙犵殑銆備粠榪欓噷鍙互鐪嬪嚭榪欐牱媯嫻嬮噸鍙犵◢寰湁鐐逛笉涓ヨ皚銆傚浐瀹氶噰鏍風(fēng)偣鏁伴噺瀵逛簬灝忔鏇茬嚎鏉ヨ鏁伴噺榪囧ぇ錛屽浜庡緢闀跨殑鏇茬嚎鏉ヨ鏁伴噺鍙堝亸灝忥紝榪欓噷鏈夊緟鎻愰珮銆傚鏋滈噸鍙狅紝鍒欏皢鍏叡閮ㄥ垎鐨勬暟鎹繚瀛樿搗鏉ワ細(xì) 瀵逛簬嫻嬭瘯鐨凾CL鑴氭湰涓嶄細(xì)璧拌繖涓氱敤鐨勫垽鏂祦紼嬶紝浼?xì)鐩存帴鏈塈ntTools_EdgeEdge::ComputeLineLine()鍑芥暟鏉ュ鐞嗚繖縐嶇壒孌婃儏鍐碉細(xì) 浠庝繚瀛樼殑鏁版嵁鍙互鐪嬪嚭錛屽叕鍏遍儴鍒嗙殑鐩鎬氦綾誨瀷涓篢opAbs_VERTEX錛屽強浜ょ偣鍒嗗埆鍦ㄤ袱鏉¤竟涓婄殑鍙傛暟銆傚叧浜庢湁閲嶅彔閮ㄥ垎鐨勪袱鏉¤竟鐩鎬氦錛屽悓瀛︿滑鍙互鑷浣跨敤DRAW鑴氭湰鏉ユ祴璇曚竴涓嬨?/p>
杈逛笌闈㈢殑鐩鎬氦浼?xì)閬囧埌鍜岃竟涓庤竟鐩镐氦绫讳技鐨勬儏鍐靛Q屽嵆浼?xì)鏈夐噸鍙犻儴鍒咰ommon Part銆備篃鍒嗕負(fù)涓ょ鎯呭喌錛屼竴縐嶆儏鍐墊槸杈逛笌闈㈠彧鏈変竴涓氦鐐圭殑鎯呭喌錛屼氦鐐瑰彲鑳戒細(xì)鏈夊涓紱涓縐嶆儏鍐墊槸鏈夐噸鍙犻儴鍒嗙殑鎯呭喌銆?/p>
鎴戜滑鍙互鍦ㄤ嬌鐢ㄨ剼鏈潵嫻嬭瘯涓涓嬮噸鍙犵殑鎯呭喌錛?/p>
浠庝唬鐮佷腑鍙互鐪嬪嚭褰撹竟鐨勭鐐瑰湪闈笂鏃訛紝鍒欎細(xì)鍒ゆ柇杈逛笌闈細(xì)涓嶄細(xì)閲嶅彔Coincidence銆傚垽鏂昏緫涓庡垽鏂竟鏄惁閲嶅彔綾諱技錛岄兘鏄嬌鐢ㄥ浐瀹?3涓噰鏍風(fēng)偣鐨勬柟寮忓鐞嗭紝騫跺姞涓婂畾浣嶅櫒鏉ュ垽鏂偣鏄惁鍦ㄩ潰涓婏紝鍥犱負(fù)闈笂鍙兘浼?xì)鏈夊瓟娲炲Q?/p>
姹備氦緇撴灉涓庤竟涓庤竟鐩鎬氦綾誨瀷錛屼細(xì)淇濆瓨杈逛笌闈㈢殑绱㈠紩錛屽強鍏叡閮ㄥ垎鐨勬暟鎹傞櫎浜嗕繚瀛樿繖浜涙暟鎹互澶栵紝榪樺拰鐐逛笌闈㈢浉浜や竴鏍鳳紝鏇存柊闈笂鐨勪俊鎭疐aceInfo錛屽嵆鏈夊摢浜涜竟鍦ㄩ潰涓娿?/p>
緇間笂鎵榪幫紝杈逛笌杈廣佽竟涓庨潰鐩鎬氦浼?xì)寰楀埌鍏叡閮ㄥ垎Common Part錛屽叕鍏遍儴鍒嗗彲鑳芥槸鐐癸紝涔熷彲鑳芥槸閲嶅彔鐨勮竟銆傚湪榪囨護(hù)鐩鎬氦鐨勮竟涓庤竟銆佽竟涓庨潰鏃墮兘鏈変竴瀹氱殑浼樺寲絀洪棿錛屽嵆浣跨敤BVH鏉ュ姞閫熸嫻嬬浉浜ら儴鍒嗐傚湪蹇熷垽鏂竟涓庤竟鏄惁閲嶅彔銆佽竟涓庨潰鏄惁閲嶅彔閮ㄥ垎鐨勪唬鐮侀噰鐢ㄥ浐瀹氭暟閲忕殑閲囨牱鐐圭殑澶勭悊鏂瑰紡涓嶅お涓ヨ皚銆傚皢鐩鎬氦鐨勭粨鏋滃強榪囩▼鏁版嵁閮戒繚瀛樺埌BOPDS_DS涓綔涓哄悗闈㈢畻娉曚嬌鐢ㄣ?/p>
ImGui 鏄竴涓敤浜嶤++鐨勭敤鎴風(fēng)晫闈㈠簱錛岃法騫沖彴銆佹棤渚濊禆錛屾敮鎸丱penGL銆丏irectX絳夊縐嶆覆鏌揂PI錛屾槸涓縐嶅嵆鏃禪I錛圛mmediate Mode User Interface錛夊簱錛屼繚鐣欐ā寮忎笌鍗蟲椂妯″紡鐨勫尯鍒弬鑰?a target="_blank" rel="noopener">淇濈暀妯″紡涓庡嵆鏃舵ā寮?/strong>銆侷mGui娓叉煋闈炲父蹇紝浣嗙晫闈笂鏈夊ぇ閲忕殑鏁版嵁闆嗛渶瑕佹覆鏌撳彲鑳戒細(xì)鏈変竴浜涢棶棰橈紝闇瑕佷嬌鐢ㄤ竴浜涚紦瀛樻妧宸с傜紦瀛樺彧鏄伩鍏嶆暟鎹殑鏇存柊閫昏緫鑰楁椂澶箙褰卞搷娓叉煋錛屽疄闄呮覆鏌撹繃紼嬩笉瀛樺湪鐡墮銆?/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)錛岃繖浜涘竷?yōu)當(dāng)绠楀瓙閮藉呣q敤涓濂楁暟鎹粨鏋凚OPDS_DS錛屽叾涓瓨鍌ㄤ簡杈撳叆鏁版嵁鍙婁腑闂寸粨鏋滄暟鎹傚竷?yōu)當(dāng)绠楀瓙鍖呭惈涓ら儴鍒嗗Q?/p>
鐢辨鍙錛屽竷?yōu)當(dāng)鏁版嵁BOPDS_DS鏄竷?yōu)當(dāng)鎿嶄綔涓殑鏁版嵁涓浆绔欏Q屽皢甯冨皵鎿嶄綔鐨勮緭鍏ユ暟鎹強涓棿璁$畻緇撴灉鏁版嵁閮戒繚瀛樿搗鏉ャ傛湰鏂囦富瑕佷粙緇岯OPDS_DS淇濆瓨鐨勬暟鎹?/p>
BOPDS_DS涓瓨鍌ㄧ殑淇℃伅鏈夛細(xì) 榪欓噷鐨凷hapes鏄ā鍨嬩俊鎭疊OPDS_ShapeInfo錛屽瓨鍌ㄦā鍨嬬被鍨嬶紝鍖呭洿鐩掔瓑鏁版嵁錛?/p>
榪欓噷搴旇涓嶉渶瑕佸啀鍙﹀淇濆瓨myType錛屽洜涓哄湪myShape涓彲浠ョ洿鎺ヨ幏鍙栫被鍨嬩俊鎭傛ā鍨嬩俊鎭湪鍒濆鍖栧嚱鏁癐nit()涓潵璁劇疆錛屼富瑕佹槸鍖呭洿鐩掔瓑淇℃伅錛?/p>
鍦ㄥ垵濮嬪寲鍑芥暟涓氳繃涓や釜閫掑綊鍑芥暟TotalShapes()鍜孖nitShape()鏉ユ敹闆嗘墍鏈夋ā鍨嬫暟鎹紝鐒跺悗鍐嶅垎鍒綆楃偣銆佽竟銆侀潰鐨勫寘鍥寸洅銆傝繖浜涘寘鍥寸洅鏁版嵁涓哄悗闈嬌鐢˙VH鐩鎬氦媯嫻嬪仛鍑嗗銆?/p>
鐩鎬氦鏁版嵁Interferences涓昏鐢ㄦ潵淇濆瓨姹備氦緇撴灉鏁版嵁錛屼嬌鐢ㄤ簡綆鍗曠殑媧劇敓鍏崇郴錛屼笉鍚岀殑鐩鎬氦綾誨瀷寰楀埌涓嶅悓鐨勭浉浜ょ粨鏋溿?/p>
淇濆瓨鐨勬暟鎹湁錛?/p>
鍏朵腑Index1鍜孖ndex2涓虹浉浜ょ殑涓や釜妯″瀷鍦˙OPDS_DS涓殑绱㈠紩鍙楓傚浜庣偣Vertex鍜岃竟Edge鐨勭浉浜ょ粨鏋滐紝淇濆瓨浜嗙浉浜ょ偣鍦ㄨ竟涓婄殑鍙傛暟myParam錛?/p>
鍦―RAW涓緭鍏ョ浉鍏崇殑鍛戒護(hù)鍙互鏂逛究鍦板榪欎簺鏁版嵁緇撴瀯榪涜Debug銆?/p>
浠庢簮鐮佸彲浠ョ湅鍑猴紝鍦ㄥ仛姹備氦鐨勫垵濮嬪嚱鏁頒腑鍑嗗浜嗕笁閮ㄥ垎鏁版嵁錛屼竴涓槸BOPDS_DS錛屼竴涓槸BOPDS_Iterator錛岃繕鏈変竴閮ㄥ垎鏄紦瀛樼殑姹備氦宸ュ叿鐨勬暟鎹甀ntTools_Context銆傚悗闈㈠皢緇撳悎DRAW浠g爜瀵笴++婧愮爜璋冭瘯錛屽垎鏋愬竷?yōu)當(dāng)鎿嶄綔涓眰浜ゆ暟鎹瓸OPDS_DS淇濆瓨鐨勫叿浣撴暟鎹?/p>
OpenCASCADE涓柊鐨勫竷?yōu)當(dāng)宸ュ叿TKBO鐩稿宸茬粡搴熷純鐨凾KBool浠g爜鏇磋鑼冿紝鏇存槗浜庣悊瑙c備笌ModelingData鍜孧odelingAlgorithms澶х殑妯″潡緇勭粐涓鏍鳳紝涓昏涔熸槸鏁版嵁緇撴瀯Data Structure+綆楁硶Algorithm鐨勭粍緇囧艦寮忋?/p>
鍏朵腑BOPDS涓哄竷?yōu)當(dāng)涓殑鏁版嵁缁撴瀯閮ㄥ垎锛孊OPAlgo涓哄竷?yōu)當(dāng)涓殑绠楁硶閮ㄥ垎銆傜悊瑙g畻娉曠殑鍓嶆彁鏄厛鐞嗚В鏁版嵁緇撴瀯DS(Data Structure)錛屾墍浠ュ厛浠庢暟鎹粨鏋勫叆鎵嬶紝鏉ユ繁鍏ョ悊瑙e竷?yōu)當(dāng)鎿嶄綔銆傛湰鏂囧厛浠庣畝鍗曠殑鏁版嵁緇撴瀯BOPDS_Iterator寮濮嬪婧愮爜榪涜鍒嗘瀽銆?/p>
浠庣被鐨勬敞閲婂彲浠ョ湅鍑猴紝榪唬鍣˙OPDS_Iterator鏈変互涓嬩袱涓姛鑳斤細(xì) - 鎵懼嚭鍖呭洿鐩掔浉浜ょ殑Shape錛?/p>
- 閬嶅巻鐩鎬氦鐨勪竴瀵筍hape錛?/p>
鍏朵腑鏍稿績鐨勭畻娉曞湪鍑芥暟Intersect()涓紝浠g爜濡備笅鎵紺猴細(xì) 鍦ㄦ眰浜ゅ嚱鏁癐ntersect涓嬌鐢˙VH蹇熸壘鍑哄寘鍥寸洅鏈夌浉浜ょ殑姣忓Shape錛屽茍浠ョ儲寮曠殑褰㈠紡璁板綍涓嬫潵銆備粠榪欎釜鍑芥暟涓彲浠ョ湅鍑哄竷?yōu)當(dāng)鎿嶄綔鏄惁鋴社敤OBB鐨勯夐」鐨勪綔鐢細(xì)褰撲笉浣跨敤OBB鏃訛紝鍙互AABB鍖呭洿鐩掓潵媯嫻嬬浉浜ょ殑Shape錛涘綋浣跨敤OBB鏃訛紝鍦ˋABB鐨勫熀紜涓婅繘涓姝ヤ嬌鐢ㄥ寘鍥存洿绱у瘑鐨凮BB鏉ユ嫻嬬浉浜わ紝鍙互鎺掗櫎閮ㄥ垎銆傚綋鐩鎬氦鐨勬ā鍨嬩腑浠ABB媯嫻嬪氨鑳芥嫻嬪嚭鏉ョ殑錛屽啀鎵撳紑OBB閫夐」錛屼笉浼?xì)鎻愰珮鎬ц兘錛屽弽鑰屼細(xì)鏈夋墍闄嶄綆銆備負(fù)浜嗗噺灝戣繖涓獎鍝嶏紝鍦↖ntTools_Context涓紦瀛楥aching榪欎簺OBB錛岄伩鍏嶆瀯閫燨BB甯︽潵鐨勬ц兘鎹熷け銆?/p>
甯冨皵榪唬鍣˙OPDS_Iterator閫氳繃BVH鎵懼嚭姹備氦鐨勬ā鍨嬩腑姣忓鍖呭洿鐩掓湁鐩鎬氦鐨勬ā鍨嬪茍鎻愪緵閬嶅巻姣忓鍖呭洿鐩掔浉浜ょ殑妯″瀷鐨勫姛鑳斤紝涓哄悗闈㈡眰浜や綔鍑嗗銆備粠鍏朵唬鐮佸疄鐜板彲浠ョ湅鍑哄竷?yōu)當(dāng)閫夐」浣跨敤OBB瀵規(guī)ц兘鎻愰珮鏄湁闄愮殑錛屽綋浣跨敤AABB鑳芥嫻嬪嚭鏉ョ殑錛屽啀浣跨敤OBB浼?xì)闄嶄綆鎬ц兘銆傚綋浣跨敤AABB媯嫻嬪嚭鏉ョ浉浜わ紝浣哋BB涓嶇浉浜ょ殑鍦烘櫙瀵規(guī)ц兘鎻愬崌鏄庢樉銆?/p>
浠婃棩鏄?#8220;涔?jié)涓鍏簨鍙?#8221;92鍛ㄥ勾錛岃惤鍚庡氨瑕佹尐鎵擄紝鍚捐緢浠嶉渶鍔姏銆?/p> 緇忓父鐢╒isual Studio鍐欎竴浜涘皬紼嬪簭鏉ラ獙璇丱penCASCADE鐨勫姛鑳斤紝姣忔鍒涘緩欏圭洰鍚庨兘閰嶇疆澶存枃浠訛紝搴撹礬寰勶紝紼嬪簭榪愯鏃惰繕瑕侀厤緗瓺ebug鐨勭幆澧冨彉閲忥紝姣旇緝楹葷儲銆備篃灝濊瘯榪嘋Make鍜孮Make錛岄兘涓嶅お鐞嗘兂銆侰Make瀛︿範(fàn)鏇茬嚎闄″抄涓鐐癸紝榪樹細(xì)鐢熸垚涓鍫嗘枃浠躲俀Make綆鍗曚簺錛屼絾鏄湁鐨勯夐」涓嶆敮鎸併傜洿鍒扮湅鍒頒竴涓紑婧愮殑娓告垙紼嬪簭Overload錛岀湅鍏剁紪璇戣鏄庝嬌鐢ㄤ簡Premake鏉ユ瀯寤恒?/p>
浣跨敤IMGUI鐢熸垚鐨勮蔣浠剁晫闈㈡瘮杈冮叿鐐紝浣跨敤Premake鐢熸垚Visual Studio瑙e喅鏂規(guī)銆?/p>
鏋勫緩緋葷粺錛圔uildSystem錛夋槸鐢ㄦ潵浠庢簮鐮佺敓鎴愮敤鎴峰彲浠ヤ嬌鐢ㄧ殑鐩爣錛圱argets錛夌殑鑷姩鍖栧伐鍏楓傜洰鏍囧彲浠ュ寘鎷簱錛屽彲鎵ц鏂囦歡錛屾垨鑰呯敓鎴愮殑鑴氭湰絳夌瓑銆?/p>
欏圭洰妯″潡渚濊禆鍏崇郴緇存姢 錛?/p>
鐩爣鐨勫彲閰嶇疆鍖栵紙涓嶅悓緋葷粺錛歐indows錛孧ac…錛涗笉鍚屽鉤鍙幫細(xì)Win32錛學(xué)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 鏄竴縐嶅懡浠ゅ伐鍏鳳紝閫氳繃璇誨彇欏圭洰鑴氭湰錛屾潵鐢熸垚鍚勭寮鍙戠幆澧冪殑欏圭洰鏂囦歡銆備富瑕佺敤浜庯細(xì) 鐢熸垚寮鍙戜漢鍛樺枩嬈㈢殑騫沖彴錛屽伐鍏烽泦錛堝崗鍚屽紑鍙戠殑浜哄憳錛屽彲浠ヤ嬌鐢ㄤ笉鍚岀殑騫沖彴鍜屽紑鍙戝伐鍏鳳級 閫氳繃鑴氭湰淇濇寔涓嶅悓騫沖彴錛屽伐鍏烽泦涓嬬殑欏圭洰閰嶇疆鍚屾錛堟瘮濡傛柊寤烘枃浠跺す錛屽紩鍏ユ柊鐨勫簱鏂囦歡錛?/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搴旂敤紼嬪簭錛屽彂甯冧負(fù)涓涓崟涓殑錛岄潪甯稿皬鐨別xe鏂囦歡銆傛敮鎸佸畬鏁寸殑Lua鑴氭湰鐜 寮婧愬湴鍧錛歨ttps://github.com/premake/premake-core 涓嬭澆鍦板潃錛歨ttps://premake.github.io/ 瀹炰緥鍦板潃錛?a >https://github.com/wuguyannian/tutorial_premake 浣跨敤premake鏉ユ瀯寤轟竴涓嬌鐢ㄤ簡glfw, occt鍜宨mgui鐨勭▼搴忋備粠閰嶇疆鏂囦歡鍙互鐪嬪嚭錛岄厤緗瘮CMake瑕佺畝鍗曪細(xì) 閫氳繃premake鐢熸垚鐨刅isual Studio瑙e喅鏂規(guī)寰堝共鍑錛屾病鏈夊浣欑殑鏂囦歡銆傚悗闈㈠啀瑕佸啓涓涓皬鐨勯獙璇佺▼搴忔椂錛屽彧闇瑕佸鍒秔remake5.lua淇敼涓涓嬪嵆鍙紝寰堟柟渚褲傚浜庡皬鐨勯獙璇佺▼搴忔潵璇達(dá)紝浣跨敤premake鏄悊鎯崇殑鏋勫緩宸ュ叿銆?/p>
濡傛灉浠庝簨榪嘋++ Windows瀹㈡埛绔紑鍙戯紝澶у瀵筂FC銆丵t銆丏uiLib銆乄xWidgets絳夊悇縐岲irectUI搴旇鏈変簡瑙o紝鏈瘒緇欏ぇ瀹朵粙緇嶄竴涓秴綰ц交閲忕駭鐨凜++寮婧愯法騫沖彴鍥懼艦鐣岄潰妗嗘灦ImGUI. ImGUI涓昏鐢ㄤ簬娓告垙琛屼笟錛屾墍鏈夌殑鎺т歡閮介渶瑕佹墜緇樺疄鐜幫紝褰撶劧鎬ц兘涔熸槸婊℃弧鐨勶紝姣曠珶鏄洿鎺ョ敤dx/opengl鏉ュ疄鐜般侷mGUI浠撳簱錛歨ttps://github.com/ocornut/imgui ImGUI鍙堢О涓篋ear ImGui錛屽畠鏄笌騫沖彴鏃犲叧鐨凜++杞婚噺綰ц法騫沖彴鍥懼艦鐣岄潰搴擄紝娌℃湁浠諱綍絎笁鏂逛緷璧栵紝鍙互灝咺mGUI鐨勬簮鐮佺洿鎺ュ姞鍒伴」鐩腑浣跨敤錛屼篃鍙互緙栬瘧鎴恉ll, ImGUI浣跨敤DX鎴栬匫penGL榪涜鐣岄潰娓叉煋錛屽浜庣敾闈㈣川閲忚姹傝緝楂橈紝渚嬪瀹㈡埛绔父鎴忥紝4k/8k瑙嗛鎾斁鏃訛紝鐢↖mGUI鏄緢濂界殑閫夋嫨錛屽綋鐒訛紝浣犲緱闈炲父鐔熸?zhèn)塂irectX鎴栬匫penGL錛屼笉鐒跺氨鏄疂鍓戝湪鎵嬶紝灞犻緳鏃犲姏銆傜浉瀵逛簬Qt銆丮FC銆丏uiLib銆丼OUI絳夛紝ImGUI鐨勬嫇灞曟ф洿濂斤紝涔熸洿杞婚噺綰э紝褰撶劧瀵逛簬寮鍙戣呯殑瑕佹眰涔熸洿楂?ImGUI娌℃湁綾諱技浜嶲t/MFC榪欑錛屽彲浠ユ嫋鎷芥帶浠惰繘琛屾惌寤虹晫闈紝ImGUI鐨勬墍鏈夋帶浠墮兘蹇呴』鎵嬪啓瀹炵幇銆侷mGUI鐨刣emo鍩烘湰鎻愪緵浜嗘墍鏈夋帶浠躲佸浘琛ㄧ瓑鐨勫疄鐜幫紝婧愮爜涔熸湁錛屽彲浠ュ鐓х殑瀛︿範(fàn)銆傚湪PC绔妧鏈夊瀷鏃訛紝濡傛灉鍏徃鏈夐煶瑙嗛銆佸浘褰㈠浘鍍忋?k/8k瑙嗛涓氬姟錛屾垨鑰呬竴浜涚畝鍗曠殑UI鍙互鑰冭檻涓涓嬩嬌鐢↖mGUI錛屾瘯绔熸槸鐩存帴浣跨敤DX/OpenGL鏉ヨ繘琛岀粯鍒舵覆鏌擄紝鍏跺畠鍔熻兘灝辯洿鎺ヤ嬌鐢–++鏉ュ疄鐜般?/p>
OpenCASCADE鎻愪緵浜嗕竴涓狦LFW鐨勭ず渚嬬▼搴忥紝灝哋penCASCADE涓嶪MGUI闆嗘垚璧鋒潵錛屽浜庡疄鐜頒竴浜涚畝鍗曠殑灝忕殑涓夌淮搴旂敤紼嬪簭鐨刄I錛屾湁婊℃弧鐨勭鎶鎰熴傚緢澶氭父鎴忕浉鍏崇殑灝忕▼搴忛兘鏄嬌鐢↖MGUI鏉ュ仛鐣岄潰銆?/p>
鍏朵腑OpenCASCAE寮婧愮殑鍏夌嚎榪借釜紼嬪簭CADRays鐨刄I灝辨槸鐢↖MGUI瀹炵幇鐨勶細(xì) IMGUI涔熸敮鎸丏ocking錛屽父瑙佺殑鎺т歡閮芥湁錛屽茍涓斾篃鏀寔璺ㄥ鉤鍙幫紝鍙緷璧朞penGL錛岀敓鎴愮殑紼嬪簭浣撶Н寰堝皬銆?/p>
浣跨敤GLFW閰嶇疆IMGUI鍙互瀹炵幇璺ㄥ鉤鍙扮殑鐣岄潰寮鍙戯紝瀵逛簬涓嶅鏉傜殑搴旂敤紼嬪簭鏄釜涓嶉敊鐨勯夋嫨銆?/p>
浠?950騫寸涓鍙板浘褰㈡樉紺哄櫒錛堢編鍥介夯鐪佺悊宸ュぇ瀛IT鏃嬮I鍙稺hirlwind I錛夌殑璇炵敓錛屽埌1962騫碝IT鏋楄偗瀹為獙瀹ょ殑Ivan E. Sutherland鍙戣〃棰樹負(fù)“Sketchpad: 涓涓漢鏈轟氦浜掔殑鍥懼艦緋葷粺”紜畾璁$畻鏈哄浘褰㈠浣滀負(fù)鐙珛縐戝鍒嗘敮銆傜粡榪?0澶氬勾鐨勫彂灞曪紝璁$畻鏈哄浘褰㈠涓殑鍑犱綍閫犲瀷鎶鏈垚浜嗙幇鍦ㄧ殑鍑犱綍鍐呮牳銆?/p>
鏁板鏄垜浠粠灝忓銆佷腑瀛﹀埌澶у涓鐩撮兘鍦ㄥ涔?fàn)鐨勮瘎〃嬪Q屾槸鐜頒唬縐戞妧鐨勭悊璁哄熀紜錛屾槸鍒涙柊鐨勬簮娉夈傚嚑浣曞唴鏍鎬笌鏁板鐨勮仈緋婚潪甯哥揣瀵嗭紝緇撳悎寮婧愬嚑浣曞唴鏍竜pencascade璋堣皥瀛︿範(fàn)榪囩▼鍜屾暟瀛︾殑璁よ瘑銆?/p>
鍦ㄥ垰瀛︿範(fàn)鐨勬椂鍊欙紝鎬繪槸鍏堜粠綆鍗曠殑寮濮嬪叆鎵嬨傛瘮濡傦紝鍏堢湅鐪嬬洿綰褲佸渾鏄粈涔堬紝鎬庝箞鏄劇ず鍑烘潵銆傞暱鏂逛綋銆佸渾鏌變綋絳夋庝箞鐢˙REP榪涜琛ㄧず錛屾庝箞鏄劇ず鍦ㄥ睆騫曚笂銆傝繖涓椂鍊欒冭檻闂鏄父浜烘濈淮錛屾垜璁や負(fù)鏄珮涓椂浠c?/p>
姣斿錛屾庝箞璁$畻浜岀淮鐩寸嚎涓庡渾鐨勪氦鐐瑰憿錛熶笂榪囬珮涓殑閮藉榪囷紝鑱旂珛鐩寸嚎涓庡渾鐨勪竴鍏冧簩嬈℃柟紼嬬粍錛屽皢瑙f柟紼嬬粍鐨勪唬鐮佸浐鍖栧湪浠g爜涓傚綋璁$畻妞渾涓庡渾鐨勪氦鐐規(guī)椂錛屼篃鍋氬悓鏍風(fēng)殑澶勭悊錛屽氨鏄鍐欑偣浠g爜銆傞珮涓嚑浣曞寰楀ソ鐨勶紝鍙兘浼?xì)璇存垜鍙互鐢ㄥ悜閲忓Q屽悜閲忕殑鏂規(guī)硶浼?xì)姣斾唬鏁扮殑鏂规硶閫熷害瑕佸揩銆?/p>
鍐嶆瘮濡傦紝鎬庝箞璁$畻鏇茬嚎鐨勫姬闀垮拰鏇查潰鐨勯潰縐憿錛熻綆楁洸綰垮彲浠ラ氳繃瀵規(guī)洸綰胯繘琛岄噰鏍風(fēng)偣錛屽皢鐐硅繛鎴愬孌電嚎錛屽啀鍒嗗埆璁$畻姣忓皬孌電嚎孌電殑闀垮害绱姞灝辨槸浜嗐傞潰縐挶浠篃鍙互綾諱技澶勭悊錛屽皢鏇查潰紱繪暎鎴愪笁瑙掑艦鎴栧洓杈瑰艦錛屽啀灝嗚繖浜涗笁瑙掑艦鎴栧洓杈瑰艦闈㈢Н绱姞銆傝繖浜涙柟娉曢兘鑳藉疄鐜幫紝浣嗘槸鎬ц兘銆佺簿搴﹂兘浼?xì)鎴愪负闂銆傝璁$畻寰楃簿搴﹂珮錛岄噰鏍峰氨瑕佸瘑錛屽氨浼?xì)甯︽潵鎬ц兘闂銆?/p>
鍒頒簡澶у鏃朵唬瀛︿範(fàn)榪囬珮絳夋暟瀛︺佺嚎鎬т唬鏁扮瓑錛屾湁浜嗘洿鏈夊姏鐨勫伐鍏鋒潵瑙e喅鏇翠竴鑸棶棰樸傞潰鍚戝璞$紪紼嬪拰鏁板涔熸槸鐩擱氱殑錛屽氨鏄皢闂鎶借薄鐨勮兘鍔涖傝繖涓椂鍊欑溂涓病鏈夌洿綰褲佸渾銆丅鏍鋒潯鏇茬嚎銆佸鉤闈€佺悆闈€丅鏍鋒潯鏇查潰絳夌瓑錛屽彧鏈夌嚎Curve鍜岄潰Surface銆?/p>
鍐嶈繘涓姝ユ娊璞★紝灝嗙嚎Curve涓庝竴鍏冨嚱鏁癋(x)瀵瑰簲錛屽皢闈urface涓庡鍏冨嚱鏁板搴擣(x,y)錛屼笌鏁板寤虹珛浜嗚仈緋匯?/p>
榪欐椂灝卞彲浠ヤ嬌鐢ㄦ暟瀛﹀伐鍏峰闂榪涜澶勭悊浜嗐傚璁$畻鏇茬嚎寮ч暱錛屽氨鍙樻垚涓涓鍒囧悜閲忕殑縐垎銆傛洸綰垮垏鍚戦噺闇瑕佽綆椾竴闃跺鏁幫紝銆奣he NURBS Book銆嬬瓑涔︿笂璁$畻B鏍鋒潯寰垎鐨勫叕寮忓氨鏈夌敤錛岀湅寰匓鏍鋒潯鏇茬嚎鍜岀湅寰呭渾涓鏍蜂簡銆?/p>
縐垎鐨勮綆楀彲浠ヤ嬌鐢ㄦ暟鍊兼柟娉曪紝濡侼ewton-Cotes鎴朑auss縐垎娉曪紝浣跨敤鏇村皯鐨勮凱浠h幏寰楁洿楂樼殑綺懼害錛岀▼搴忎紭鍖栫殑鏂瑰悜涔熸竻鏅般?/p>
浠巓pencascade鐨勭被math_Function鍜宮ath_MultipleVarFunction鍙互鍙互鐪嬪嚭錛岃澶氬嚑浣曢棶棰橀兘鎶借薄鎴愪簡鏁板闂銆傛湁寰堝浜洪棶鎴戯紝鎬庢牱鎵嶇畻鍏ラ棬浜唎pencascade鍛紵閭e氨鏄濊冮棶棰樼殑鏂瑰紡杞崲鎴愭暟瀛︾殑鏂瑰紡錛屾垜瑙夊緱灝辯畻鍏ラ棬浜嗐傚啀鍏蜂綋鐐瑰彲鎿嶄綔鐐瑰憿錛?strong>棣栧厛灝辨槸鏁版嵁緇撴瀯鐨勫叆闂紝鎺屾彙BREP杈圭晫琛ㄧず娉曪紝濡傚湪鍦嗘煴闈urface涓婃鍑轟竴涓皬闈㈢墖Face錛岃兘姝e父鏄劇ず鍑烘潵灝辯畻鐞嗚Вopencascade涓殑BREP緇撴瀯銆傚叾嬈℃槸鍑犱綍綆楁硶鍏ラ棬錛屽氨鏄皢浠巑ath_Function鍜宮ath_MultipleVarFunction鎵鏈夌殑媧劇敓綾葷殑鏁板鍏紡鍐欏嚭鏉ャ?/strong>榪欎袱鐐瑰姩鎵嬪仛瀹岋紝鎴戣寰楀彲浠ョ畻鍏ラ棬浜嗐?/p>
濡傛灉澶у鏃朵唬鎴戜滑鎺屾彙浜嗗井鍒嗐佺Н鍒嗐佺嚎鎬т唬鏁幫紝鍒扮爺絀剁敓鏃朵唬搴旇鎺屾彙鍙樺垎銆佸亸寰垎鏂圭▼銆佹渶浼樺寲鐞嗚絳夌瓑銆傚鍋忓井鍒嗘柟紼嬬敤浜庢瀯閫犺繃娓℃洸闈紝鏇茬嚎鏇查潰鎷熷悎鍏夐『鏈鍚庨兘鎶借薄鎴愬甫綰︽潫鐨勯潪綰挎ф柟紼嬬粍鐨勬眰瑙c?/p>
鍒扮爺絀剁敓鏃朵唬鍥犱負(fù)鎺屾彙鐨勬暟瀛﹀伐鍏鳳紝浼?xì)澶勭悊鐪嬩笂鍘诲緢绠鍗曚絾澶勭悊璧鋒潵鏇村鏉傜殑闂錛氬涓婂浘鎵紺虹殑榪囨浮Blend錛屼互鍙婅挋闈kinning鍜屾壂鎺燬weep絳夈?/p>
榪欐椂涔熷彲浠ユ湁涓浜涙櫤鑳界畻娉曪紝濡傞仐浼犵畻娉曘佽殎緹わ紝綺掑瓙緹SO浼樺寲綆楁硶錛孉I絳夛紝浣跨敤浠跨敓銆侀仐浼犲彉寮傜瓑鎵嬫浣挎眰瑙h凱浠f洿蹇敹鏁涖備負(fù)浼犵粺浼樺寲綆楁硶鎻愪緵鍒濆瑙o紝浣夸紶緇熺畻娉曡兘鏇村揩銆佹洿鍑嗗湴鎵懼埌瑙f瀽瑙o紝涓嶈嚦浜庢繁闄峰眬閮ㄦ渶浼樿В涓笉鑳借嚜鎷斻傚湪opencascade涓篃鏈夌浉鍏沖疄渚嬶紝濡俶ath_PSO銆傝繖浜涙櫤鑳界畻娉曟湁闅忔満鎬э紝涓嶅儚瑙f瀽綆楁硶閭f牱婊¤凍涓瀹氱害鏉熸潯浠跺繀瀹氫細(xì)鎵懼埌鐩稿鍑嗙‘絳旀銆傚彧鑳戒綔涓哄儚鏇查潰姹備氦涔嬬綉鏍肩鏁f硶錛屼綔涓哄弬鏁拌凱浠f硶鐨勯澶勭悊銆傚埌榪欎釜鏃朵唬錛屾煡鐪嬬浉鍏蟲妧鏈鏂囨鏃犲帇鍔涳紝闈㈠涓鑸殑鍑犱綍闂閮藉簲璇ュ彲浠ヤ粠瀹瑰簲瀵廣傚拰鐮旂┒鐢熶竴鏍烽潰瀵圭殑闂鏇村姞鍏蜂綋錛屼細(xì)閽葷墰瑙掑皷銆?/p>
緇間笂鎵榪幫紝鍑犱綍鍐呮牳鍙互鐪嬫垚涓涓暟瀛﹀簱鐨勫瓙闆嗭紝鍙槸鍦ㄥ嚑浣曞浘褰笂鐨勫簲鐢ㄣ傚涔?fàn)鍑犱綍鍐呮牳鐨剺q囩▼綾繪瘮浜庡鐢熸椂浠f帉鎻$殑鏁板宸ュ叿銆傚湪楂樹腑鏃朵唬錛岀湅闂寰堝叿浣擄紝鍙兘case by case鐨勫鐞嗭紝鍔熻兘鑳藉仛鍑烘潵銆傚埌澶у鏃朵唬錛屾湁浜嗕竴瀹氱殑鎶借薄鑳藉姏錛堜笌闈㈠悜瀵硅薄緙栫▼涓鏍鳳級錛岀湅闂鍏鋒湁涓鑸э紝鑳戒嬌鐢ㄦ洿楂樼駭鐐圭殑鏁板宸ュ叿鏉ュ鐞嗭紝鏈夎兘鍔涙潵鍏奸【綺懼害鍜屾ц兘銆傚埌浜嗙爺絀剁敓鏃朵唬錛屽氨涓嶆曞埆浜烘潵鍗¤剸瀛愶紝鐢氳嚦鑳借秴瓚婂埆浜恒傝繖涓椂鍊欎笉瑕佺粰鑷繁璁鵑檺錛屾壘鍑嗗枩嬈㈢殑鏂瑰悜鍘婚捇鐗涜灝栵紝緇堜細(xì)鏈夋墍鎴愩?/p>
Abstract. OpenCascade classify the intersection line between two surfaces. A intersection line may be either geometric: line, circle, ellipse, parabola, hyperbola as defined in the class GLine, or analytic as defined in the class ALine, or defined by a set of points(coming from a walking algorithm) as defined in the class WLine. Or described by a restriction line on one of the surfaces as RLine. Key Words. Surface Intersection, Intersection Line OpenCASCADE涓涓や釜鏇查潰姹備氦寰楀埌鐨勪氦綰胯繘琛屼簡鍒嗙被錛屽涓嬬被鍥炬墍紺猴細(xì) 浜ょ嚎鎬誨叡鍒嗕負(fù)鍥涚被錛?/p>
涓嬮潰鎴戜滑浣跨敤Tcl鑴氭湰鍦―RAW涓獙璇佷竴涓嬭繖鍥涚被浜ょ嚎鐨勬潵婧愶紝鍔犳繁瀵規(guī)洸闈㈡眰浜ょ畻娉曠殑鐞嗚В銆傚垎綾誨甫鏉ヤ簡楹葷儲錛屽彲浠ュ甫鐫闂錛氫負(fù)浠涔堣鍒嗚繖鍑犵綾誨瀷錛熸湁浠涔堝ソ澶勶紵鏉ョ湅榪欑瘒鏂囩珷銆傝鐢ㄥソ寮婧愮殑涓滆タ錛屽叾瀹炶姹傝繕鏄緢楂樼殑錛岄渶瑕佸婧愮爜鏈夌浉瀵規(guī)繁鍏ョ殑鐞嗚В銆?/p>
Analytic浜ょ嚎鏄簩嬈℃洸闈㈡眰浜ゆ墍寰楋紝浜屾鏇查潰鏄洜涓哄彲浠ョ粺涓浣跨敤浜屾鍨嬫潵琛ㄧず鐨勮В鏋愭洸闈紝涔熸槸銆婅В鏋愬嚑浣曘嬩腑鐮旂┒鐨勪富瑕佸唴瀹廣傛垜浠彲浠ュ湪DRAW涓瀯閫犲渾鏌遍潰涓庡渾閿ラ潰姹備氦楠岃瘉涓涓嬨俆CL鑴氭湰濡備笅錛?/p>
鐢熸垚緇撴灉濡備笅鍥炬墍紺猴紝鍏朵腑綰㈣壊涓轟氦綰匡細(xì) DEBUG婧愮爜鍙互鐪嬪埌鏄嬌鐢ㄧ被IntPatch_ImpImpIntersection 璁$畻姹備氦錛屽嵆涓や釜瑙f瀽鏇查潰姹備氦綆楁硶綾匯?/p>
Geometric鍑犱綍鏇茬嚎褰㈠紡綆鍗曪紝濡傛灉浜ょ嚎鐢ㄥ嚑浣曟洸綰挎潵琛ㄧず錛屽浜庡悗緇畻娉曟湁濂藉銆傚騫抽潰涓庡渾閿ラ潰姹備氦綰匡紝鍦嗘煴闈笌鍦嗘煴闈㈡眰浜ょ瓑錛岄兘浼?xì)寰楀埌鍑犱綍鏇簿U褲傚皢涓婇潰鐨勫渾鏌遍潰鎹㈡垚騫抽潰涓庡渾閿ラ潰姹備氦鎴戜滑鍙互鍦―RAW楠岃瘉緇忓吀鐨勫渾閿ヤ笌騫抽潰浜ょ嚎錛氭牴鎹鉤闈綅緗笉鍚岋紝鍙互寰楀埌鍦嗐佹き鍦嗐佸弻鏇茬嚎絳夊嚑浣曟洸綰褲俆CL鑴氭湰濡備笅鎵紺猴細(xì) 璁$畻浜ょ嚎緇撴灉濡備笅鍥炬墍紺猴細(xì) 鎴戜滑鏀瑰彉騫抽潰鐨勬硶鍚戯紝浣垮叾鏂滅潃涓庡渾閿ラ潰姹備氦錛屼細(xì)寰楀埌妞渾錛?/p>
榪樺彲浠ュ緱鍒板弻鏇茬嚎銆佹姏鐗╃嚎絳夛紝鍚屽浠彲浠ヨ嚜宸卞皾璇曚竴涓嬨?/p>
瀵逛簬NURBS鏇查潰姹備氦錛屼竴鑸細(xì)浣跨敤Marching鏂規(guī)硶錛屽浗鍐呮暀鏉愮炕璇戜負(fù)榪借釜娉曘傚湪鐪嬨婂湴鐞冭剦鍔ㄣ嬫椂錛屾敞鎰忓埌瀵逛簬澶ц崏鍘熶笂鐨勬按鐗涖佸ぇ璞$瓑鍔ㄧ墿鎴愮兢緇撻槦鐨勮縼寰欎嬌鐢ㄤ簡榪欎釜璇嶏紝榪欎釜璇嶇殑瀛楅潰鎰忔濇湁琛岃繘銆佽鍐涳紝鍒楅槦琛岃繘涔嬫剰錛屽鏋滅粨鍚坥pencascade涓殑walking鎰熻緲昏瘧涓?strong>琛岃繘娉?/strong>鏇磋創(chuàng)鍒囷紝鍥犱負(fù)鍦╫pencascade涓浜庢眰浜や笓闂ㄦ湁涓猵ackage鍚嶄負(fù)IntWalk錛屽叾涓被IntWalk_PWalking鏉ヤ嬌鐢╩arching method瀵逛袱涓弬鏁版洸闈㈣繘琛屾眰浜ゃ俉alk鏈夎璧頒箣鎰忥紝鎵浠ュ浜庝嬌鐢╓alk鏂規(guī)硶寰楀埌鐨勪氦綰垮懡鍚嶄負(fù)WLine銆傚浜嶯URBS鏇查潰姹備氦鍙婁簩嬈℃洸闈笌NURBS鏇查潰姹備氦錛屼嬌鐢ㄤ簡Marching鏂規(guī)硶錛學(xué)Line鐨勬潵婧愭槸娓呮櫚鐨勩傜戶緇嬌鐢ㄤ笂闈㈢殑鑴氭湰錛屽彧闇瑕佸皢涓婅堪涓や釜闈㈣漿鎹㈡垚NURBS鏇查潰鍗沖彲瑙﹀彂Marching娉曡繘琛屾眰浜ゃ俆CL鑴氭湰濡備笅錛?/p>
閫氳繃IntWalk_PWalking琛岃繘娉?/strong>閰嶅悎涓夊弬鏁拌凱浠f硶錛屽皢琛岃繘榪囩▼涓殑浜ょ偣閮戒繚瀛樺湪WLine涓?/p>
铏界劧緇撴灉涓庝笂闈㈢湅涓婂幓涓鏍鳳紝鍐呴儴浜ょ嚎宸茬粡涓嶆槸綆鍗曠殑鍑犱綍鏇茬嚎浜嗐?/p>
Restriction浜ょ嚎鏄彈闄愪氦綰匡紝榪欑綾誨瀷鐨勪氦綰垮彧浼?xì)浣嶄簬涓涓潰涓娿傝繖閲屾垜浠瀯閫犱竴涓鉤闈㈠強涓庡鉤闈㈤噸鍙犵殑涓涓狽URBS鏇查潰鏉ユ眰浜よ繘琛岃В閲娿俆CL鑴氭湰濡備笅錛?/p>
DEBUG浼?xì)鍙戠幇杩欎袱涓洸闈㈢殑浜ぞU夸負(fù)RLine錛屽茍鍦ㄧ敓鎴怰Line鏃舵寚瀹氫氦綰垮睘浜庡摢涓洸闈紝鏄湪S1鏇查潰SetArcOnS1榪樻槸鍦⊿2鏇查潰SetArcOnS2錛?/p>
鐢熸垚浜ょ嚎濡備笅鍥炬墍紺猴細(xì) 褰撶劧鍙互浣跨敤RLine鏉ュ垽鏂袱涓洸闈㈡槸鍚︽湁閲嶅彔錛屼絾鏄湪opencascade涓袱涓洸闈㈤噸鍙犲彨Tangent Face錛屽彲浠ュ皢涓婅堪NURBS闈笉杞崲錛岃繕鏄嬌鐢ㄤ袱涓噸鍙犲鉤闈㈡潵楠岃瘉錛?/p>
姹備氦鏈鍚庡浜ょ嚎鏁版嵁褰掑茍鏃剁殑浠g爜鏈夌偣涓嶆暍鎭淮錛?/p>
緇間笂鎵榪幫紝瀵逛袱涓洸闈㈡眰浜ゅ緱鍒扮殑浜ょ嚎榪涜鍒嗙被錛岄伩鍏嶄氦綰塊兘鏄疦URBS鏇茬嚎錛屽彲浠ユ槸綆鍗曠殑浜屾鏇茬嚎錛屾彁楂樺悗緇畻娉曟ц兘銆傚湪鐞嗚В婧愮爜鐨勫熀紜涓婏紝鍙互鏍規(guī)嵁瀹為檯搴旂敤鍦烘櫙閫夋嫨楂樻晥鐨勭畻娉曘傚鑻ュ彧鏄眰涓や釜妯″瀷涔嬮棿鐨勪氦綰匡紝鍙互鐩存帴浣跨敤鏇查潰姹備氦綆楁硶錛屼竴鑸儏鍐典笅鎬ц兘榪樻槸涓嶉敊鐨勩傚綋鐒剁悊瑙f簮鐮佸悗錛屽彲浠ョ粨鍚堝疄闄呭簲鐢ㄥ満鏅彲浠ュ姹備氦綆楁硶鍋氳繘涓姝ヤ紭鍖栥?/p>
瑕佹繁鍏ョ悊瑙pencascade婧愮爜錛岀啛緇冧嬌鐢―RAW鏄竴涓浉瀵瑰鏄撶殑璺嚎銆傚洜涓哄湪DRAW涓彲浠ヤ嬌鐢═cl鑴氭湰蹇熼獙璇佸悇縐嶆兂娉曪紝鐢氳嚦鐩存帴DEBUG婧愮爜錛屼粠琛ㄥ悜娣卞叆鍒頒笌婧愮爜浣滆呯洿鎺ュ璇濄?/p>
Abstract. OpenCASCADE provides BVH to achieve high performance in AIS of visualization module. To understand BVH usage will help us to understand many code of opencascade. Key Words. BVH, Bounding Volume Hierarchy, LBVH, SAH Algorithm 灞傛鍖呭洿浣撴妧鏈?(BVH) 鎸囩殑鏄皢鎵鏈夊寘鍥翠綋鍒嗗眰閫愭鍦板啀嬈″寘鍥達(dá)紝鑾峰緱涓涓洿澶х殑鍖呭洿浣擄紝鐩村埌鍖呭洿浣忔墍鏈夌墿浣撱傚疄闄呬笂錛屽畠鏄竴涓爲(wèi)褰㈢粨鏋勶紝鍥犳鍙互浠跨収鏍?wèi)鐨劸l撴瀯錛屽皢涓や釜鎴栦笁涓皬鐨勫寘鍥翠綋鍖呭洿鎴愪竴涓洿澶х殑鍖呭洿浣擄紝浠ユ綾繪帹銆?/p>
BVH鏄竴縐嶄互鐗╀綋BV涓哄熀紜榪涜鍒掑垎鐨勭粨鏋勩傚畠鐢辨牴鑺傜偣銆佸唴閮ㄨ妭鐐瑰拰鍙跺瓙鑺傜偣緇勬垚銆傚叾涓彾瀛愯妭鐐瑰瓨鏀劇墿浣擄紝姣忎釜闈炲彾瀛愯妭鐐歸兘鏈夊寘鍥翠綋錛岀埗鑺傜偣鍙互鎶婂瓙鑺傜偣鍖呭洿璧鋒潵銆傛瘡涓潪鍙跺瓙鑺傜偣鐨勫寘鍥翠綋澶у皬錛屾槸瀹冩墍鍖呭惈鐨勬墍鏈夌墿浣撶殑鍖呭洿浣撶殑鎬誨拰錛屾墍浠ュ畠鍦ㄧ┖闂翠笂姣旇緝绱у噾錛岄潪甯擱傜敤浜庨渶瑕佸ぇ閲忔眰鐩鎬氦嫻嬭瘯鐨勫簲鐢ㄥ満鏅紝濡傚厜綰胯拷韙佺鎾炴嫻嬨佸皠綰跨浉浜ゆ祴璇曚箣綾葷殑搴旂敤鍦哄悎涓?/p>
BVH鍦∣penCASCADE涓篃鏈夊箍娉涘湴搴旂敤錛屽寮婧愮増鏈腑鐨勬ā鍨嬪揩閫熺鎾炴嫻嬶紝浣跨敤綾籅RepExtrema_ShapeProximity. 妯″瀷閫夋嫨鎿嶄綔錛屽厜綰胯窡韙瓑綆楁硶涓兘鏈夊簲鐢ㄣ傚湪 https://www.cnblogs.com/opencascade/p/6804446.html 涓粙緇嶅浣曢亶鍘咮VH鏍?wèi)锛屾湰鏂囦富瑕佷粙缁岯VH浣跨敤鏂規(guī)硶銆?/p>
OpenCASCADE涓殑BVH鏄浉瀵圭嫭绔嬬殑涓涓寘錛屾槸浣滆呮牴鎹鏂囧疄鐜扮殑綰疌++鐗堟湰縐繪榪囨潵鐨勩傚湪DRAW涓殑QA鍝佽川淇濊瘉Bugs涓彁渚涗簡BVH鐨勪嬌鐢ㄧず渚嬨?/p>
棣栧厛瑕佸畾涔夊眰嬈″寘鍥寸洅鐨勯泦鍚圫et鏉ユ瀯閫燘VH鏍?wèi)锛屼粠BVH_Set鍩虹被媧劇敓鐨勯泦鍚堟槸鍙互鐩存帴浣跨敤鐨勶細(xì) 濡傚彲浠ョ洿鎺ヤ嬌鐢˙VH_Triangulation錛屼篃鍙互鐩存帴浣跨敤BVH_BoxSet錛?/p>
浠庤繖浜涚被鍚嶄腑錛屾垜浠彲浠ョ湅鍑哄湪姹傛ā鍨嬮棿鏋佸艱窛紱籈xtrema錛屼笁緇村彲瑙嗗寲Graphic3d鍙奡elect3D鎷懼彇鍙婂竷?yōu)當(dāng)鎿嶄綔BOPTools涓兘鏈塀VH鐨勫簲鐢ㄣ?/p>
灝嗗厓绱犻氳繃Add鍑芥暟娣誨姞鍒癇VH闆嗗悎鍚庯紝璋冪敤BVH()鍑芥暟灝卞彲浠ユ瀯閫燘VH鏍?wèi)銆?/p>
瀵逛簬鍗曚釜BVH鐨勯亶鍘嗘彁渚涚被BVH_Traverse錛屼竴鑸殑搴旂敤鍦烘櫙濡傛眰璺濈涓鐐筆鏈榪戠殑妯″瀷錛屾垨鑰呬綅浜庢煇涓┖闂磋寖鍥村唴鐨勬墍鏈夋ā鍨嬨備唬鐮佸涓嬫墍紺猴細(xì) 涓昏鏄粠綾籅VH_Traverse媧劇敓騫墮噸鍐欎袱涓櫄鍑芥暟RejectNode()鍜孉ccept()錛屽嵆鍦≧ejectNode()涓畾涔夋帓闄ょ粨鐐圭殑瑙勫垯錛屽湪Accept()涓鐞嗘弧瓚蟲潯浠剁殑鎯呭喌銆?/p>
瀵逛簬涓や釜BVH鐨勯亶鍘嗘彁渚涚被BVH_PairTraverse錛屼竴鑸殑搴旂敤鍦烘櫙鏈夋眰涓や釜Mesh涔嬮棿鐨勬渶榪戣窛紱伙紝鍒ゆ柇涓や釜Mesh涔嬮棿鏄惁鏈夌鎾炵瓑銆?/p>
涓昏涔熸槸浠嶣VH_PairTraverse媧劇敓騫墮噸鍐欎袱涓櫄鍑芥暟RejectNode()鍜孉ccept()銆?/p>
鍏充簬BVH鐨勬瀯閫犳彁渚涘縐岯uilder錛岄粯璁ゆ槸浣跨敤鍩轟簬SAH綆楁硶鐨凚VH_BinnedBuilder鏉ユ瀯閫燘VH鏍?wèi)锛屽鏋滆鍒囨崲涓嶅悓鐨勬瀯閫犲櫒錛屽彲浠ュ湪BVH闆嗗悎鐨勬瀯閫犲嚱鏁頒腑浼犲叆涓涓?/p>
涓嬮潰緇欏嚭姹備袱涓狹esh涔嬮棿鏈榪戣窛紱葷殑紺轟緥浠g爜錛?/p>
鍑嗙‘銆佺ǔ瀹氥侀珮鏁堟槸楂樺搧璐ㄥ嚑浣曞唴鏍哥殑鐩爣錛屾垜浠湪寮鍙戣蔣浠舵椂錛屼篃瑕佹椂鍒昏拷姹傝繖涓洰鏍囥傝孊VH灞傛鍖呭洿鐩掓妧鏈槸鎻愬崌鎬ц兘鐨勪竴縐嶆柟寮忥紝鐞嗚ВBVH鐨勪嬌鐢紝鎴戜滑鍙互鐞嗚Вopencascade涓揩閫熸眰鏋佸糆xtrema錛屼氦浜掗夋嫨SelectMgr絳夊緢澶氫唬鐮併傜敋鑷蟲垜浠篃鍙互鍙備笌璐$尞錛屽灝?/p>
榪欎釜O(N^2)鐨勬敼閫犳垚BVH鐨勬潵瀵規(guī)瘮涓涓嬫ц兘銆?/p>
Abstract. OpenCASCADE provides NCollection_UBTree to achieve high performance search overlapped boxes. The algorithm of unbalanced binary tree of overlapped bounding boxes. Once the tree of boxes of geometric objects is constructed, the algorithm is capable of fast geometric selection of objects. The tree can be easily updated by adding to it a new object with bounding box. The time of adding to the tree of one object is O(log(N)), where N is the total number of objects, so the time of building a tree of N objects is O(N(log(N)). The search time of one object is O(log(N)). Defining various classes inheriting NCollection_UBTree::Selector we can perform various kinds of selection over the same b-tree object. Key Words. Unbalanced Binary Tree, Binary Search Tree, Binary Sort Tree, Bounding Box 闈炲鉤琛′簩鍙夋爲(wèi)錛圲nbalanced Binary Tree錛夊張鍙簩鍙夋煡鎵炬爲(wèi)錛圔inary Search Tree錛夋垨浜屽弶鎺掑簭鏍?wèi)锛圔inary Sort Tree錛夈傚畠鐨勫畾涔夊緢綆鍗曪紝灝辨槸宸﹀瓙鏍?wèi)涓婃墍鏈夎妭鐐圭殑鍊奸兘瑕佸皬浜庢牴鑺傜偣涓婄殑鍊箋傚彸瀛愭爲(wèi)涓婃墍鏈夎妭鐐瑰奸兘瑕佸ぇ浜庢牴鑺傜偣涓婄殑鍊箋傚湪浜屽弶鏌ユ壘鏍?wèi)涓婃墽琛屾搷浣滄棄櫁翠笌鏍?wèi)鐨勯珮搴︽垚姝f瘮銆傚浜庝竴媯靛惈鏈塶涓粨鐐圭殑瀹屽叏浜屽弶鏍?wèi)锛寴q欎簺鎿嶄綔鐨勬渶鍧忔儏鍐佃繍琛屾椂闂翠負(fù)O(lg(n))銆備絾鏄鏋滄爲(wèi)鏄惈n涓粨鐐圭殑綰挎ч摼錛屽垯榪欎簺鎿嶄綔鐨勬渶鍧忕殑鎯呭喌榪愯鏃墮棿涓篛(n)銆備竴媯甸殢鏈烘瀯閫犵殑浜屽弶鏌ユ壘鏍?wèi)鐨勬湡鏈涢珮搴︿负O(lg(n))錛屼粠鑰岃繖縐嶆爲(wèi)涓婃搷浣滅殑騫沖潎鏃墮棿涓篛(lg(n))銆?/p>
鍑犱綍鎼滅儲錛坓eometry searching錛夊ぇ鑷村垎涓ょ被錛氫竴綾繪槸鍖哄煙鎼滅儲闂錛坮ange searching problem錛夛紝鍙︿竴綾繪槸鐐圭殑瀹氫綅闂錛坧oint location problem錛夈傚尯鍩熸悳绱㈤棶棰樿鍥炵瓟鐨勬槸緇欏畾涓涓尯鍩燂紝鐪嬫湁澶氬皯妯″瀷灞炰簬榪欎釜鍖哄煙銆傚綋鐒訛紝鎴戜滑鍙互瀵規(guī)墍鏈夋ā鍨嬭繘琛岄亶鍘嗭紝榪欑綆楁硶鏃墮棿澶嶆潅搴︿負(fù)O(N)錛屾晥鐜囦笉楂樸傚父瑙佺殑楂樻晥鐨勫尯鍩熸悳绱㈢畻娉曟湁k-D鏍?wèi)锛宬-D鏍?wèi)灏辨槸涓縐嶅緇寸殑騫寵 浜屽弶鏍?wèi)銆傝繕鏈夋瘮杈冨父瑙佺殑KNN闂錛岃繖浜涢兘鏄綆楀嚑浣曞鐞嗙殑闂銆?/p>
OpenCASCADE涓彁渚涗竴縐嶇┖闂存煡鎵句簩鍙夋爲(wèi)綆楁硶NCollection_UBTree錛屽瓧闈㈡剰鎬濇槸闈炲鉤琛′簩鍙夋爲(wèi)Unbalanced Binary Tree銆傛妸涓婂浘涓殑鏁板瓧鎹㈡垚鍖呭洿鐩掞紝鏋勯犱簩鍙夋煡鎵炬爲(wèi)銆備負(fù)浜嗚В鍐蟲煡鎵句簩鍙夋爲(wèi)鍗曢摼闂錛屽姞鍏ラ殢鏈哄鐞嗭紝鍙互浣挎煡鎵炬ц兘杈懼埌O(log(N))錛岀浉瀵規(guī)櫘閫氶亶鍘嗛熷害鑰岃█榪樻槸涓嶉敊鐨勩傛湰鏂囩粨鍚堢ず渚嬩唬鐮佽鏄庡浣曚嬌鐢ㄨ繖涓潪騫寵 浜屽弶鏍?wèi)銆?/p>
鍦∣penCASCADE涓湁澶氫釜鍑芥暟鏉ュ疄鐜板皢寰堝鏃犲簭杈笶dges榪炴帴鎴怶ire錛岄渶瑕佹煡璇竴鏉¤竟Edge鐨勪竴涓《鐐筕ertex鍦ㄤ竴瀹氱簿搴﹁寖鍥村唴鐩歌繛鐨勯《鐐筕ertex鏈夊摢浜涳紵 棣栧厛錛屽疄鐜頒竴涓夋嫨綾伙紝閫氳繃閫夋嫨綾繪潵榪涜榪囨護(hù)錛?/p>
涓昏瀹炵幇涓や釜鎶借薄鍑芥暟Reject()鍜孉ccept()錛屼互鍙婅緗綋鍓嶉夋嫨鍣ㄧ殑鐘舵併俁eject()鍑芥暟鐢ㄦ潵鍒ゆ柇瑕佹煡鎵劇殑Box涓庡綋鍓嶇┖闂磋寖鍥寸殑鐘舵侊紝濡傛灉鍦ㄥ錛屽垯榪斿洖True銆傚綋涓や釜Box鏈夌浉浜ゆ椂錛屼細(xì)璋冪敤Accept()鍑芥暟錛屽湪姝ゅ嚱鏁頒腑鍒ゆ柇涓や釜鐐圭殑璺濈鏄惁鍦ㄥ宸寖鍥村唴錛岃嫢鍦ㄥ宸寖鍥村唴錛屽垯灝嗙偣璁板綍璧鋒潵銆備富鍑芥暟main浠g爜濡備笅錛?/p>
鍏堢敤闅忔満鍑芥暟闅忔満鐢熸垚100涓偣錛屽茍灝嗙偣閫氳繃BoxTreeFiller娣誨姞鍒版煡鎵炬爲(wèi)aBoxTree涓紝璋冪敤Fill鍑芥暟鏋勯犳煡鎵炬爲(wèi)銆?/p>
鍐嶄嬌鐢ㄧ被BoxSelector鏉ヨ繘琛屽揩閫熸煡鎵撅紝鏌ユ壘涔嬪墠鍏堣緗綋鍓嶇偣鍙婂寘鍥寸洅銆傜劧鍚庤皟鐢╝BoxTree.Select(aSelector)榪涜鏌ユ壘銆?/p>
綾籒Collection_UBTree閫氳繃鏋勯犲寘鍥寸洅鐨勯潪騫寵 浜屽弶鏍?wèi)鏉ュ姞蹇尯鍩熸悳鐑﹂熷害銆傚浣曟彁楂樻悳绱㈤熷害錛屾槸璁$畻鍑犱綍澶勭悊鐨勮寖鐣淬傚湪OpenCASCADE涓繖涓被浣跨敤鍦烘櫙姣旇緝澶氾紝濡傚皢鏃犲簭杈規(guī)瀯閫犳垚Wire鏃墮兘鐢ㄨ繖涓被錛欱RepLib_MakeWire::Add(const TopTools_ListOfShape& L), ShapeAnalysis_FreeBounds::ConnectEdgesToWires()銆傚寘鎷悗闈㈠紩鍏ョ殑BVH閮芥槸涓轟簡鎻愰珮鎼滅儲閫熷害錛屽湪鍚堥傜殑鍦烘櫙涓浣跨敤榪欎簺綆楁硶錛屼細(xì)瀵圭▼搴忔ц兘鐨勬彁鍗囨湁寰堝ぇ甯姪銆?/p>
鏈卞績闆勭瓑钁椼婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦鐨勮拷韙硶錛圡arching method錛夋湁璇︾粏浠嬬粛錛岄鍏堟洸闈㈡眰浜よ拷韙硶鐨勬彁鍑烘槸1990騫碦.E. BARNHILL鍜孲.N. KERSEY鐨勪竴綃囪鏂囷細(xì)A marching method for parametric surface/surface intersection鎰熷叴瓚g殑鍙互涓嬭澆鏉ョ湅鐪嬪師鏂囷細(xì) 1990騫存垜鎵嶅嚑宀侊紝閭f椂瀹墮噷鏈夐粦鐧界數(shù)瑙嗘満宸茬粡綆椾笉閿欑殑銆傚浜庝竴鑸琋URBS鏇查潰鐨勬眰浜わ紝鍏堢敤鍒嗗壊紱繪暎娉曟眰寰椾氦綰跨殑鎷撴湸緇撴瀯鍜屼氦鐐圭殑浼拌鍊鹼紝鐒跺悗鍐嶅簲鐢ㄨ凱浠f硶鏍規(guī)嵁浼拌鍊兼眰寰楃簿紜氦鐐廣傚鏋滆涓轟氦鐐瑰垎甯冧笉澶熺粏瀵嗭紝鍙互瀵圭綉鏍艱繘琛屽姞瀵嗭紝鍐嶅簲鐢ㄨ凱浠f硶寰楀埌鏂扮殑綺劇‘浜ょ偣錛岀敱姝ゅ彲浠ヨ幏寰楀畬鏁淬佽嚧瀵嗙殑綺劇‘浜ょ嚎錛岃屾棤闇搴旂敤榪借釜娉曘?/p>
榪借釜娉曠殑鍘熺悊錛氬亣璁句袱鏇查潰闂村叡鏈塏涓氦綰跨幆錛屽厛閫氳繃鏌愮姹備氦鏂規(guī)硶紜畾鍚勪氦綰跨幆涓婄殑涓涓氦鐐癸紝鐒跺悗浠ヨ浜ょ偣涓哄垵濮嬩氦鐐癸紝鏍規(guī)嵁浜ょ嚎鐨勫嚑浣曟ц川錛屾寜鐓т竴瀹氭闀胯綆楄鏉′氦綰夸笂涓嬩竴浜ょ偣鐨勮繎浼煎鹼紝鍐嶅簲鐢ㄨ凱浠f硶姹傚緱綺劇‘浜ょ偣銆傛部浜ょ嚎璧板悜涓嶆柇鍓嶈繘錛岀洿鍒伴亶鍘嗘暣鏉′氦綰褲傝拷韙硶鐨勪紭鐐規(guī)槸鍦ㄦ眰寰楅浜ょ偣鍚庢悳绱氦綰垮叾浣欎氦鐐圭殑閫熷害闈炲父蹇紝涓旈傜敤鑼冨洿騫褲備笉璁轟綍縐嶅弬鏁版洸闈紝鍙鏇查潰涓嶅瓨鍦ㄩ潪姝e垯鐐癸紝騫跺彲浠ユ眰寰楁洸闈笂浠繪剰鐐圭殑鍧愭爣浣嶇疆銆佹硶鐭€佸垏鐭㈢瓑鍑犱綍淇℃伅錛屽氨鍙互鐢ㄨ拷韙硶姹備氦銆傝拷韙硶鐨勯棶棰樻槸鐩墠灝氭棤闈炲父鏈夋晥鐨勬柟娉曟潵姹傚緱鎵鏈変氦綰跨幆鐨勮搗濮嬬偣銆傚湪鏈変簺鎯呭喌涓嬪姹傚垵濮嬬偣鎵鑺辮垂鐨勬椂闂磋繙澶т簬榪借釜娉曡繃紼嬩腑鎵鑺傜渷鐨勬椂闂達(dá)紝鑰屼負(fù)浜嗚妭鐪佸姹傚垵濮嬬偣鐨勬椂闂達(dá)紝鍙堝彲鑳芥紡鎺夋煇浜涗氦綰匡紝褰撳湪瀛ょ珛浜ょ偣鍜屾瘮杈冨皬鐨勪氦綰跨幆鏃跺挨鐢氥?/p>
OpenCASCADE瀹炵幇鏇查潰姹備氦榪借釜娉曠殑綾繪槸IntWalk_PWalking錛屾敞鎰忕湅綾繪敞閲婁腑鐨勫崟璇峬arching: 榪借釜娉曚腑闇瑕佽В鍐充袱涓棶棰橈細(xì) 浣跨敤榛樿綺懼害璁劇疆錛岃拷韙硶寰楀埌鐨勪氦鐐規(guī)暟閲忓氨寰堝ぇ銆傝嫢璁劇疆綺懼害浣庯紝浜ょ偣鏁伴噺浼?xì)鏄庢槕謬彏畱锛屾彁楂樿绠楅熷害銆?/p>
濡備笂鍥炬墍紺猴紝鑻ヤ袱涓洸闈㈠彧鏈変竴涓氦綰匡紝浣跨敤鏈夎拷韙硶鏃跺彧闇瑕佹寚瀹氫氦綰跨殑鍒濆浜ょ偣錛屽嵆鍙互寰楀埌鏁翠釜浜ょ嚎銆傚綋涓ゆ洸闈㈡湁澶氫釜浜ょ嚎鎴栨湁瀛ょ珛浜ょ偣鏃訛紝灝遍渶瑕佹壘鍑哄涓氦綰跨殑璧峰浜ょ偣錛?/p>
涓婂浘鎵紺轟綅緗氦綰挎柇寮鐢熸垚涓ゆ潯浜ょ嚎錛屼竴涓槸緇胯壊涓涓槸綰㈣壊錛岃繖縐嶆儏鍐靛氨闇瑕佸垎鍒寚鍑轟袱涓氦綰胯搗濮嬬偣銆?/p>
緇間笂鎵榪幫紝鏇查潰姹備氦榪借釜娉曠殑浼樼偣鏄湪姹傚緱棣栦氦鐐瑰悗鎼滅儲浜ょ嚎鍏朵綑浜ょ偣鐨勯熷害闈炲父蹇紝涓旈傜敤鑼冨洿騫褲傝拷韙硶鐨勯棶棰樻槸鐩墠灝氭棤闈炲父鏈夋晥鐨勬柟娉曟潵姹傚緱鎵鏈変氦綰跨幆鐨勮搗濮嬬偣銆傛洸闈㈡眰浜や竴鑸細(xì)閲囩敤閫氱敤鎬ц緝濂界殑緗戞牸娉?榪唬娉?榪借釜娉曚笁鑰呯浉緇撳悎鐨勬柟娉曘傚簲鐢ㄧ綉鏍兼硶姹傚緱浜ょ偣鐨勫垵濮嬩及璁″鹼紝鍐嶇敤榪唬娉曟眰寰楃簿紜氦鐐癸紝騫朵互鍏朵負(fù)璧風(fēng)偣榪涜榪借釜錛岀洿鍒板緱鍒版暣鏉$簿紜氦綰褲?/p>
IntWalk_PWalking榪借釜娉曠殑姝ラ暱涓庣簿搴﹀瘑鍒囩浉鍏籌紝閫夋嫨鍚堥傜殑綺懼害錛屽彲浠ヤ嬌浜ょ嚎鐨勪氦鐐規(guī)暟閲忓皯錛屾彁楂樿綆楅熷害銆傚洜涓虹簿搴﹁秺楂樿拷韙繃紼嬩腑寰楀埌鐨勮拷韙偣瓚婂錛屽浜庢瘡涓拷韙偣閮介渶瑕佷嬌鐢ㄨ凱浠f硶璁$畻綺劇‘浜ょ偣銆?/p>
鏈卞績闆勭瓑钁椼婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦鐨勮凱浠f硶鏈夎緇嗕粙緇嶏紝鍏朵腑鍏充簬鏇查潰榪唬姹備氦鐨勫師鐞嗕粙緇嶅涓嬶細(xì)涓烘眰寰椾袱涓洸闈㈢簿紜殑浜ょ偣錛孨ewton-Raphson榪唬娉曞緱鍒板箍娉涘簲鐢紝璇ユ硶鐨勪紭鐐逛負(fù) 鍏剁己鐐規(guī)槸瀵瑰垵濮嬪艱姹傝緝涓ユ牸錛屽垵濮嬪奸夋嫨涓嶅綋錛屽彲鑳藉鑷磋凱浠d笉鏀舵暃錛屼篃灝辨棤娉曞緱鍒扮簿紜殑浜ょ偣銆?/p>
鍦ㄦ洸闈㈡眰浜ょ瓑闂涓紝涓鑸彲鏍規(guī)嵁鍙備笌鍙樺寲鐨勫弬鏁版暟閲忓皢榪唬娉曞垎涓轟笁鍙傛暟榪唬娉曞拰鍥涘弬鏁拌凱浠f硶涓ょ綾誨瀷銆傛垜浠煡閬擄紝涓寮犲弬鏁版洸闈㈡湁涓や釜鍙傛暟錛屼袱寮犲弬鏁版洸闈㈠叡鏈夊洓涓弬鏁板彉閲忋傞噰鐢ㄤ笁鍙傛暟榪唬娉曟椂錛屼袱涓洸闈㈢殑鍥涗釜鍙傛暟涓彧鏈変笁涓弬鏁板弬涓庤凱浠h繃紼嬶紝鑰屼繚鎸佸彟涓涓弬鏁板浐瀹氫笉鍙橈紝榪欏疄闄呬笂灝辨槸璁$畻涓嶅彉鍙傛暟鐨勭瓑鍙傛暟綰夸笌鍙︿竴寮犳洸闈㈢殑浜ょ偣銆傞噰鐢ㄥ洓鍙傛暟榪唬娉曟椂錛屼袱寮犳洸闈㈢殑鍥涗釜鍙傛暟鍙橀噺閮藉弬涓庤凱浠h繃紼嬶紝鍥涜呴兘鍙兘鍙樺寲銆備袱縐嶈凱浠f硶鍚勬湁鍏朵紭緙虹偣銆傚湪涓嬭堪鎯呭喌涓嬩互搴旂敤涓夊弬鏁拌凱浠f硶涓哄疁錛?/p>
浣嗗浜庝竴鑸氦鐐癸紝涓夊弬鏁版硶鍒欐湭蹇呴傜敤銆傞鍏堥亣鍒扮殑闂鏄湪鍥涗釜鍙傛暟涓夋嫨浣曡呬綔涓轟笉鍙樺弬鏁幫紝鍥哄畾鍙傛暟閫夋嫨涓嶅綋鍙兘闄嶄綆榪唬鏀舵暃閫熷害浠ヨ嚦鏍規(guī)湰涓嶆敹鏁涳紝鎴栬呯牬鍧忎氦綰挎嫇鏈寸粨鏋勭殑姝g‘鎬с傝凱浠f硶鏈韓涓嶈兘澶熸垚鐙珛鐨勬眰浜ゆ柟娉曪紝涓昏鍦ㄨ拷韙硶涓嬌鐢紝OpenCASCADE涓洸闈㈡眰浜よ拷韙硶鐨勭被鏄疘ntWalk_PWalking銆傚墠闈㈢殑blog宸茬粡浠嬬粛浜嗘洸闈氦姹傜殑紱繪暎緗戞牸娉曪紝鍜岀被IntWalk_TheInt2S瀹炵幇鍘熺悊錛屾湰鏂囦富瑕佷粙緇峅penCASCADE鏇查潰姹備氦榪唬娉曠殑綾籌ntWalk_TheInt2S鐨勭敤娉曠粨鏋溿?/p>
鍓嶆枃浠嬬粛浜嗘洸闈㈡眰浜ょ殑紱繪暎緗戞牸娉曪紝浣跨敤綾籌ntPolyh_Intersection鏉ヨ綆椾袱涓洸闈㈢綉鏍肩殑浜ょ嚎錛岃綆楃粨鏋滄槸緗戞牸浜ょ嚎鐨勪竴緇勪氦鐐廣傛妸紱繪暎緗戞牸鐨勪氦鐐逛綔涓鴻凱浠f硶鐨勮緭鍏ワ紝鏉ユ鏌ヤ竴涓嬭凱浠f硶鐨勮綆楃粨鏋溿?/p>
Newton榪唬娉曠殑杈撳叆鏄垵濮嬩及璁$偣鍒嗗埆鍦ㄤ袱涓洸闈笂鐨勫洓涓弬鏁幫紙u1, v1, u2, v2錛夛紝鍙婁袱涓洸闈S1鍜宎S2錛岃凱浠g粓姝㈢簿搴olTangency銆傚皢璁$畻緇撴灉杈撳嚭錛屽叾涓涓涓窛紱繪槸榪唬鐨勭簿紜間笌緗戞牸涓婁氦鐐圭殑璺濈錛岀浜屼釜璺濈鏄簿紜氦鐐圭殑u1, v1, u2,v2鍒嗗埆鍦ㄤ袱涓洸闈笂鐐圭殑璺濈錛屽彲浠ョ湅鍑虹粡榪嘚ewton榪唬璁$畻鍚庯紝鏍規(guī)嵁綺劇‘浜ょ偣鐨勫弬鏁皍1, v1, u2, v2璁$畻鍑轟袱涓洸闈笂鐨勭偣鍦ㄦ寚瀹氱殑綺懼害涓嬫槸閲嶅悎鐨勩備負(fù)浜嗕究浜庤瀵燂紝灝嗚綆楃粨鏋滆緭鍑哄埌DRAW涓煡鐪嬨?/p>
鍏朵腑綰㈣壊鐨勭嚎鏄袱涓洸闈㈢綉鏍肩殑浜ょ嚎錛岀豢鑹茬殑綰挎槸灝嗙綉鏍間氦綰跨粡榪嘚ewton榪唬鍚庡緱鍒扮簿紜氦綰褲傚啀灝嗕袱涓氦綰夸笌瀹為檯鏇查潰涓璧鋒樉紺烘潵瀵規(guī)瘮錛?/p>
浠庡浘涓婂彲浠ョ湅鍑猴紝緇胯壊鐨勪氦綰垮凡緇忚兘姣旇緝鍑嗙‘鍦拌〃杈句袱涓洸闈箣闂寸殑鐩鎬氦鎯呭喌銆傛瘮緗戞牸浜ょ嚎鏁堟灉濂姐?/p>
緇間笂鎵榪幫紝灝嗘洸闈㈡眰浜ょ殑紱繪暎緗戞牸浜ょ嚎浣滀負(fù)Newton榪唬娉曠殑鍒濆浼拌鐐癸紝鍙互寰楀埌杈冨ソ鐨勪氦綰褲傚悗闈㈠啀鍒嗘瀽涓涓嬫洸闈㈡眰浜ょ殑榪借釜娉曪紝鐪嬪湪榪借釜娉曚腑鏄浣曚嬌鐢ㄧ鏁g綉鏍間氦綰挎暟鎹殑銆傚浜庝竴鑸殑NURBS鏇查潰姹備氦錛屽厛鐢ㄧ鏁g綉鏍兼硶鎴栧垎鍓茬鏁f硶姹傚緱浜ょ嚎鍜屼氦鐐圭殑浼拌鍊鹼紝鐒跺悗鍐嶅簲鐢∟ewton榪唬娉曠敱浼拌鍊兼眰寰楃簿紜氦鐐廣傚鏋滆涓轟及璁′氦鐐瑰垎甯冧笉澶熺粏瀵嗭紝鍙互瀵圭綉鏍煎姞瀵嗭紝鐢辨鍙互寰楀埌瀹屾暣銆佽嚧瀵嗙殑綺劇‘浜ょ嚎鑰屾棤闇搴旂敤榪借釜娉曘?/p> 鏈卞績闆勭瓑钁椼婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦鐨勮凱浠f硶鏈夎緇嗕粙緇嶏紝鍏朵腑鍏充簬鏇查潰榪唬姹備氦鐨勫師鐞嗕粙緇嶅涓嬶細(xì)涓烘眰寰椾袱涓洸闈㈢簿紜殑浜ょ偣錛孨ewton-Raphson榪唬娉曞緱鍒板箍娉涘簲鐢紝璇ユ硶鐨勪紭鐐逛負(fù) 鍏剁己鐐規(guī)槸瀵瑰垵濮嬪艱姹傝緝涓ユ牸錛屽垵濮嬪奸夋嫨涓嶅綋錛屽彲鑳藉鑷磋凱浠d笉鏀舵暃錛屼篃灝辨棤娉曞緱鍒扮簿紜殑浜ょ偣銆?/p>
鍦ㄦ洸闈㈡眰浜ょ瓑闂涓紝涓鑸彲鏍規(guī)嵁鍙備笌鍙樺寲鐨勫弬鏁版暟閲忓皢榪唬娉曞垎涓轟笁鍙傛暟榪唬娉曞拰鍥涘弬鏁拌凱浠f硶涓ょ綾誨瀷銆傛垜浠煡閬擄紝涓寮犲弬鏁版洸闈㈡湁涓や釜鍙傛暟錛屼袱寮犲弬鏁版洸闈㈠叡鏈夊洓涓弬鏁板彉閲忋傞噰鐢ㄤ笁鍙傛暟榪唬娉曟椂錛屼袱涓洸闈㈢殑鍥涗釜鍙傛暟涓彧鏈変笁涓弬鏁板弬涓庤凱浠h繃紼嬶紝鑰屼繚鎸佸彟涓涓弬鏁板浐瀹氫笉鍙橈紝榪欏疄闄呬笂灝辨槸璁$畻涓嶅彉鍙傛暟鐨勭瓑鍙傛暟綰夸笌鍙︿竴寮犳洸闈㈢殑浜ょ偣銆傞噰鐢ㄥ洓鍙傛暟榪唬娉曟椂錛屼袱寮犳洸闈㈢殑鍥涗釜鍙傛暟鍙橀噺閮藉弬涓庤凱浠h繃紼嬶紝鍥涜呴兘鍙兘鍙樺寲銆備袱縐嶈凱浠f硶鍚勬湁鍏朵紭緙虹偣銆傚湪涓嬭堪鎯呭喌涓嬩互搴旂敤涓夊弬鏁拌凱浠f硶涓哄疁錛?/p>
浣嗗浜庝竴鑸氦鐐癸紝涓夊弬鏁版硶鍒欐湭蹇呴傜敤銆傞鍏堥亣鍒扮殑闂鏄湪鍥涗釜鍙傛暟涓夋嫨浣曡呬綔涓轟笉鍙樺弬鏁幫紝鍥哄畾鍙傛暟閫夋嫨涓嶅綋鍙兘闄嶄綆榪唬鏀舵暃閫熷害浠ヨ嚦鏍規(guī)湰涓嶆敹鏁涳紝鎴栬呯牬鍧忎氦綰挎嫇鏈寸粨鏋勭殑姝g‘鎬с傝凱浠f硶鏈韓涓嶈兘澶熸垚鐙珛鐨勬眰浜ゆ柟娉曪紝涓昏鍦ㄨ拷韙硶涓嬌鐢紝OpenCASCADE涓洸闈㈡眰浜よ拷韙硶鐨勭被鏄疘ntWalk_PWalking銆傛湰鏂囦富瑕佷粙緇峅penCASCADE鏇查潰姹備氦榪唬娉曠殑綾籌ntWalk_TheInt2S鐨勭敤娉曞強鍘熺悊銆?/p>
OpenCASCADE涓袱鏇查潰姹備氦榪唬娉曠敱綾籌ntWalk_TheInt2S瀹炵幇錛屽叾綾諱腑涓昏鍑芥暟鏈夛細(xì) 緇欏畾涓や釜鏇查潰錛屽拰鍒濆浼拌鐐瑰湪涓や釜鏇查潰涓婄殑鍙傛暟(u1, v1), (u2,v2)錛岃凱浠h綆楀嚭綺劇‘浜ょ偣銆傚浐瀹氫笁鍙傛暟鐨勬柟寮忔誨叡鍒嗗洓縐嶇被鍨婭ntImp_ConstIsoparametric錛?/p>
IntImp_UIsoparametricOnCaro1錛氭槸鍥哄畾浼拌鐐瑰湪鏇查潰1涓婄殑鍙傛暟u錛?/p>
IntImp_VIsoparametricOnCaro1錛氭槸鍥哄畾浼拌鐐瑰湪鏇查潰1涓婄殑鍙傛暟v錛?/p>
IntImp_UIsoparametricOnCaro2錛氭槸鍥哄畾浼拌鐐瑰湪鏇查潰2涓婄殑鍙傛暟u錛?/p>
IntImp_VIsoparametricOnCaro2錛氭槸鍥哄畾浼拌鐐瑰湪鏇查潰2涓婄殑鍙傛暟v錛?/p>
涓轟簡閬垮厤涓夊弬鏁拌凱浠f硶鎵句笉鍒頒氦鐐圭殑鎯呭喌錛屼細(xì)鍦ㄥ洓涓柟鍚戜笂鍒嗗埆榪涜璁$畻錛屾繪湁涓涓柟鍚戜笂浼?xì)鎵惧堫C氦鐐癸紝騫跺皢鎵懼埌浜ょ偣鐨勫弬鏁板浐瀹氭儏鍐佃繑鍥烇細(xì) 鍦ㄥ嚱鏁癙erform()涓氱敤姹傝В榪唬鏂圭▼緇勶紝寰楀埌綺劇‘浜ょ偣錛?/p>
鍏朵腑榪唬鏂圭▼緇勪負(fù)鎴愬憳鍙橀噺myZerParFunc錛屾柟紼嬬粍姹傝В浣跨敤綾籱ath_FunctionSetRoot銆傜敱鏂圭▼緇勬眰瑙g被娉ㄩ噴鍙煡錛岄渶瑕佹柟紼嬬粍鐨勪竴闃跺亸瀵兼暟鍗蟲搴radient錛岄噰鐢ㄧ殑鏄疦ewton榪唬娉曘傝嫢鏂圭▼緇勬湁瑙oot涓旀弧瓚崇簿搴﹁姹傦紝鍒欎繚瀛樹笅綺劇‘浜ょ偣鐨勫潗鏍囧煎強鍦ㄤ袱涓洸闈笂鐨勫弬鏁板肩瓑鏁版嵁銆?/p>
涓夊弬鏁拌凱浠f柟紼嬬被涓篏eomInt_TheFunctionOfTheInt2SOfThePrmPrmSvSurfacesOfWLApprox, 鏄粠綾籱ath_FunctionSetWithDerivatives媧劇敓鐨勶紝鍗充笁鍙傛暟榪唬鏂圭▼鏄釜鏂圭▼緇?Function Set)銆傚叾瀹氫箟鍦ㄦ枃浠禝ntImp_ZerParFunc涓紝鍏堜嬌鐢ㄥ嚱鏁癈omputeParameters()鏍規(guī)嵁鍥哄畾鍙傛暟綾誨瀷鏉ョ‘瀹氫及璁$偣鐨勫浐瀹氬弬鏁板強鍙﹀涓変釜鍙傛暟鍙橀噺鐨勫垵濮嬪鹼細(xì) 璁句袱涓弬鏁版洸闈1(u1,v1)錛孲2(u2,v2)錛屽茍宸茬煡涓浜ょ偣鐨勫垵浼拌鐐筆0錛孭0鐐瑰湪涓ゅ紶鏇查潰涓婂搴旂殑鎶曞獎鐐瑰垎鍒負(fù)P1=S1(u0,v0)鍜孭2=S2(s0,t0)銆傜敱浜嶱0鐐逛負(fù)涓浼拌鐐癸紝鎵浠1鍜孭2騫朵笉閲嶅悎銆傝浠0浣滀負(fù)鍥哄畾鍙傛暟錛屽嵆褰撳浐瀹氬弬鏁扮被鍨嬩負(fù)IntImp_UIsoparametricOnCaro1鏃訛紝鍒欓棶棰樿漿鍖栦負(fù)姹倁*,v*,t*錛屼嬌涓ゆ洸闈㈢墖涓婄殑鐐筍1(u*,v*)鍜孲2(s0,t*)閲嶅悎銆傚緩绔嬫柟紼嬬粍錛?/p>
R(u,v,t)=S1(u,v) - S2(s0, t) 閫氳繃鍑芥暟璁$畻涓や釜鏇查潰涓婄殑鐐筽ntsol1鍜宲ntsol2錛屽緱鍒頒笁涓彉閲忕殑鏂圭▼緇勭殑鍊箋?/p>
鍥犱負(fù)瑕佷嬌鐢∟ewton榪唬娉曪紝闇瑕佹彁渚涙柟紼嬬粍鐨勪竴闃跺亸瀵兼暟錛屽嵆Jacobian鐭╅樀錛?/p>
鍑芥暟Derivatives()鐢ㄦ潵璁$畻涓闃跺亸瀵兼暟錛?/p>
緇間笂鎵榪幫紝榪唬娉曟湰韜笉鑳芥瀯鎴愪竴涓嫭绔嬬殑姹備氦鏂規(guī)硶錛屼笌鎵鏈変笉鍔ㄧ偣榪唬娉曚竴鏍鳳紝搴旂敤榪唬娉曟眰浜ょ嚎涔嬪墠錛岄鍏堝繀欏葷粰鍑轟氦鐐圭殑鍒濆浼拌鍊鹼紝鑰屼氦鐐圭殑鍒濆鍊煎繀欏婚氳繃鍏朵粬姹備氦鏂規(guī)硶寰楀埌銆傚洜姝わ紝榪唬浜や氦甯稿悓鍏跺畠姹備氦鏂規(guī)硶緇撳悎浣跨敤錛屼綔涓轟氦鐐圭簿鍖栫殑涓縐嶆墜孌點傝凱浠f硶鐨勪富瑕佽繃紼嬫槸鏍規(guī)嵁鍒濆浼拌鐐圭殑鍑犱綍鎬ц川錛堝鍧愭爣浣嶇疆銆佸垏鐭€佹硶鐭€佹洸鐜囩瓑錛夎繍鐢∟ewton鏂規(guī)硶寰楀埌涓涓緝鍘熶及璁$偣鏇存帴榪戜簬鐩爣鐐癸紙鍗崇簿紜氦鐐癸級鐨勪及璁$偣銆傚姝ゅ弽澶嶈繘琛岋紝鐩村埌姹傚緱鐨勪氦鐐規(guī)弧瓚蟲墍瑕佹眰鐨勭簿搴︺傝娉曠殑浼樼偣鏄湪鍒濆兼瘮杈冨ソ鏃跺叾鏀舵暃閫熷害闈炲父蹇紝鑰屼笖鑳藉簲鐢ㄤ簬浠繪剰鍙傛暟鏇查潰鍖呮嫭Coons鏇查潰鍜岀瓑璺濇洸闈紝鍥犳搴旂敤闈炲父騫挎硾錛屽叾涓昏緙虹偣鏄鍒濆鍊艱姹傛瘮杈冭嫑鍒伙紝鍒濆鍊?閫夋嫨涓嶅綋鏈夊彲鑳藉鑷磋凱浠d笉鏀舵暃銆?/p>
OpenCASCADE涓洸闈㈡眰浜ょ殑榪唬娉曚篃涓嶆槸鐙珛鐨勬柟娉曪紝涓庝箣閰嶅悎鐨勬湁紱繪暎緗戞牸姹備氦寰楀埌鍒濆鹼紝鍦ㄨ拷韙腑浣滅敤榪唬娉曘傝凱浠f眰浜や嬌鐢ㄧ殑鏄笁鍙傛暟榪唬娉曪紝鏍規(guī)嵁涓夊弬鏁拌凱浠f硶鐨勬暟瀛︽柟紼嬪彲鐭ワ紝闇瑕佽綆楁洸闈笂鍙傛暟瀵瑰簲鐨勭偣鍜屽垏鐭€?/p> 鐢辨湵蹇冮泟絳夎憲銆婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦涔嬬綉鏍肩鏁f硶鎻忚堪濡備笅錛氳娉曠殑鍩烘湰鎬濇兂鏄厛灝嗘洸闈㈢鏁d負(fù)鐢卞皬騫抽潰鐗囩粍鎴愮殑緗戞牸錛屽綋緗戞牸瓚沖瀵嗘椂錛屽彲浠ヨ涓哄凡緇忛潪甯告帴榪戠湡瀹炴洸闈紝瀵瑰垎鍒〃紺轟笉鍚屾洸闈㈢殑涓ゅ紶緗戞牸錛屽埄鐢ㄥ鉤闈㈢墖姹備氦娉曟眰寰楃殑浜ょ嚎錛屽茍浠ユ浜ょ嚎榪戜技浠h〃鏇查潰闂寸殑浜ょ嚎銆傝繖縐嶆柟娉曞師鐞嗙畝鏄庯紝渚夸簬瀹炵幇錛岄傜敤鑼冨洿騫匡紝浠繪剰鍙傛暟鏇查潰鍧囧彲鍒╃敤璇ユ硶姹備氦銆備絾涓鴻幏鍙栫簿紜湴浜ょ嚎錛屽垯蹇呴』鐢熸垚闈炲父緇嗗瘑鐨勭綉鏍鹼紝榪欏皢瀵艱嚧鍗犵敤鍐呭瓨澶氾紝璁$畻鑺辮垂澶с傚洜姝わ紝瀹為檯宸ヤ綔涓緢灝戝崟涓浣跨敤紱繪暎緗戞牸娉曪紝鑰屽父灝嗗叾涓庡叾浠栨柟娉曠粨鍚堜嬌鐢ㄣ?/p>
OpenCASCADE涓浜庢洸闈㈡眰浜や篃鎻愪緵紱繪暎緗戞牸娉曪紝鍏朵腑鏇查潰鐨勭鏁g綉鏍肩敱綾籌ntPatch_Polyhedron琛ㄧず錛屼袱涓綉鏍奸潰姹備氦浣跨敤綾籌ntPatch_InterferencePolyhedron銆傚湪瀹為檯璁$畻涓や釜闈㈢浉浜ゆ椂騫舵病鏈変嬌鐢ㄨ繖涓被錛岃屾槸浣跨敤綾籌ntPolyh_Intersection錛岃岀鏁g綉鏍間嬌鐢ㄧ被IntPolyh_MaillageAffinage銆?/p>
浣跨敤綾籌ntPolyh_MaillageAffinage涓昏鐢ㄦ潵鐢熸垚鏇查潰鐨勭綉鏍鹼紝鍏朵腑MaillageAffinage鏄硶璇紝緲昏瘧榪囨潵鏄疢esh Refining緗戞牸緇嗗寲錛岀綉鏍肩簿搴︿富瑕佹槸閫氳繃鍙傛暟U錛孷鏂瑰悜涓婄殑閲囨牱鐐規(guī)暟閲忔潵紜畾銆傚綋涓嶆寚瀹氶噰鏍風(fēng)偣鏁伴噺鏃訛紝榛樿鏄弬鏁癠錛孷鏂瑰悜鍒嗗埆10涓紝鍗抽粯璁や細(xì)鐢熸垚10x10涓噰鏍風(fēng)偣錛屽嵆浣挎槸騫抽潰涔熸槸鐢熸垚100涓噰鏍風(fēng)偣銆傞氳繃鍑芥暟FillArrayOfPnt()鐢熸垚閲囨牱鐐廣傞氳繃鍑芥暟FillArrayOfTriangles()鏉ョ敓鎴愪笁瑙掑艦錛屼笁瑙掑艦鐨勬暟閲忛氳繃濡備笅鍥炬墍紺哄叕寮忚綆楋紝榛樿鏁伴噺 涓?x(10-1)x(10-1)=162銆?/p>
瀵逛簬綆鍗曠殑騫抽潰錛屽鏋滀笉鎸囧畾閲囨牱鐐規(guī)暟閲忥紝涔熶細(xì)鐢熸垚100涓噰鏍風(fēng)偣鍙?62涓笁瑙掑艦錛?/p>
涓や釜緗戞牸姹備氦鏄氳繃綾籌ntPolyh_Intersection鏉ヨ綆楋紝璁$畻鐨勭粨鏋滀篃鏄袱涓綉鏍間箣闂寸殑浜ょ嚎銆傝繕鏄皢浜ょ嚎鏄劇ず鍑烘潵渚夸簬瑙傚療錛?/p>
浠庣敓鎴愮殑浜ょ嚎鏉ョ湅錛岃繖涓粨鏋滆姣擨ntPatch_InterferencePolyhedron瑕佸ソ錛屾病鏈夊浣欑殑浜ょ嚎銆傜被IntPolyh_Intersection涓嬌鐢˙VH鏉ヨ繃婊や笉鐩鎬氦鐨勪笁瑙掑艦錛屾墍浠ラ熷害涔熶細(xì)蹇緢澶氥?/p>
緇間笂鎵榪幫紝浣跨敤綾籌ntPolyh_Intersection鏉ヨ綆椾袱涓洸闈㈢綉鏍肩殑浜ょ嚎銆傛洸闈㈢綉鏍肩敓鎴愮洿鎺ラ氳繃鍙傛暟U錛孷涓婄殑閲囨牱鐐規(guī)暟閲忔潵紜畾錛岃櫧鐒剁敓鎴愮綉鏍奸熷害蹇紝浣嗘槸綺懼害鎺у埗涓嶅ソ錛屽嵆浣挎槸騫抽潰涔熶細(xì)鏍規(guī)嵁閲囨牱鏁伴噺鐢熸垚澶ч噺閲囨牱鐐瑰拰涓夎褰紝褰卞搷姹備氦閫熷害銆傜綉鏍兼眰浜や綔涓烘洸闈㈡眰浜ょ殑棰勫鐞嗘楠わ紝濡備綍鐢ㄦ洿灝戠殑涓夎褰㈡潵琛ㄧず鏇查潰錛屽彲鎻愰珮緗戞牸姹備氦鎬ц兘銆?/p> 鐢辨湵蹇冮泟絳夎憲銆婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦涔嬬綉鏍肩鏁f硶鎻忚堪濡備笅錛氳娉曠殑鍩烘湰鎬濇兂鏄厛灝嗘洸闈㈢鏁d負(fù)鐢卞皬騫抽潰鐗囩粍鎴愮殑緗戞牸錛屽綋緗戞牸瓚沖瀵嗘椂錛屽彲浠ヨ涓哄凡緇忛潪甯告帴榪戠湡瀹炴洸闈紝瀵瑰垎鍒〃紺轟笉鍚屾洸闈㈢殑涓ゅ紶緗戞牸錛屽埄鐢ㄥ鉤闈㈢墖姹備氦娉曟眰寰楃殑浜ょ嚎錛屽茍浠ユ浜ょ嚎榪戜技浠h〃鏇查潰闂寸殑浜ょ嚎銆傝繖縐嶆柟娉曞師鐞嗙畝鏄庯紝渚夸簬瀹炵幇錛岄傜敤鑼冨洿騫匡紝浠繪剰鍙傛暟鏇查潰鍧囧彲鍒╃敤璇ユ硶姹備氦銆備絾涓鴻幏鍙栫簿紜湴浜ょ嚎錛屽垯蹇呴』鐢熸垚闈炲父緇嗗瘑鐨勭綉鏍鹼紝榪欏皢瀵艱嚧鍗犵敤鍐呭瓨澶氾紝璁$畻鑺辮垂澶с傚洜姝わ紝瀹為檯宸ヤ綔涓緢灝戝崟涓浣跨敤紱繪暎緗戞牸娉曪紝鑰屽父灝嗗叾涓庡叾浠栨柟娉曠粨鍚堜嬌鐢ㄣ?/p>
OpenCASCADE涓浜庢洸闈㈡眰浜や篃鎻愪緵紱繪暎緗戞牸娉曪紝鍏朵腑鏇查潰鐨勭鏁g綉鏍肩敱綾籌ntPatch_Polyhedron琛ㄧず錛屼袱涓綉鏍奸潰姹備氦浣跨敤綾籌ntPatch_InterferencePolyhedron銆傛湰鏂囦富瑕佷粙緇嶆洸闈㈢殑緗戞牸姹備氦綾籌ntPatch_InterferencePolyhedron銆?/p>
OpenCASCADE涓綆椾袱涓笁瑙掔綉鏍間氦綰跨殑綾繪槸IntPatch_InterferencePolyhedron錛岃繖涓被榪樺彲浠ョ敤鏉ヨ綆椾竴涓綉鏍肩殑鑷氦鎯呭喌銆傜洰鍓嶆槸綆鍗曡綆椾袱涓綉鏍間腑鎵鏈変笁瑙掑艦鐨勭浉浜ゆ儏鍐碉紝鏃墮棿澶嶆潅搴︿負(fù)O(nm)鎴朞(n^2)錛屽浜庣綉鏍間笁瑙掑艦鏁伴噺澶х殑鎯呭喌鏁堢巼寰堜綆銆備負(fù)浜嗙◢寰彁楂樹竴浜涙ц兘錛屽紩鍏nd_BoundSortBox鏉ュ姞閫熻繃婊ゆ帀鍖呭洿鐩掍笉鐩鎬氦鐨勪笁瑙掑艦錛屽噺灝戜袱涓笁瑙掑艦鐩鎬氦璁$畻銆?/p>
鍏朵腑鍑芥暟Intersect()灝辨槸鐢ㄦ潵璁$畻涓や釜涓夎褰㈢殑鐩鎬氦鎯呭喌銆傚叧浜庝袱涓笁瑙掑艦鐨勫揩閫熸眰浜よ綆楋紝寰堝緗戞牸澶勭悊搴撻兘浣跨敤浜員omas Moller’s 1997 triangle intersection routine錛屽 http://geometry-central.net/surface/algorithms/intersection/ 涓篃鎻愪緵涓や釜緗戞牸姹備氦鍑芥暟錛?/p>
鍦ㄤ嬌鐢ㄨ緝騫挎硾鐨勭綉鏍煎鐞嗗簱CGAL涓篃鏈夌浉鍏寵綆楀嚱鏁幫細(xì) 鎰熷叴瓚g殑鍚屽鍙互瀵規(guī)瘮涓涓嬭繖涓変釜搴撳叧浜庝袱涓綉鏍兼眰浜ょ殑鎬ц兘錛岀湅璋佺殑鎬ц兘鏈濂斤紝浣跨敤浜嗕粈涔堟妧鏈傝繖閲屽彧鏄皢OpenCASCADE涓綆楃殑姹備氦緇撴灉杈撳嚭錛岄鍏堟槸闈㈢殑鑷浉浜ゆ儏鍐碉細(xì) 鍏朵腑綰㈣壊閮ㄥ垎涓轟氦綰匡紝鍙互鐪嬪嚭鍦ㄨ綆楄嚜鐩鎬氦鏃訛紝浼?xì)鐢熸垚澶氫綑鐨勪氦绾裤傚叾涓摑鑹查儴鍒嗘槸鏈夐噸鍙犱笁瑙掑艦鐨勬儏鍐點?/p>
褰撹綆椾袱涓綉鏍間氦綰挎椂錛屾諱綋涓婃槸姝g‘鐨勶紝涓嶈繃涔熶細(xì)鏈夊浣欑殑浜ょ嚎浜х敓銆?/p>
緇間笂鎵榪幫紝涓や釜緗戞牸鐩鎬氦璁$畻鏈鐩存帴鐨勭畻娉曞氨鏄袱涓や笁瑙掑艦榪涜姹備氦璁$畻錛屼絾鏄浜庡ぇ緗戞牸浼?xì)鏈夋ц兘闂銆侽penCASCADE涓袱涓綉鏍兼眰浜よ綆椾細(xì)寰楀埌澶氫綑鐨勪氦綰匡紝鐩墠緗戞牸紱繪暎姹備氦鍙槸鐢ㄤ簬B鏍鋒潯鏇查潰鐨勬眰浜よ綆楃殑鍓嶅鐞咺ntPatch_PrmPrmIntersection錛屼粠OpenCASCADE璁$畻涓や釜鏇查潰浜ょ嚎緇撴灉鏉ョ湅錛岀鏁g綉鏍艱綆椾腑澶氫綑鐨勪氦綰挎病鏈夊獎鍝嶆渶緇堢殑璁$畻緇撴灉銆傚ぇ瀹跺彲浠ュ甫鐫榪欎釜闂“紱繪暎緗戞牸璁$畻寰楀埌澶氫綑鐨勪氦綰垮鏈緇堢粨鏋滄湁褰卞搷涔堬紵”鏉ョ悊瑙ntPatch_PrmPrmIntersection涓洸闈㈡眰浜ょ殑瀹炵幇鍘熺悊銆?/p> 鐢辨湵蹇冮泟絳夎憲銆婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬩功涓鏇查潰姹備氦涔嬬綉鏍肩鏁f硶鎻忚堪濡備笅錛氳娉曠殑鍩烘湰鎬濇兂鏄厛灝嗘洸闈㈢鏁d負(fù)鐢卞皬騫抽潰鐗囩粍鎴愮殑緗戞牸錛屽綋緗戞牸瓚沖瀵嗘椂錛屽彲浠ヨ涓哄凡緇忛潪甯告帴榪戠湡瀹炴洸闈紝瀵瑰垎鍒〃紺轟笉鍚屾洸闈㈢殑涓ゅ紶緗戞牸錛屽埄鐢ㄥ鉤闈㈢墖姹備氦娉曟眰寰楃殑浜ょ嚎錛屽茍浠ユ浜ょ嚎榪戜技浠h〃鏇查潰闂寸殑浜ょ嚎銆傝繖縐嶆柟娉曞師鐞嗙畝鏄庯紝渚夸簬瀹炵幇錛岄傜敤鑼冨洿騫匡紝浠繪剰鍙傛暟鏇查潰鍧囧彲鍒╃敤璇ユ硶姹備氦銆備絾涓鴻幏鍙栫簿紜湴浜ょ嚎錛屽垯蹇呴』鐢熸垚闈炲父緇嗗瘑鐨勭綉鏍鹼紝榪欏皢瀵艱嚧鍗犵敤鍐呭瓨澶氾紝璁$畻鑺辮垂澶с傚洜姝わ紝瀹為檯宸ヤ綔涓緢灝戝崟涓浣跨敤紱繪暎緗戞牸娉曪紝鑰屽父灝嗗叾涓庡叾浠栨柟娉曠粨鍚堜嬌鐢ㄣ?/p>
OpenCASCADE涓浜庢洸闈㈡眰浜や篃鎻愪緵紱繪暎緗戞牸娉曪紝鍏朵腑鏇查潰鐨勭鏁g綉鏍肩敱綾籌ntPatch_Polyhedron琛ㄧず錛屼袱涓綉鏍奸潰姹備氦浣跨敤綾籌ntPatch_InterferencePolyhedron銆傛湰鏂囦富瑕佷粙緇嶆洸闈㈢殑緗戞牸琛ㄧず綾籌ntPatch_Polyhedron銆?/p>
OpenCASCADE鐢ㄤ簬鏇查潰姹備氦鐨勭綉鏍肩鏁g畻娉曠浉瀵笲RepMesh涓殑綆楁硶瑕佺畝鍗曞緢澶氾紝涓昏鎬濊礬鏄牴鎹弬鏁癠錛孷鏂瑰悜涓婄殑閲囨牱鐐規(guī)暟閲忔潵璁$畻鏇查潰涓婄殑鐐癸紝鍐嶆牴鎹浐瀹氬叕寮忓皢閲囨牱鐐硅繛鎴愪笁瑙掑艦銆傚叾涓敓鎴愰噰鏍風(fēng)偣浠g爜濡備笅鎵紺猴細(xì) 鎴愬憳鍙橀噺CMyPnts鏄噰鏍風(fēng)偣鏁扮粍錛孋MyU鍜孋MyV鏄噰鏍風(fēng)偣鍦ㄦ洸闈笂鐨勫弬鏁般傚皢閲囨牱鐐硅繛鎴愪笁瑙掑艦鍑芥暟濡備笅鍥炬墍紺猴細(xì) 鏍規(guī)嵁涓婅堪鐢熸垚閲囨牱鐐瑰強涓夎褰㈠嚱鏁幫紝瀵逛簬騫抽潰鐢熸垚鐨勪笁瑙掑艦濡備笅鍥炬墍紺猴細(xì) 鍏朵腑Triangle()鍑芥暟涓彉閲弆ine琛ㄧず鍙傛暟u鏂瑰悜涓婄鍑犳潯綰匡紝浠e叆鍏蜂綋鐨勭儲寮旾ndex鏉ョ湅瑙勫緥錛?/p>
褰撳弬鏁扮儲寮?Index涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)1-4-5錛?/p>
褰撳弬鏁扮儲寮旾ndex涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)1-5-2錛?/p>
褰撳弬鏁扮儲寮旾ndex涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)2-5-6錛?/p>
褰撳弬鏁扮儲寮旾ndex涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)2-6-3錛?/p>
褰撳弬鏁扮儲寮旾ndex涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)4-7-8錛?/p>
褰撳弬鏁扮儲寮旾ndex涓?鏃訛紝line涓?錛屽緱鍒扮殑涓夎褰負(fù)4-8-5錛?/p>
浠庝笂鍙互寰楀埌鐢熸垚涓夎褰㈢殑瑙勫緥錛屽嵆鏍規(guī)嵁绱㈠紩Index璁$畻姝e湪澶勭悊鐨勪笁瑙掑艦鏄弬鏁皍鏂瑰悜涓婄鍑犳潯綰縧ine錛岀敓鎴愯繖鏉$嚎涓婂湪鍙傛暟v鏂瑰悜涓婄殑鎵鏈夌殑涓夎褰€傜敓鎴愮殑涓夎褰㈤兘鏄嗘椂閽堢殑銆?/p>
涓嬮潰鎴戜滑鐪嬬湅瀵逛簬涓浜涘熀鏈洸闈紝榪欑紱繪暎緗戞牸綆楁硶鐢熸垚鐨勭綉鏍兼晥鏋滐細(xì) 鐞冮潰鐨勭鏁g綉鏍?/p>
鍦嗘煴闈㈢殑紱繪暎緗戞牸 鍦嗙幆闈㈢殑紱繪暎緗戞牸 B鏍鋒潯鏇查潰 緇間笂鎵榪幫紝綾籌ntPatch_Polyhedron涓敓鎴愮綉鏍肩殑綆楁硶涓昏渚濊禆鏇查潰鍦ㄥ弬鏁癠錛孷涓婄殑閲囨牱鐐規(guī)暟閲忋傞粯璁ら噰鏍風(fēng)偣鏁伴噺鏄牴鎹嚱鏁癗bSamplesV()鍜孨bSamplesU()鐢熸垚銆?/p>
涔熷彲浠ユ寚瀹氶噰鏍風(fēng)偣鏁伴噺錛屽綋閲囨牱鐐規(guī)暟閲忚秺澶氾紝鍒欑敓鎴愮殑涓夎褰㈣秺澶氾紝緗戞牸瓚婂瘑銆傚綋鐒惰繖縐嶆柟寮忎篃鍙敤鏉ョ敓鎴愭洸闈㈢殑鏄劇ず鏁版嵁錛岀敓鎴愰熷害寰堝揩錛屽敮涓鐨勭己闄鋒槸鐢熸垚鏄劇ず鐢ㄧ綉鏍肩殑綺懼害鍙兘閫氳繃閲囨牱鐐規(guī)暟閲忔潵鎺у埗錛屽浜庢洸鐜囧彉鍖栧ぇ鐨勬洸闈紝鑻ユ寚瀹氬鐨勯噰鏍風(fēng)偣錛屽垯浼?xì)鐢熸垚澶ч噺涓夎迮炲Q屽崰鐢ㄥぇ閲忓唴瀛樼┖闂淬?/p>
闄勪笂嫻嬭瘯浠g爜錛?/p>
鍦ㄤ紶緇熺殑鏈烘璁捐杞歡涓紝涓鑸嬌鐢ㄥ嚑浣曠害鏉熸眰瑙e櫒鏉ョ敾鑽夊浘錛屽啀閫氳繃瀵硅崏鍥捐繘琛屾媺浼告棆杞瓑鐢熸垚鐗瑰緛瀹炵幇寤烘ā鍔熻兘銆傚熀浜庡弬鏁板寲鍘嗗彶鐗瑰緛鏂瑰紡鏉ュ緩妯$殑杞歡緇曚笉寮鍑犱綍綰︽潫姹傝В鍣紝鐩墠涓繪祦鍟嗙敤杞歡涓鑸嬌鐢ㄨタ闂ㄥ瓙D-Cubed DCM鍙婅揪绱㈢殑CGM銆傚紑婧愪笘鐣屼篃鏈変袱嬈懼嚑浣曠害鏉熸眰瑙e櫒錛歋olveSpace鍜孭laneGCS銆?/p>
PlaneGCS瀛楅潰鎰忔濇槸騫抽潰鍑犱綍綰︽潫姹傝В鍣紝涓昏鐢ㄤ簬緇樺埗浜岀淮鑽夊浘銆傚洜涓篜laneGCS浠g爜鐩稿娓呮櫚錛屽姛鑳界畝鍗曪紝鍙兘澶勭悊騫抽潰鍑犱綍鍏冪礌鐨勭害鏉燂紝鏈枃涓昏緇撳悎紺轟緥浠g爜浠嬬粛PlaneGCS鐨勪嬌鐢ㄦ柟娉曪紝鍦ㄤ細(xì)鐢ㄧ殑鍩虹涓婂幓鐞嗚В婧愮爜鐨勫疄鐜伴昏緫銆?/p>
PlaneGCS涓昏鍖呭惈涓夐儴鍒嗭細(xì) 鍏朵腑鍑犱綍鍏冪礌鏁版嵁緇撴瀯涓畾涔夌殑鍑犱綍鍏冪礌濡備笅鍥炬墍紺猴細(xì) 浠庝笂鍥懼彲浠ョ湅鍒幫紝鐩墠鏀寔鐨勫嚑浣曞厓绱犳湁鐐筆oint錛岀洿綰縇ine錛屽渾Circle錛屾き鍦咵llipse錛屽弻鏇茬嚎Hyperbola錛屾姏鐗╃嚎Parabola錛屽渾寮rc/ArcOfEllipse/ArcOfHyperbola/ArcOfParabola錛屽強B鏍鋒潯鏇茬嚎BSpline錛屼笉榪囩湅浠g爜BSpline閮ㄥ垎鍑芥暟娌℃湁瀹炵幇錛屽簲璇ユ槸涓嶆敮鎸佺殑銆?/p>
綰︽潫鏉′歡鏂囦歡瀹氫箟鐨勭害鏉熺被鍨嬪涓嬪浘鎵紺猴細(xì) 浠庣害鏉熸眰瑙f枃浠朵腑鍙互鐪嬪埌錛屽叾涓暟瀛﹁綆椾富瑕佷嬌鐢‥igen涓潪綰挎ф柟紼嬬粍姹傝В綆楁硶鍜宐oost鐨勫浘graph綆楁硶錛屼粠涓彲浠ユ帹嫻嬪嚭瀹炵幇騫抽潰鍑犱綍綰︽潫姹傝В鍣ㄤ腑闇瑕佺殑鍏抽敭鎶鏈傚厛鎺屾彙PlaneGCS鐨勭敤娉曪紝鐒跺悗鍐嶅垎鏋愬叾鑳屽悗鐨勫疄鐜板師鐞嗙粏鑺傘?/p>
榪欓噷緇欏嚭涓涓畝鍗曠殑紺轟緥紼嬪簭錛屽厛璁╁ぇ瀹跺PlaneGCS鏈変釜璁よ瘑銆傜ず渚嬬▼搴忎腑婕旂ず浜嗙粰涓ゆ潯鐩寸嚎鍔犱笂姘村鉤鍜屽瀭鐩寸害鏉熴備負(fù)浜嗕究浜庢煡鐪嬬害鏉熷悗鐨勭粨鏋滐紝鍦ㄤ唬鐮佷腑鐢熸垚Draw Test Harness鑴氭湰鏂囦歡銆?/p>
紼嬪簭浠g爜濡備笅鎵紺猴細(xì) 浠庣▼搴忎唬鐮佷腑鍙互鐪嬪嚭PlaneGCS鐨勪嬌鐢ㄥ厛瑕佸畾涔夐渶瑕佽綆楃殑鍙傛暟aParameters錛岃繖浜涘弬鏁版槸鍑犱綍鍏冪礌涓殑鏁版嵁錛岄兘鏄嬌鐢ㄧ殑鎸囬拡銆傜劧鍚庡皢綰︽潫鍔犲叆鍒癎CS::System涓紝鏈鍚庝唬鍏ュ弬鏁拌皟鐢╯olve鍑芥暟榪涜姹傝В銆傛眰瑙f垚鍔熷悗浣跨敤applySolution()鍑芥暟搴旂敤姹傝В緇撴灉銆傛眰瑙g粨鏋滃湪Draw涓樉紺虹殑緇胯壊鐨勭嚎濡備笅鍥炬墍紺猴細(xì) 鏈枃緇撳悎紺轟緥浠g爜婕旂ず濡備綍浣跨敤PlaneGCS錛屼富瑕佷嬌鐢ㄤ簡姘村鉤鍜屽瀭鐩寸害鏉熴侾laneGCS涓繕鏀寔鍏朵粬綰︽潫綾誨瀷錛岀闉嬩滑鍙互鑷繁鎺㈢儲涓涓嬨傚嚑浣曢犲瀷鍐呮牳鍜屽嚑浣曠害鏉熸眰瑙e櫒甯歌鐪嬩綔鏄伐涓欳AD杞歡鐨勫崱鑴栧瓙鎶鏈紝寮婧愬簱涓鑸姛鑳戒笉澶畬鍠勶紝浣嗘槸鐢ㄦ潵鎺㈢儲鑳屽悗鐨勫疄鐜板師鐞嗚繕鏄湁鍙傝冨熼壌鎰忎箟鐨勩傚笇鏈涙湁鏇村鐨勭闉嬪幓浜嗚В鑳屽悗鐨勫師鐞嗭紝鍏卞悓鏉ユ彁楂樺浗鍐呬笁緇碈AD杞歡寮鍙戞按騫熾?/p> Abstract: 鏇查潰姹備氦鏄嚑浣曢犲瀷鍐呮牳鏈涓洪噸瑕佷篃鏈涓哄鏉傜殑闂涔嬩竴錛屾眰浜ょ畻娉曠殑璐ㄩ噺錛堢ǔ瀹氥佸噯紜佸揩閫燂級鐩存帴褰卞搷鍒板嚑浣曞唴鏍哥殑紼沖畾鎬у拰瀹炵敤紼嬪害錛屾晠鍏鋒湁鍗佸垎閲嶈鐨勬剰涔夈傛眰浜ら棶棰樺寘鎷洸綰夸笌鏇茬嚎姹備氦銆佹洸綰夸笌鏇查潰姹備氦鍜屾洸闈笌鏇查潰姹備氦錛屽叾涓渶閲嶈闅懼害鏈澶х殑褰撳睘鏇查潰涓庢洸闈㈡眰浜ら棶棰橈紝鍏朵粬姹備氦闂鍙互搴旂敤鏇查潰涓庢洸闈㈡眰浜ょ殑鎬濇兂浜堜互瑙e喅銆傛湰鏂囦富瑕佷粙緇峯pencascade涓洸闈笌鏇查潰姹備氦鐨勫疄鐜板師鐞嗐?/p>
Key Words: Face Face Intersection, Intersection 濡傛灉璇寸悊瑙pencascade涓潰鐨勬瀯閫犲師鐞嗭紙鍗崇悊瑙RepBuilderAPI_MakeFace鐨勬簮鐮侊級錛屾垜瑙夊緱綆楁槸鐞嗚В浜咮Rep琛ㄧず娉曠殑鏁版嵁緇撴瀯Modeling Data銆傚鏋滆鐞嗚В浜嗘洸闈笌鏇查潰姹備氦鐨勫疄鐜板師鐞嗭紝鎴戣寰楃畻鏄鍑犱綍鍐呮牳涓殑鏍稿績綆楁硶甯冨皵鎿嶄綔鏈変簡涓瀹氱殑璁よ瘑銆傛洸闈笌鏇查潰姹備氦榪囩▼錛圛ntersection Algorithm錛変腑涓昏渚濊禆涓夊ぇ宸ュ叿錛氭嫙鍚堬紙Approximation Algorithm錛夈佹姇褰憋紙Projection Algorithm錛夊拰瀹氫綅錛圕lassification Algorithm錛夈備笅闈㈢粨鍚堝竷?yōu)當(dāng)鎿嶄綔TKBO涓殑鏇查潰涓庢洸闈㈡眰浜ょ被IntTools_FaceFace婧愮爜瀹炵幇鍒嗗埆浠嬬粛榪欎笁澶у伐鍏風(fēng)殑搴旂敤鍦烘櫙銆俹pencascade涓殑綆楁硶綾諱竴鑸殑浣跨敤濂楄礬鍜屾妸澶ц薄瑁呭啺綆辯被浼兼誨叡鍒嗕笁姝ワ細(xì) 絎竴姝ワ紝鍒濆鍖栵紱閫氳繃鏋勯犲嚱鏁版垨Init()絳夊嚱鏁板皢綆楁硶綾婚渶瑕佺殑鍙傛暟杈撳叆榪涘幓錛汭ntTools_FaceFace涓氳繃SetParameters()鍑芥暟璁劇疆綆楁硶鐨勫弬鏁?/p>
絎簩姝ワ細(xì)璁$畻錛涗嬌鐢ㄥ嚱鏁癇uild()錛?Perform()鍑芥暟鏉ユ墽琛岃綆楋紱IntTools_FaceFace涓殑涓昏瀹炵幇閫昏緫鍦≒erform()涓?/p>
絎笁姝ワ細(xì)杈撳嚭錛涘皢璁$畻緇撴灉杈撳嚭銆侷ntTools_FaceFace閫氳繃Lines()鍜孭oints()鍑芥暟杈撳嚭璁$畻緇撴灉鍗充氦綰垮拰浜ょ偣銆?/p>
opencascade涓洸闈㈢殑琛ㄧず鏈変袱縐嶆柟寮忥紝涓縐嶆槸鍙傛暟鏂圭▼S(u,v)琛ㄧず錛屼竴縐嶆槸浜屾鏇查潰鐨勪唬鏁版柟紼媐(x,y,z)=0琛ㄧず銆傚洜姝や篃灝嗘洸闈㈡眰浜ら棶棰樺垎涓猴細(xì) opencascade涓綆楁洸闈㈡眰浜ゆ洿搴曞眰鐨勭被鏄疘ntPatch_Intersection錛屽叾涓篃鏄垎榪欎笁縐嶇被鍨嬫潵澶勭悊錛?/p>
GeomGeomPerfom()瀵瑰簲鐨勬槸浠f暟/浠f暟鏇查潰姹備氦錛?/p>
GeomParamPerform()瀵瑰簲鐨勬槸浠f暟/鍙傛暟鏇查潰姹備氦錛?/p>
ParamParamPerform()瀵瑰簲鐨勬槸鍙傛暟/鍙傛暟鏇查潰姹備氦錛?/p>
鍏朵腑浠f暟/浠f暟鏇查潰姹備氦鍑芥暟GeomGeomPerform()涓嬌鐢ㄧ被IntPatch_ImpImpIntersection鏉ヨ綆椾袱涓簩嬈′唬鏁版洸闈㈢殑姹備氦錛屽叾瀹炶繖鏄疘mp緙╁啓灝辨槸闅愬紡浠f暟鏂圭▼Implicit Equation鐨勬剰鎬濄?/p>
浜屾浠f暟鏇查潰鐨勬眰浜や嬌鐢ㄥ寘IntAna鏉ュ疄鐜幫紝榪欏湪鏃╂湡鏂囩珷涓垎鏋愪簡鍏跺疄鐜板師鐞嗭紝涓昏鎬濇兂鏄皢涓涓簩嬈℃洸闈㈢殑鍙傛暟琛ㄧず浠e叆闅愬紡鏂圭▼鍙樻垚涓鍏冩柟紼嬶紝鐒跺悗瀵硅繖涓竴鍏冩柟紼嬭繘琛屾眰瑙c備緥濡傚渾鏌遍潰涓庝簩嬈′唬鏁版洸闈㈡眰浜わ細(xì) 鍏朵腑浠f暟/鍙傛暟鏇查潰姹備氦鍑芥暟GeomParamPerform()涓嬌鐢ㄧ被IntPatch_ImpPrmIntersection鏉ヨ綆椾唬鏁版洸闈㈠拰鍙傛暟鏇查潰鐨勬眰浜わ紝榪欓噷Prm涓篜arametric equation鍙傛暟鏂圭▼鐨勭緝鍐欍傚叾浠g爜娉ㄩ噴涓啓鍒癰i-parametrised surface鎰忔濆弻鍙傛暟鏇查潰S(u, v)銆?/p>
鍏朵腑浠f暟/鍙傛暟鏇查潰姹備氦鍑芥暟ParamParamPerform()涓嬌鐢ㄧ被IntPatch_PrmPrmIntersection鏉ヨ綆楀弬鏁版暟鏇查潰鍜屽弬鏁版洸闈㈢殑姹備氦銆?/p>
鍙傛暟/鍙傛暟鏇查潰姹備氦鐨勫熀鏈柟娉曟湁浠ヤ笅浜旂錛?/p>
鐩稿叧鍘熺悊浠嬬粛鍙互鍙傝冩湵蹇冮泟絳夎憲銆婅嚜鐢辨洸綰挎洸闈㈤犲瀷鎶鏈嬨傚ぇ瀹跺彲浠ョ粨鍚堟簮鐮侊紝鐪嬬湅opencascade涓嬌鐢ㄤ簡鍝簺鏂規(guī)硶銆傛洸闈氦綰跨殑琛ㄨ揪娑夊強涓変釜闂錛屼氦鐐逛俊鎭〃紺猴紝浜ょ嚎緇勭粐鍙婁氦綰夸腑浜ょ偣鐨勫垹闄ょ瓥鐣ャ備氦綰跨殑琛ㄨ揪浣跨敤綾籌ntPatch_Line錛?/p>
鍦ㄧ被IntTools_FaceFace涓嚱鏁癝etParameters()涓彲浠ユ寚瀹氫氦綰夸腑浜ょ偣鐨勫垹闄ょ瓥鐣ャ傞氳繃鍙傛暟ApproxCurves鍜孉pproximationTolerance鏉ユ寚瀹氫氦綰夸腑浜ょ偣鏄惁鎷熷悎鍙婃嫙鍚堢簿搴︺傛眰浜よ繃紼嬩腑寰楀埌鐨勪氦鐐瑰線寰闈炲父鑷村瘑錛岃繖鏍瘋櫧鐒跺彲浠ヤ繚璇佷氦綰跨殑綺懼害錛屼絾淇濆瓨鐨勬暟鎹噺澶ぇ錛屽湪瀹為檯搴旂敤涓渶瑕佸垹闄ら儴鍒嗕氦鐐廣侾ratt鎻愬嚭浣跨敤鏈灝忎簩涔樻硶瀵逛氦綰塊艱繎錛屼互鍒犻櫎涓嶅繀瑕佺殑浜ょ偣銆傝繖閲屽氨闇瑕佷嬌鐢ㄥ埌鎷熷悎綆楁硶Approximation Algorithm銆?/p>
鍦╫pencascade涓嫙鍚堥棶棰樿鎶借薄鎴愰潪綰挎ф柟紼嬬粍鐨勬眰瑙i棶棰橈紝褰撶劧鏈灝忎簩涔樻硶涔熸槸鍏朵腑鏂規(guī)硶涔嬩竴銆傛嫙鍚堢畻娉曟槸閫犲瀷鍐呮牳涓渶鍩虹鏈閲嶈鐨勭畻娉曪紝闄や簡綆鍗曠殑鐐規(guī)嫙鍚堟垚綰夸互澶栵紝榪樿澶勭悊甯︾害鏉熺殑鎯呭喌錛屽鍔犱笂浜ょ偣閫氳繃鏇查潰鐨勪綅緗害鏉熺瓑銆傚嚑浣曠害鏉熸眰瑙e櫒涓牳蹇冧篃鏄姝ゃ傛硶鍥姐佷縿緗楁柉鏁板鍘夊錛屾垜鎯沖簲璇ユ槸宸茬粡褰㈡垚鐞嗚+搴旂敤鐨勮壇鎬у驚鐜傛暟瀛︽槸鍒涙柊鐨勫熀紜錛屾槸鐢ㄦ渶綆鍗曠殑璇█鏉ョ簿紜弿榪拌嚜鐒朵腑鐨勮寰嬶紝铏界劧鎴戜滑鐞嗗伐縐戜竴鐩村鏁板錛屼絾宸ヤ綔鍚庡緢澶т竴閮ㄥ垎浜哄緢灝戜嬌鐢ㄩ珮絳夋暟瀛︿腑鐨勫伐鍏鳳紝鎰熻鏁板娌′粈涔堢敤銆傚鑰屼笉鎬濆垯緗旓紝鎬濊屼笉瀛﹀垯孌嗐傛垜鎬葷粨鐨勫涔?fàn)瑙勫緥灏辨槸瑕佹湁瀹炶返锛屼笂瀛︽椂瀹炶返灏辨槸閫氳繃鍋氶錛屾暟瀛︾悊璁虹殑涓縐嶅疄璺靛氨鏄紑鍙戝嚭杞歡紼嬪簭銆?/p>
鐜板湪鍥藉鎻愬¤嚜涓繪垜瑙夊緱鏄ぇ濂戒簨錛屼粈涔堟椂鍊欐垜浠嚭涓涓嚑浣曞唴鏍革紝鍑轟竴涓狿DE鍋忓井鏂圭▼姹傝В鍣ㄧ瓑錛屽艦鎴愮悊璁哄姞瀹炶返鐨勮壇鎬у驚鐜紝浠ユ垜浠殑浜烘暟鍜屽嫟鍔籌紝紱葷鎶寮哄浗灝變笉浼?xì)澶獦q溿?/p>
鎶曞獎涓昏鐢ㄦ潵璁$畻鏇查潰涓婄殑鏇茬嚎瀵瑰簲鍒版洸闈㈠弬鏁扮┖闂寸殑鏇茬嚎PCurve錛岀敓鎴怓ACE闈㈡椂濡傛灉杈笶DGE涓病鏈塒Curve錛屽緱鍒扮殑闈㈡槸涓嶆紜殑銆傛姇褰辯畻娉曠殑瀹炵幇鍘熺悊鍦ㄦ棭鏈熺殑鏂囩珷涓凡緇忚緇嗕粙緇嶈繃錛屾姇褰辯畻娉曚緷璧栨嫙鍚堢畻娉曘傛姇褰辯畻娉曠敤鍦ㄧ敓鎴愪氦綰跨殑鍑芥暟涓璏akeCurve()錛?/p>
褰撲笉瀵逛氦綰胯繘琛屾嫙鍚堟椂錛岀敓鎴愪氦綰垮強PCurve涓昏浣跨敤綾籊eomInt_SS鐨勯潤鎬佸嚱鏁版潵寰楀埌浜ょ嚎錛?/p>
榪欐牱鐢熸垚鐨勪氦綰挎槸B鏍鋒潯鏇茬嚎涓旀帶鍒墮《鐐規(guī)暟閲忓緢澶с傚綋閫氳繃鎷熷悎鍙互鐢熸垚鏇寸畝鍖栫殑B鏍鋒潯浜ょ嚎銆?/p>
瀹氫綅宸ュ叿涓昏鐢ㄤ簬鍒ゆ柇鐐瑰拰涓涓尯鍩熺殑鐘舵侊紝鏄湪鍖哄煙鍐呫佸榪樻槸涓娿傚湪鏃╂湡鐨勬枃绔犱腑鏈変竴浜涗粙緇嶏細(xì)https://www.cnblogs.com/opencascade/p/Point_Classifier.html 鐐瑰畾浣嶅湪鏇查潰姹備氦涓殑搴旂敤灝辨槸澶勭悊鎷撴湸闈㈢殑鎯呭喌錛屽浜庡嚑浣曟洸闈紝鍏跺疄鍙傛暟鍩熷氨鏄叾鍙傛暟S(u,v)鐨勫彇鍊艱寖鍥淬傚浜庢嫇鏈撮潰錛屽叾鍙傛暟鍩熸槸閫氳繃杈圭晫W(xué)ire鏉ラ檺瀹氱殑錛岃屼笖榪樹細(xì)鏈夐潰涓婂紑瀛旂殑鎯呭喌闇瑕佸鐞嗐傚叾瀹濱ntTools_FaceFace涓昏鏄敤鏉ヨ綆桭ACE涓嚑浣曟洸闈㈡眰浜ょ殑錛屾病鏈夋紜鐞嗗畾浣嶉棶棰橈紝鍗崇敓鎴愮殑浜ょ嚎娌℃湁澶勭悊闈㈢殑杈圭晫闂銆傜浉淇$湅鎳傛簮鐮佺殑鍚屽鍙互瑙e喅榪欎釜闂銆?/p>
瀹氫綅闂鏄釜鍑犱綍闂錛屽湪銆婅綆楀嚑浣曞強搴旂敤銆嬩竴涔︿腑鏈夊鐐圭殑瀹氫綅闂鏈夎緇嗙畻娉曘備竴鑸殑澶勭悊鏂規(guī)硶鏄氳繃鐐逛綔涓鏉″崐灝勭嚎錛岃綆楀崐灝勭嚎涓庡杈瑰艦浜ょ偣鐨勪釜鏁幫紝鑻ヤ氦鐐規(guī)暟涓哄鏁幫紝鍒欑偣鍦ㄥ唴閮紝鍚﹀垯鍦ㄥ閮ㄣ傝繕鏈変竴縐嶆柟娉曟槸閫氳繃璁$畻鐐逛笌澶氳竟褰㈠悇欏剁偣鐨勮搴︽潵鍒ゆ柇銆傝繖涓ょ鏂瑰紡鏃墮棿澶嶆潅搴﹀潎涓篛(n)銆俹pencascade涓嬌鐢ㄧ殑絎竴縐嶆柟娉曘備功涓彁鍒板嚑縐嶆晥鐜囨洿楂樼殑綆楁硶錛屽鐐瑰畾浣嶉棶棰樼殑鍒嗗眰鏂規(guī)硶錛屽彲浠ュ皢鏌ヨ鏃墮棿鎻愰珮鍒癘(logn)銆傜偣瀹氫綅闂鐨勫崟璋冮摼鏂規(guī)硶鐢∣(nlogn)鏃墮棿鍜孫(n)絀洪棿浣滈澶勭悊錛屾煡璇㈡椂闂村彲浠((logn)^2)瀹屾垚銆傜偣瀹氫綅鐨勪笁瑙掑艦緇嗗垎鏂規(guī)硶(Triangulation refinement method)鍙敤O(n)絀洪棿瀛樻斁棰勫鐞嗙粨鏋滐紝鐢∣(logn)鏃墮棿鍥炵瓟鐐瑰湪鍝釜鍖哄煙錛屽畬鎴愰澶勭悊鐨勬椂闂存槸O(nlogn)銆傜敱姝ゅ彲瑙侊紝opencascade鐨勫畾浣嶇畻娉曡繕鏈変竴浜涙敼榪涚┖闂淬?/p>
鍑犱綍鍐呮牳涓洸闈㈠拰鏇查潰姹備氦鏄渶閲嶈鏈澶嶆潅鐨勯棶棰橈紝澶勭悊鏇查潰鍜屾洸闈㈡眰浜ら渶瑕佹嫙鍚圓pproximation Algorithm銆佹姇褰盤rojection Algorithm鍜屽畾浣岰lassification Algorithm宸ュ叿銆傚叾涓嫙鍚堝拰鎶曞獎涓昏鏄暟瀛﹂棶棰橈紝瀹氫綅涓昏鏄釜鍑犱綍闂錛岀悊瑙i棶棰樺氨鑳芥壘鍒扮浉搴旂殑瑙e喅宸ュ叿銆傚簡騫告湁opencascade榪欎釜鍔熻兘鐩稿瀹屽鐨勫紑婧愮殑鍑犱綍鍐呮牳錛屾彁渚涗簡涓涓悊璁鴻仈緋誨疄璺電殑騫沖彴銆傜悊瑙f暟瀛︾悊璁哄悗鍙互鍘婚槄璇繪簮鐮侊紝鐢氳嚦鏄弬涓庡拰璐$尞錛屾眰浜ゃ佹嫙鍚堛佹姇褰卞拰瀹氫綅宸ュ叿閮芥湁涓浜涙敼榪涚┖闂淬?/p>
鏈榪戝叧娉ㄧ殑鏈嬪弸璇存枃绔犲彂寰楀皯浜嗭紝涓昏鍘熷洜鏄湁鐐瑰繖錛屼笉鏄洜涓轟繚瀹堜笉鎯沖垎浜紝褰撶劧鏈変簺鏈嬪弸涔熸彁閱掕鐣欎竴鎵嬨傚浜巓pencascade鐨勬妧鏈垎浜垜鏄病鏈変繚鐣欑殑錛屽洜涓簅pencascade鏄紑婧愮殑錛屽鏋滈氳繃榪欎簺鏂囩珷鍒嗕韓鑳藉府鍔╁埆浜鴻В鍐充竴浜涢棶棰橈紝灝辨槸鍒涢犱環(huán)鍊鹼紝鏄湁鎰忎箟鐨勩傛椂涓嶆椂鏀跺埌緗戝弸鐨勬劅璋紝鏀惰幏鐨勬劅鍔ㄤ笉鏄敤閲戦挶鍙互琛¢噺鐨勩?/p>
McCad鏄竴涓紑婧愬伐鍏鳳紝鑳借嚜鍔ㄥ皢BRep妯″瀷杞崲鎴怌SG妯″瀷銆傞殢鐫鏍稿姩鍔涙妧鏈殑鍙戝睍錛屼笉鏂紑灞曟柊鍨嬪弽搴斿爢鐨勭爺絀訛紝鍙嶅簲鍫嗙殑鐕冩枡褰㈠紡鍜屽爢鑺竷緗兘杈冧負(fù)澶嶆潅錛岀敱浜庤挋鐗瑰崱緗?MC)鏂規(guī)硶鍏鋒湁寮哄ぇ鐨勫嚑浣曞鐞嗚兘鍔涘拰杈冮珮鐨勮綆楃簿紜害錛屽畠鏄ā鎷熷垎鏋愯繖浜涘鏉傚爢鑺殑鏈夋晥鎵嬫銆傞氳繃浣跨敤McCad灝嗗鏉侭Rep妯″瀷杞崲鎴怌SG妯″瀷錛孋SG琛ㄧず鐨勬ā鍨嬪彲浣滀負(fù)鏍稿弽搴斿爢鑺綆楄挋鐗瑰崱緗?MC)鏂規(guī)硶鐨勮緭鍏ャ?/p>
McCad鍩轟簬OpenCASCADE鍐呮牳宸茬粡鎸佺畫寮鍙戜簡20騫達(dá)紝鍩轟簬LGPL鍗忚寮婧愶紝鎰熷叴瓚g殑灝忎紮浼村彲浠ヤ笅杞藉皾璇曚竴涓嬶細(xì) https://github.com/inr-kit/McCAD-Library BRep杞珻SG涓漢鎰熻娌℃湁瀹岀編鐨勮В鍐蟲柟妗堬紝浣嗘槸搴旂敤鑼冨洿寰堝箍銆傚鏋滆漿鎹㈡晥鏋滃ソ錛屽叾瀹炶繕鏈変竴涓敤閫旓紝灝辨槸灝咮Rep杞崲鐨凜SG妯″瀷瀵煎叆鍒癙DMS涓紝浠庤岃В鍐抽氳繃鏈烘璁懼鎺ュ彛MEI瀵煎叆STEP/IGES鍚嶱DMS妯″瀷鏁版嵁鍙樺ぇ鐨勯棶棰樸?/p>
McCad is an open source tool for automatic conversion of B-Rep models into CSG. McCad has been continuously developed for more than two decades. It provides automatic conversion of Boundary Representation (BREP) CAD models into Constructive Solid Geometry (CSG), the latter of which is an input syntax often used in Monte Carlo (MC) radiation transport codes. The conversion process, from BREP to CSG, is essential for high-fidelity nuclear analysis of complex nuclear facilities. McCad can convert CAD files in STEP format to different input syntaxes used with MC codes such as MCNP, TRIPOLI, Geant4, etc., so that the manual efforts on building a complex simulation model can be avoided. McCad provides an advanced algorithm to decompose complex solids into its constituent convex primitives, and generates the void space description between the solids, which is required by MC codes. It relies on OpenCASCADE CAD kernel to perform CAD manipulations and Boolean operations. McCad has been integrated into the SALOME platform, with a detailed manual provided. It is an open-source code released under LGPL license. This code has been currently used for nuclear research institutes crossing continents, for nuclear analyses on fission reactors, fusion facilities and neutron source facilities. OpenCASCADE鐨勬樉紺烘ā鍧楃殑鍔熻兘鎬ц兘濡備綍錛屽緢澶氫漢閮藉緢鍏沖績銆傚紑婧愮ぞ鍖虹殑FreeCAD鐩墠鐨勬樉紺哄姛鑳介兘娌℃湁浣跨敤OpenCASCADE鐨勬樉紺烘ā鍧椼傛棭鍦?014騫存椂錛屾垜鍦ㄧぞ鍖鴻鍧涙彁鍑鴻繃鏄劇ず妯″潡浜や簰閫夋嫨鐨勬ц兘闂錛?/p>
https://dev.opencascade.org/content/selection-convert-2d-not-very-efficient 褰撴椂鐨勭増鏈簲璇ユ槸6.8.0銆傚湪6.7.1鐨勫彂甯冧俊鎭腑榪樻彁鍒頒簡鎴戝緢寮蹇冿細(xì) 褰撴椂KGV涔熸鍦ㄤ紭鍖栬繖閮ㄥ垎鐨勫姛鑳斤細(xì) https://tracker.dev.opencascade.org/view.php?id=24623 閫氳繃寮曞叆BVH鏉ユ洿楂樻晥鍦板鐞嗛夋嫨錛岃繖涓姛鑳介泦鎴愬埌6.9.0鐨勭増鏈腑浜嗐傚湪6.8.0鐗堟湰涓凡緇忓湪澧炲己鏄劇ず妯″潡鐨勬ц兘錛屽寮曞叆culling鏈哄埗錛?/p>
https://tracker.dev.opencascade.org/view.php?id=24307 鍒?.4.0鐗堟湰錛宑ulling鍩烘湰瀹屽杽錛屽綋妯″瀷瓚呭嚭瑙嗛敟浣撹寖鍥村氨浠庢樉瀛樹腑鍘婚櫎錛?/p>
https://tracker.dev.opencascade.org/view.php?id=30223 鍒扮幇鍦ㄦ渶鏂扮増鏈紝鏄劇ず妯″潡鐨勬樉紺哄拰浜や簰鍔熻兘鐨勬ц兘鍒板簳濡備綍錛屼笅闈㈢粰鍑烘垜鐨勪竴涓祴璇曪紝嫻嬭瘯緇撴灉浠呬緵鍙傝冦?/p>
嫻嬭瘯鐢?shù)鑴戠殑閰嵕|俊鎭涓嬭〃錛?/p>
榪欏彴鐢?shù)鑴戝凡缁忔槸濂藉嚑骞翠箣鍓嶇殑閰嵕|簡錛岀浉瀵圭幇鍦ㄧ殑涓繪祦閰嶇疆宸茬粡钀藉悗浜嗐?/p>
榪欎釜嫻嬭瘯妯″瀷鏄埞鐨勮墢閮ㄦā鍨嬶紝鍖呮嫭鑸逛綋緇撴瀯鍜岃埦瑁呮ā鍨嬶紝鎬誨叡鐨勪笁瑙掗潰鐗囨暟閲忎負(fù)5鐧句竾錛屽撫鏁癋PS涓?5.8錛屽撫鏁板ぇ浜?2搴旇綆楁祦鐣呫備氦浜掗夋嫨鎬ц兘寰堝ソ錛屾劅瑙変笉鍒板歡榪燂紝榧犳爣縐誨姩鍒版ā鍨嬩笂灝卞彲浠ラ珮浜?/p>
榪欎釜嫻嬭瘯妯″瀷鏄竴涓浮杞紝鍖呮嫭鑸逛綋緇撴瀯鍜岃埦瑁呯殑鎵鏈夋ā鍨嬶紝鎬誨叡鐨勪笁瑙掗潰鐗囨暟閲忎負(fù)1鍗?鐧句竾錛屽撫鏁癋PS涓?.1錛岃鍥炬搷浣滐紙瀵硅鍥劇緝鏀俱佹棆杞佺Щ鍔級宸茬粡鏈夋瘮杈冧弗閲嶇殑寤惰繜錛屼絾鏄氦浜掗夋嫨鎬ц兘榪樹笉閿欙紝娌℃湁寤惰繜錛岄紶鏍囩Щ鍔ㄥ埌妯″瀷涓婁篃鏄疄鏃墮珮浜?/p>
榪欎釜鏄搗媧嬪鉤鍙版ā鍨嬶紝鍖呮嫭緇撴瀯鍜岃埦瑁呮ā鍨嬨傝繖涓ā鍨嬮噺鏈澶э紝鎬誨叡鏈?鍗?鐧句竾涓夎闈㈢墖錛屽撫鏁癋PS涓?.2錛岃鍥炬搷浣滐紙瀵硅鍥劇緝鏀俱佹棆杞佺Щ鍔級宸茬粡鏈夋瘮杈冧弗閲嶇殑寤惰繜錛屼絾鏄氦浜掗夋嫨鎬ц兘榪樹笉閿欙紝娌℃湁寤惰繜錛岄紶鏍囩Щ鍔ㄥ埌妯″瀷涓婁篃鏄疄鏃墮珮浜傝繖涓渶澶х殑妯″瀷鍗犵敤鍐呭瓨鎯呭喌濡備笅鍥炬墍紺猴細(xì) 杞歡鎬誨叡鍗犲瓨3.4G鍐呭瓨錛岃繖鍏朵腑榪樺寘鍚乏杈圭殑璁捐瀵艱埅鏍?wèi)鐨勬暟鎹傚綋灝嗘ā鍨嬫斁澶э紝瓚呭嚭瑙嗗浘鑼冨洿澶栫殑妯″瀷宸茬粡琚墧闄ulling錛屾墍浠ュ彲浠ヤ粠涓婂浘鍙互鐪嬪嚭涓夎闈㈢墖鏁伴噺鍙樺皯浜嗭紝涓?鐧句竾銆?/p>
閫氳繃浠ヤ笂鐨勬祴璇曟暟鎹紝澶у鍙互緇撳悎鑷繁琛屼笟妯″瀷鐨勪綋閲忔潵閫夋嫨鏄惁浣跨敤OpenCASCADE鐨勬樉紺烘ā鍧椼傚浜庢帴榪?鍗冧竾涓夎闈㈢墖鐨勬ā鍨嬫潵璇達(dá)紝妯″瀷閲忓凡緇忔瘮杈冨ぇ錛屽湪榪欎釜鐢?shù)鑴戦厤缃儏鍐典笅鍩烘湰鑳芥弧鑳鲣竴浜涘ぇ浣撻噺鐨勬ā鍨嬫樉紺哄強浜や簰鎿嶄綔銆傚洜涓哄浜庡ぇ鐨勮璁℃ā鍨嬶紝涓鑸湪璁捐榪囩▼涓紝涔熶笉鏄竴涓漢璁捐錛岃屾槸澶氫漢澶氫笓涓氬崗鍚岃璁★紝涓涓漢娑夊強鍒扮殑妯″瀷閲忎竴鑸笉浼?xì)杈惧?鍗冧竾榪欎釜閲忕駭銆傝屽綋璁捐瀹屾垚錛屽彧闇瑕佹祻瑙堟椂錛堝妯″瀷璇勫錛夛紝榪欐椂灝辨湁寰堝浼樺寲鎵嬫銆?/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"
}
]]>


]]>1 姒傝堪

2 楂樹腑鏃朵唬

3 澶у鏃朵唬


4 鐮旂┒鐢熸椂浠?/h2>


5 鎬葷粨
]]>1 Introduction

2 ALine
# Test for IntPatch_ALine.
# Geometry surfaces.
cylinder s1 0 0 0 1 1 1 2
cone s2 0 0 0 0 0 1 1 0 0 30 3
# Topology faces
mkface f1 s1 0 2*pi -8 8
mkface f2 s2 0 2*pi -5 5
# Intersection.
bop f1 f2
bopsection r
# Display result.
vdisplay f1 f2 r

3 GLine
# Test for IntPatch_GLine.
cone s1 0 0 0 0 0 1 30 3
plane s2 0 0 0 0 0 1
mkface f1 s1 0 2*pi -5 5
mkface f2 s2 -8 8 -8 8
bop f1 f2
bopsection r
vdisplay f1 f2 r


4 WLine
# Test for IntPatch_WLine.
cone s1 0 0 0 0 0 1 30 3
plane s2 0 0 0 1 1 2
mkface f1 s1 0 2*pi -5 5
mkface f2 s2 -8 8 -8 8
nurbsconvert f1 f1
nurbsconvert f2 f2
bop f1 f2
bopsection r
vdisplay f1 f2 r

5 RLine
# Test for IntPatch_RLine.
plane s1 0 0 0 0 0 1
plane s2 0 0 0 0 0 1
mkface f1 s1 -5 5 -5 5
mkface f2 s2 -8 8 -8 8
nurbsconvert f1 f1
bop f1 f2
bopsection r
vdisplay f1 f2 r



6 Conclusion
]]>1 Introduction


2 BVH
2.1 BVH_Set


2.2 BVH_Traverse
//=======================================================================
//function : ShapeSelector
//purpose : Implement the simplest shape's selector
//=======================================================================
class ShapeSelector :
public BVH_Traverse <Standard_Real, 3, BVH_BoxSet <Standard_Real, 3, TopoDS_Shape>, Standard_Boolean>
{
public:
//! Constructor
ShapeSelector() {}
//! Sets the Box for selection
void SetBox (const Bnd_Box& theBox)
{
myBox = Bnd_Tools::Bnd2BVH (theBox);
}
//! Returns the selected shapes
const NCollection_List<TopoDS_Shape>& Shapes () const { return myShapes; }
public:
//! Defines the rules for node rejection by bounding box
virtual Standard_Boolean RejectNode (const BVH_Vec3d& theCornerMin,
const BVH_Vec3d& theCornerMax,
Standard_Boolean& theIsInside) const Standard_OVERRIDE
{
Standard_Boolean hasOverlap;
theIsInside = myBox.Contains (theCornerMin, theCornerMax, hasOverlap);
return !hasOverlap;
}
//! Defines the rules for leaf acceptance
virtual Standard_Boolean AcceptMetric (const Standard_Boolean& theIsInside) const Standard_OVERRIDE
{
return theIsInside;
}
//! Defines the rules for leaf acceptance
virtual Standard_Boolean Accept (const Standard_Integer theIndex,
const Standard_Boolean& theIsInside) Standard_OVERRIDE
{
if (theIsInside || !myBox.IsOut (myBVHSet->Box (theIndex)))
{
myShapes.Append (myBVHSet->Element (theIndex));
return Standard_True;
}
return Standard_False;
}
protected:
BVH_Box <Standard_Real, 3> myBox; //!< Selection box
NCollection_List <TopoDS_Shape> myShapes; //!< Selected shapes
};2.3 BVH_PairTraverse
//=======================================================================
//function : MeshMeshDistance
//purpose : Class to compute the distance between two meshes
//=======================================================================
class MeshMeshDistance : public BVH_PairDistance<Standard_Real, 3, BVH_BoxSet<Standard_Real, 3, Triangle>>
{
public:
//! Constructor
MeshMeshDistance() {}
public:
//! Defines the rules for leaf acceptance
virtual Standard_Boolean Accept (const Standard_Integer theIndex1,
const Standard_Integer theIndex2) Standard_OVERRIDE
{
const Triangle& aTri1 = myBVHSet1->Element (theIndex1);
const Triangle& aTri2 = myBVHSet2->Element (theIndex2);
Standard_Real aDistance = TriangleTriangleSqDistance (aTri1._Node1, aTri1._Node2, aTri1._Node3,
aTri2._Node1, aTri2._Node2, aTri2._Node3);
if (aDistance < myDistance)
{
myDistance = aDistance;
return Standard_True;
}
return Standard_False;
}
};2.4 BVH_Builder

// Define BVH Builder
opencascade::handle <BVH_LinearBuilder <Standard_Real, 3> > aLBuilder =
new BVH_LinearBuilder <Standard_Real, 3>();
// Create the ShapeSet
opencascade::handle <BVH_BoxSet <Standard_Real, 3, Triangle> > aTriangleBoxSet[2];
for (Standard_Integer i = 0; i < 2; ++i)
{
aTriangleBoxSet[i] = new BVH_BoxSet <Standard_Real, 3, Triangle> (aLBuilder);
TopTools_IndexedMapOfShape aMapShapes;
TopExp::MapShapes (aShape[i], TopAbs_FACE, aMapShapes);
for (Standard_Integer iS = 1; iS <= aMapShapes.Extent(); ++iS)
{
const TopoDS_Face& aF = TopoDS::Face (aMapShapes(iS));
TopLoc_Location aLoc;
const Handle(Poly_Triangulation)& aTriangulation = BRep_Tool::Triangulation(aF, aLoc);
const int aNbTriangles = aTriangulation->NbTriangles();
for (int iT = 1; iT <= aNbTriangles; ++iT)
{
const Poly_Triangle aTriangle = aTriangulation->Triangle (iT);
// Nodes indices
Standard_Integer id1, id2, id3;
aTriangle.Get (id1, id2, id3);
const gp_Pnt aP1 = aTriangulation->Node (id1).Transformed (aLoc.Transformation());
const gp_Pnt aP2 = aTriangulation->Node (id2).Transformed (aLoc.Transformation());
const gp_Pnt aP3 = aTriangulation->Node (id3).Transformed (aLoc.Transformation());
BVH_Vec3d aBVHP1 (aP1.X(), aP1.Y(), aP1.Z());
BVH_Vec3d aBVHP2 (aP2.X(), aP2.Y(), aP2.Z());
BVH_Vec3d aBVHP3 (aP3.X(), aP3.Y(), aP3.Z());
BVH_Box<Standard_Real, 3> aBox;
aBox.Add (aBVHP1);
aBox.Add (aBVHP2);
aBox.Add (aBVHP3);
aTriangleBoxSet[i]->Add (Triangle (aBVHP1, aBVHP2, aBVHP3), aBox);
}
}
// Build BVH
aTriangleBoxSet[i]->Build();
}
// Initialize selector
MeshMeshDistance aDistTool;
// Select the elements
aDistTool.SetBVHSets (aTriangleBoxSet[0].get(), aTriangleBoxSet[1].get());
Standard_Real aSqDist = aDistTool.ComputeDistance();
if (!aDistTool.IsDone())
std::cout << "Not Done" << std::endl;
else
theDI << "Distance " << sqrt (aSqDist) << "\n";3 Conclusion
Standard_Boolean BRepExtrema_Poly::Distance (const TopoDS_Shape& S1, const TopoDS_Shape& S2,
gp_Pnt& P1, gp_Pnt& P2, Standard_Real& dist)
]]>1 Introduction

2 Example
typedef NCollection_UBTree<Standard_Integer, Bnd_Box> BoxTree;
typedef NCollection_UBTreeFiller<Standard_Integer, Bnd_Box> BoxTreeFiller;
class BoxSelector : public BoxTree::Selector
{
public:
BoxSelector(const TColgp_SequenceOfPnt& thePoints, Standard_Real theTolerance)
: Selector()
, myPoints(thePoints)
, myTolerance(theTolerance)
{
}
virtual Standard_Boolean Reject(const Bnd_Box& theBox) const
{
return theBox.IsOut(myBox);
}
virtual Standard_Boolean Accept(const Standard_Integer& theIndex)
{
if (theIndex > myPoints.Size() || theIndex == myIndex)
{
return Standard_False;
}
const gp_Pnt& aPnt = myPoints.Value(theIndex);
if (aPnt.SquareDistance(myPnt) < myTolerance)
{
myResultIndex.Append(theIndex);
return Standard_True;
}
return Standard_False;
}
void SetCurrentPoint(const gp_Pnt& thePnt, Standard_Integer theIndex)
{
myPnt = thePnt;
myBox.Add(thePnt);
myIndex = theIndex;
}
const TColStd_ListOfInteger& GetResultIndex() const
{
return myResultIndex;
}
void ClearResultIndex()
{
myResultIndex.Clear();
}
protected:
private:
const TColgp_SequenceOfPnt& myPoints;
gp_Pnt myPnt;
Bnd_Box myBox;
Standard_Integer myIndex;
Standard_Real myTolerance;
TColStd_ListOfInteger myResultIndex;
};int main(int argc, char* argv[])
{
// Fill tree with random points.
BoxTree aBoxTree;
BoxTreeFiller aTreeFiler(aBoxTree);
math_BullardGenerator aRandom;
TColgp_SequenceOfPnt aPoints;
for (Standard_Integer i = 1; i <= 100; ++i)
{
gp_Pnt aPnt(aRandom.NextReal(), aRandom.NextReal(), aRandom.NextReal());
aPoints.Append(aPnt);
Bnd_Box aBox;
aBox.Add(aPnt);
aTreeFiler.Add(i, aBox);
}
aTreeFiler.Fill();
// Query points near the given point.
BoxSelector aSelector(aPoints, 0.1);
for (Standard_Integer i = aPoints.Lower(); i <= aPoints.Upper(); ++i)
{
const gp_Pnt& aPnt = aPoints.Value(i);
aSelector.SetCurrentPoint(aPnt, i);
Standard_Integer aSize = aBoxTree.Select(aSelector);
if (aSize > 0)
{
std::cout << "Search Point : " << aPnt.X() << " \t " << aPnt.Y() << " \t " << aPnt.Z() << std::endl;
const TColStd_ListOfInteger& aResult = aSelector.GetResultIndex();
for (TColStd_ListOfInteger::Iterator aIt(aResult); aIt.More(); aIt.Next())
{
const gp_Pnt& aPoint = aPoints.Value(aIt.Value());
std::cout << "Target Point : " << aPoint.X() << " \t " << aPoint.Y() << " \t " << aPoint.Z() << std::endl;
}
std::cout << "=============================" << std::endl;
}
aSelector.ClearResultIndex();
}
return 0;
}3 Conclusion
]]>1 Introduction

2 榪借釜娉曠殑鍘熺悊
3 榪借釜娉曠殑瀹炵幇




4 Conclusion
1 Introduction
2 Newton榪唬姹備氦




3 Conclusion
1 Introduction
2 Newton榪唬姹備氦




3 涓夊弬鏁拌凱浠f柟紼嬬粍




4 Conclusion
1 Introduction
2 緗戞牸紱繪暎


3 緗戞牸姹備氦

4 Conclusion
1 Introduction
2 Polyhedron Interference





3 Conclusion
1 Introduction
2 Polyhedron







3 Conclusion

#include <TColgp_Array2OfPnt.hxx>
#include <Geom_Plane.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom_ConicalSurface.hxx>
#include <Geom_SphericalSurface.hxx>
#include <Geom_ToroidalSurface.hxx>
#include <Geom_BSplineSurface.hxx>
#include <GeomAdaptor_Surface.hxx>
#include <GeomAPI_PointsToBSplineSurface.hxx>
#include <IntPatch_Polyhedron.hxx>
#include <IntPatch_InterferencePolyhedron.hxx>
#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib")
void makeSurface(Handle(Geom_BSplineSurface)& theSurface)
{
TColgp_Array2OfPnt aPoints(1, 5, 1, 5);
aPoints.SetValue(1, 1, gp_Pnt(-4, -4, 5));
aPoints.SetValue(1, 2, gp_Pnt(-4, -2, 5));
aPoints.SetValue(1, 3, gp_Pnt(-4, 0, 4));
aPoints.SetValue(1, 4, gp_Pnt(-4, 2, 5));
aPoints.SetValue(1, 5, gp_Pnt(-4, 4, 5));
aPoints.SetValue(2, 1, gp_Pnt(-2, -4, 4));
aPoints.SetValue(2, 2, gp_Pnt(-2, -2, 4));
aPoints.SetValue(2, 3, gp_Pnt(-2, 0, 4));
aPoints.SetValue(2, 4, gp_Pnt(-2, 2, 4));
aPoints.SetValue(2, 5, gp_Pnt(-2, 5, 4));
aPoints.SetValue(3, 1, gp_Pnt(0, -4, 3.5));
aPoints.SetValue(3, 2, gp_Pnt(0, -2, 3.5));
aPoints.SetValue(3, 3, gp_Pnt(0, 0, 3.5));
aPoints.SetValue(3, 4, gp_Pnt(0, 2, 3.5));
aPoints.SetValue(3, 5, gp_Pnt(0, 5, 3.5));
aPoints.SetValue(4, 1, gp_Pnt(2, -4, 4));
aPoints.SetValue(4, 2, gp_Pnt(2, -2, 4));
aPoints.SetValue(4, 3, gp_Pnt(2, 0, 3.5));
aPoints.SetValue(4, 4, gp_Pnt(2, 2, 5));
aPoints.SetValue(4, 5, gp_Pnt(2, 5, 4));
aPoints.SetValue(5, 1, gp_Pnt(4, -4, 5));
aPoints.SetValue(5, 2, gp_Pnt(4, -2, 5));
aPoints.SetValue(5, 3, gp_Pnt(4, 0, 5));
aPoints.SetValue(5, 4, gp_Pnt(4, 2, 6));
aPoints.SetValue(5, 5, gp_Pnt(4, 5, 5));
theSurface = GeomAPI_PointsToBSplineSurface(aPoints).Surface();
}
void writeStl(const IntPatch_Polyhedron& thePolyhedron, const std::string& theFileName)
{
// Dump surface polyhedron to STL file.
std::ofstream aStlFile(theFileName);
aStlFile << "solid polyhedron" << std::endl;
// Dump triangles.
for (Standard_Integer t = 1; t <= thePolyhedron.NbTriangles(); ++t)
{
Standard_Integer aPi1 = 0;
Standard_Integer aPi2 = 0;
Standard_Integer aPi3 = 0;
thePolyhedron.Triangle(t, aPi1, aPi2, aPi3);
const gp_Pnt& aP1 = thePolyhedron.Point(aPi1);
const gp_Pnt& aP2 = thePolyhedron.Point(aPi2);
const gp_Pnt& aP3 = thePolyhedron.Point(aPi3);
aStlFile << "facet" << std::endl;
aStlFile << "outer loop" << std::endl;
aStlFile << "vertex " << aP1.X() << " " << aP1.Y() << " " << aP1.Z() << std::endl;
aStlFile << "vertex " << aP2.X() << " " << aP2.Y() << " " << aP2.Z() << std::endl;
aStlFile << "vertex " << aP3.X() << " " << aP3.Y() << " " << aP3.Z() << std::endl;
aStlFile << "endloop" << std::endl;
aStlFile << "endfacet" << std::endl;
}
aStlFile << "endsolid polyhedron" << std::endl;
aStlFile.close();
}
void testPolyhedron()
{
// Plane surface polyhedron.
Handle(Geom_Plane) aPlane = new Geom_Plane(gp::XOY());
Handle(GeomAdaptor_Surface) aSurfaceAdaptor = new GeomAdaptor_Surface(aPlane, 0.0, 10.0, 0.0, 20.0);
IntPatch_Polyhedron aPlanePolyhedron(aSurfaceAdaptor);
writeStl(aPlanePolyhedron, "d:/plane.stl");
// Spherical surface polyhedron.
Handle(Geom_SphericalSurface) aSphericalSurface = new Geom_SphericalSurface(gp::XOY(), 3.0);
aSurfaceAdaptor = new GeomAdaptor_Surface(aSphericalSurface);
IntPatch_Polyhedron aSphericalPolyhedron(aSurfaceAdaptor);
writeStl(aSphericalPolyhedron, "d:/spherical.stl");
// Cylindrical surface polyhedron.
Handle(Geom_CylindricalSurface) aCylindricalSurface = new Geom_CylindricalSurface(gp::XOY(), 5.0);
aSurfaceAdaptor = new GeomAdaptor_Surface(aCylindricalSurface, 0.0, M_PI, 0.0, 8.0);
IntPatch_Polyhedron aCylindricalPolyhedron(aSurfaceAdaptor);
writeStl(aCylindricalPolyhedron, "d:/cylindrical.stl");
// Toroidal Surface polyhedron.
Handle(Geom_ToroidalSurface) aToroidalSurface = new Geom_ToroidalSurface(gp::XOY(), 10.0, 3.0);
aSurfaceAdaptor = new GeomAdaptor_Surface(aToroidalSurface);
IntPatch_Polyhedron aToroidalPolyhedron(aSurfaceAdaptor);
writeStl(aToroidalPolyhedron, "d:/toroidal.stl");
// BSpline surface polyhedron.
Handle(Geom_BSplineSurface) aBSplineSurface;
makeSurface(aBSplineSurface);
aSurfaceAdaptor = new GeomAdaptor_Surface(aBSplineSurface);
IntPatch_Polyhedron aPolyhedron(aSurfaceAdaptor);
writeStl(aPolyhedron, "d:/bspline.stl");
}
int main(int argc, char* argv[])
{
testPolyhedron();
return 0;
}
]]>1 Introduction
2 PlaneGCS


3 Code Example

/*
Copyright(C) 2023 Shing Liu(eryar@163.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "GCS.h"
#include <fstream>
void test()
{
double aPx1 = 0.0;
double aPy1 = 0.0;
double aPx2 = 3.0;
double aPy2 = 3.0;
double aPx3 = 6.0;
double aPy3 = 9.0;
GCS::VEC_pD aParameters;
aParameters.push_back(&aPx1);
aParameters.push_back(&aPy1);
aParameters.push_back(&aPx2);
aParameters.push_back(&aPy2);
aParameters.push_back(&aPx3);
aParameters.push_back(&aPy3);
GCS::Point aP1(&aPx1, &aPy1);
GCS::Point aP2(&aPx2, &aPy2);
GCS::Point aP3(&aPx3, &aPy3);
GCS::Line aLine1;
GCS::Line aLine2;
aLine1.p1 = aP1;
aLine1.p2 = aP2;
aLine2.p1 = aP2;
aLine2.p2 = aP3;
std::ofstream aTclFile("d:/gcs.tcl");
aTclFile << "# 2 lines before PlaneGCS solve" << std::endl;
aTclFile << "vinit" << std::endl;
aTclFile << "vertex aP1 " << aPx1 << " " << aPy1 << " 0" << std::endl;
aTclFile << "vertex aP2 " << aPx2 << " " << aPy2 << " 0" << std::endl;
aTclFile << "vertex aP3 " << aPx3 << " " << aPy3 << " 0" << std::endl;
aTclFile << "polyvertex aPolyline1 aP1 aP2 aP3" << std::endl;
aTclFile << "vdisplay aPolyline1 " << std::endl;
aTclFile << "vsetcolor aPolyline1 RED" << std::endl;
GCS::System aSolver;
aSolver.addConstraintHorizontal(aLine1);
aSolver.addConstraintVertical(aLine2);
if (aSolver.solve(aParameters) == GCS::Success)
{
aSolver.applySolution();
aTclFile << "# 2 lines after PlaneGCS solve" << std::endl;
aTclFile << "vertex aV1 " << aPx1 << " " << aPy1 << " 0" << std::endl;
aTclFile << "vertex aV2 " << aPx2 << " " << aPy2 << " 0" << std::endl;
aTclFile << "vertex aV3 " << aPx3 << " " << aPy3 << " 0" << std::endl;
aTclFile << "polyvertex aPolyline2 aV1 aV2 aV3" << std::endl;
aTclFile << "vdisplay aPolyline2 " << std::endl;
aTclFile << "vsetcolor aPolyline2 GREEN" << std::endl;
}
aTclFile.close();
}
int main(int argc, char* argv[])
{
test();
return 0;
}
4 Conclusion
1. Introduction

2. Approximation Algorithm 鎷熷悎






3. Projection Algorithm 鎶曞獎


4. Classification Algorithm 瀹氫綅

5. Conclusion
]]>


]]>1 Introduction

2 紜歡淇℃伅

3 嫻嬭瘯緇撴灉




4 Conclusion
]]>