指紋的特征提取和匹配研究- 附部分代碼


這是我在研二的模式識別課程中做的,2010年,當時覺得沒什么用,現在回頭看一下覺得還是有很多東西值得一看,整理一下。

摘要:指紋識別技術具有不會丟失、不會遺忘、唯一性、不變性、防偽性能好和使用方便等優點,已經逐步在門禁、考勤、金融、公共安全和電子商務等領域得到應用。指紋識別技術是利用人類指紋的唯一性.通過對指紋圖案的采樣、特征信息提取並與庫存樣本耗比較的過程來實現身份識另q的技術. 指紋是目前最為常見的生物特征,雖然研究者對此己持續關注多年,取得了許多研究成果,但隨着社會的迫切需要,以及現有技術在實際應用和測試中表現出的許多不足,近年來,對這種識別技術的研究仍然十分活躍。其中,特征提取和特征匹配作為尤為關鍵的研究內容,在很大程度上決定了系統的總體性能。

身份認證是人們在日常生活和工作中經常遇到的一個問題,,網絡與信息化技術正處於普及應用階段,隨之而來的是身份的數字化和隱性化,這給身份認證提出了更新、更高的要求。傳統的身份識別技術已經越來越不能適應社會發展的需求,人類亟需更加方便、可靠、安全的身份驗證技術。

關鍵詞:指紋,圖像處理,模式識別

 

指紋的細節特征可以有150種之多但這些特征出現的概率並不相等,很多特征是極其罕見的.一般在自動指紋識別技術中只使用兩種細節特征:紋線端點和分叉點的位置,而紋線分叉點則是紋線突然…分為二的位置大量統計結果和實際應用證明,這兩類特征點在指紋中出現的機會最多、最穩定,而且比較容易獲取.更重要的是,使用這兩類特征點足以描述指紋的唯一性通過算法檢測指紋中這兩類特征點的數量以及每個特征點的類型、位置和所在夏域的紋線方向是特征提取算法的任務.

指紋比對指紋比對指的是通過對兩枚指紋的比較來確定它們是否同源的過程,即兩枚指紋是否來源於同一個指頭.指紋比對主要是依靠比較兩枚指紋的局部紋線特征和相互關系來決定指紋的唯一性的指紋的局部紋線特征和相互關系通過細節特征點的數量、位置和所在區域的紋線方向等參數來度量,細節特征的集合形成一個拓卜結構指紋比對的過程實際就是兩個拓f、結構的匹配問題.由於采集過程中的變形、特征點定位的偏差、真正特征電的缺失和偽特征點的存在等問題,即使是兩枚同源的指紋,所獲得的特征信息也不可能完全一樣,指紋比對的過程必然是一個模糊匹配問題。

1特征提取方面

指紋識別技術主要由圖像采集、預處理、特征提取、匹配等幾部分構成。

指紋圖像是人體手指表面凸凹不平的紋線在二維平面的映像,它的感興趣區域(ROD由一系列濃淡相間的脊線和谷線緊密排列,形成了一種近乎平行的紋理結構。要在充分分析指紋紋理特點以及ROI和背景關系的基礎上,通過圖像分割、濾波處理等技術盡可能消除不利因素的影響,突出手指本身固有的結構及細節特點,便於提取指紋特征。

根據上面分析,可將整幅指紋圖像分為許多小塊,將每一分塊的紋線簡化為正弦波,然后設計濾波器來濾取正弦波的頻譜,就有可能得到近似於理想情況下的指紋紋線,從而達到增強目的。

當指紋圖像質量較差時,許多方法有效的前提條件不復存在,也自然難以具有較好的魯棒性。因此,進行劣質指紋增強時必須考慮兩個問題:

1)如何從指紋圖像中分割出無需增強和無法增強的區域?

2)如何自適應地增強指紋圖像中需要增強的區域?

其中第一個問題涉及到指紋圖像分割,即從整幅圖像中分割出含有指紋的ROI,以

及進一步分割出無法增強的紋線區域。第二個問題是在解決第一個問題基礎上,考慮如何提高增強效果。要解決這兩個問題,必須深入分析指紋圖像中的下列因素:紋線的方向,紋線的頻率,紋線區域分割及紋線質量狀況,紋線增強策略。

 

1.1指紋圖像的方向場

指紋方向圖抽象了指紋脊線與谷線交錯平行分布的特征,反映了指紋圖像紋理結構的本質,方向圖是原始指紋圖像的一種變換,即用紋線上某點的方向來表示該紋線的方向。一般有兩種方向圖,一種是點方向圖,表示原始指紋圖像中每一像素點紋線的方向;另一種是塊方向圖,表示原始指紋圖像中某點區域所有像素點的平均方向,即表示原始指紋圖像中每條紋線的大致走向。

方向場的計算方法大致可分為試探法、頻域估計法和時域擬合法三類。

試探法根據指紋紋線走向性的有界性和可量化性,假定在某一方向上,紋線的評價指標將出現極值.然后通過計算極值來反求方向。

頻域估計法的基本出發點是對指紋圖像進行變換域分析,這種方法同樣存在量化誤差的問題,另外由於頻域中點的方向與時域中的方向並不能嚴格地線性對應起來,所以該方法求取的方向仍然存在較大的量化誤差和較弱的抗干擾能力。

時域擬合法主要根據區域內各點本身的方向,通過對灰度梯度等信息進行統計擬合,然后利用最小二乘原理計算得到一個主導方向。

1.2 指紋頻率場

    指紋紋線在局部可視為平行條紋,其頻率為紋線之間平均距離的倒數。同指紋方向信息一樣,指紋紋線頻率也體現了指紋的基本特征。將所有局部區域的紋線頻率組合起來即構成了指紋的頻率場。

目前對紋線頻率的估計方法主要包括時域統計法和頻域分析法兩大類。時域統計法從紋線的空間位置關系出發,在已經獲取指紋方向的前提下,將指紋灰度值沿紋線方向投影到其垂直軸上,統計峰谷極值之間的距離來獲得紋線的平均寬度,從而確定區域的紋線頻率。

 頻域分析法利用了離散傅立葉變換的特點,即紋線之間的距離關系在傅立葉頻譜呈現對應分布,能量會集中在較小范圍內。通過時域規格化的方法,將灰度均值置零,就可以除掉頻譜中的直流分量,然后通過搜索頻譜中峰值來確定其頻率。

 

1.3指紋區域分割及紋線質量評價

指紋區域分割是指去掉指紋圖像的背景區域,以及紋線區域中非常模糊的部分。指紋分割不但可以提高特征提取的准確性,而且能夠加快特征提取的速度,其關鍵在於度量指紋圖像的區域特性,這種特性同時也表達了區域內的質量信息,是紋線質量評價的指標。

指紋圖像的分割方法大體可分為基於灰度特性和基於方向特性兩類。基於灰度特性方法的判別依據是指紋局部的灰度方差特性,該方法用每個像素點的灰度特征進行分割,速度較快,但分割邊界容易出現毛刺。灰度特性方法在背景簡單的情況下能夠將指紋紋線很好地分割開,但是這些單一的分割策略易受采集指紋時光照、反射等因素的影響,對於灰度差不大、噪聲較強的圖像效果並不理想。

基於方向特性方法的判別依據則是紋線和谷線方向的一致性。該方法的分割效果依賴於所求點方向及塊方向的可靠性。而對圖像對比度的高低並不敏感,不受光照、光源分布及反射等的影響,自適應性能較好,能夠較好地將指紋脊線和谷線分割開。但是對於模式區及紋線不連續、單一灰度等方向難以正確估計的區域,方向圖分割難以取得令人滿意的效果。

 

1.4指紋紋線增強

相對於自然界的許多紋理圖像,指紋圖像的紋理結構要相對單純,在方向性和頻率性方面呈規律分布。但是這種結構容易到采集噪聲和手指裂紋、干濕狀況等因素的影響,呈現出局部的不穩定性,表現為劣質指紋圖像。劣質指紋的增強一直是指紋識別系統的重點和難點。

這些算法主要可分為基於頻域、基於時域、基於尺度空間、基於知識、基於小波分析、基於神經網絡等幾大類。

基於頻域的方法主要是對圖像中每個局部分塊區域進行傅立葉變換,將圖像信息的空間位置表達轉變為頻域表達,然后選擇一定方向和頻率的濾波器在頻域濾波,然后反變換得到增強圖像。

基於時域的增強方法主要是設計一定特性的濾波器來與指紋圖像進行卷積。常用的濾波器包括方向濾波器,Gabor濾波器,非線性擴散濾波器,各向異性濾波器等。

基於尺度空間的方法實際上是采用不同尺度的濾波算子對圖像進行卷積,並考察由此得到的邊緣點隨尺度變化而具有的性質來決定邊緣點。常用的多尺度算子是高斯函數的二階導數(LOG算子)。

 基於知識的增強方法的核心思想是利用計算機來模擬人工思路進行圖像增強,把人對指紋結構的認識引入到指紋處理。這類方法首先將這種先驗認識以規則的形式表達,然后將指紋圖像在這種引導下進行二值化,細化,並再次增強獲得二值圖像,接着來檢測指紋特征。

  基於小波分析的方法主要是利用小波去噪的原理對指紋圖像進行增強,但除了Gabor小波、Morlet小波之外,其它小波基的方向性和頻率性並不顯著,因此在指紋中的運用並不多見。基於神經網絡的方法從原理來看,並沒有充分利用指紋的關鍵信息,增強的效果難以達到實際要求。

   紋線增強的核心在於濾波器設計。由於指紋圖象中不同區域的結構和質量差異很大,設計魯棒的增強濾波器必須需要考慮這些因素,具有較大的挑戰性。目前來看,時域濾波器和頻域濾波器最為有效。

 特征提取和特征匹配是指紋識別中聯系密切的兩個步驟。特征提取是指經過指紋圖像預處理之后,在純化的紋線上尋找代表指紋唯一性的指標的過程,特征匹配則是在已有特征的基礎上設計算法,度量來自兩個特征集合的相似程度。特征提取是特征匹配的先決條件,一種具有鑒別力、利於比較的特征無疑會降低匹配時的難度。同時,由於特征的不完整性和不穩定性,利用人工專家思路,設計對特征具有魯棒性的指紋匹配算法會使自動指紋識別具有更好的性能。此外,特征在不同情況下具有不同的鑒別能力,指紋匹配時不一定用到所有特征。

2指紋特征匹配方面   

指紋特征匹配除了與特征提取密切相關之外,一般要針對具體應用場合來設計算法。經過研究者多年的努力,指紋匹配已經取得了許多進展,目前主流的匹配方法主要分為模板匹配、圖像相關、細節匹配、紋線匹配等四類。

1)模板匹配:這類方法多利用指紋的紋理信息,如比較兩枚指紋的指紋及其插值改進模板等,通過計算模板之間的相似程度來得到兩枚指紋的匹配結果,從而達到鑒別個人身份的目的。模板匹配方法的匹配速度較快,但建立模板常需要進行多次濾波,濾波的耗時會極大地影響登錄的速度。對於許多類型相似的指紋,從宏觀角度描述的模板缺乏足夠的鑒別能力。

2)圖像匹配:這類方法借鑒一般圖像匹配的思路,找到指紋圖像的參考點之后,對整幅指紋圖像進行相關處理,計算其相似程度來鑒別身份。這種方法在上這種方法非常適合在線識別,但受指紋質量影響較大,需要采集者密切配合。這種方法對於形變和劣質指紋具有較明顯的優勢,但是匹配速度較慢。

3)紋線匹配:這類方法將紋線作為指紋匹配的直接對象,首先比較兩條紋線之間的相似程度,然后計算判斷其附近的紋線是否匹配,接着選取匹配程度最大的紋線對作為參考紋線,計算其它紋線的相似程度。相對於點模式匹配,這類方法判斷紋線是否匹配時有很多的判斷,速度較慢。在非線性形變的影響下,紋線的嚴格匹配關系難以准確建立。

4)細節匹配:這類方法主要利用了指紋細節點之間對應關系的不變性。點模式匹配是其中的典型代表,它首先提取指紋的細節點特征,形成特征點集,然后對輸入指紋和模板指紋的細節點集進行比對,對輸入指紋的細節點進行幾何變換之后,尋找模板指紋中對應的細節點,在重合面積內找到的細節點數目超過一定閾值,則兩者可視為來自同一手指。

 指紋的匹配過程本質上是建立輸入指紋特征和模板指紋特征之間對應關系的過程。它首先依賴於上文已經提取或建立的指紋結構或紋理特征,其次取決於如何度量這些確定特征的相似程度,此外還包括針對不同情況,從模板指紋和輸入指紋中建立這些特征之間的總體匹配分值。   

指紋的匹配策略可從全局和局部兩方面來考慮,全局方法尋找指紋整體上的相似度,但對於劣質指紋難以給出很准的匹配分值;局部方法從指紋的局部細節出發,通過構建兩幅指紋特征之間的局部相似量來判斷兩者的相似程度。由於非線性形變的連續性,局部結構的穩定性更高,但是對於對於不同的指紋可能存在相似的局部結構。另外,由於局部結構計算相似程度時,更易受無效區域的影響,難以給出准確的相似度分值,因此應該對這兩者取長補短,建立合理的匹配策略。這種策略應該在度量來自同一特征的相似程度的同時,突出不同特征的差異。

 在這種思想的指導下,本文提出了一種基於分層鑒別的指紋混合匹配方法。這種方法和人工專家的指紋匹配思路非常類似,就是首先借助顯著的全局信息來對齊兩枚指紋,然后在此基礎上尋找細節之間的相似性,若相似性達到一定程度,則可給出匹配結果;若全局信息缺失或可信度不高,無法對齊指紋,則改從局部結構着手,尋找局部結構的相似性,同時將這種局部結構進行蔓延,查看在已匹配的局部結構的前提下,是否有其它局部結構的支持。

2.1從全局搜索指紋的匹配特征

指紋的穩定點在很大程度上決定了指紋的拓撲結構和唯一性。因此本文以穩定點匹配來從全局搜索指紋的匹配特征。由於穩定點也是類似於細節點的點模式特征,據此,我們首先可以采用和點模式匹配類似的方法來匹配模板特征中和輸入特征中的穩定點集。除了一般的處理之外,還有兩點值得注意:閾值設置和匹配策略。

例如,一幅指紋圖像采集到了兩個吸引點,兩個排斥點;另一幅指紋圖像采集到一個排斥點:第三幅指紋圖像采集到一個吸引點;當對前兩幅指紋進行匹配時,就要記錄兩對可能匹配的穩定點對。對第一枚指紋和第三枚指紋進行匹配時,也要記錄兩對可能匹配的穩定點對。然后我們計算每一匹配的穩定點對的OrientationCodes特征的相似分值,來明確穩定點對的匹配情況。若相似分值小於一個較小閾值,則認為這一穩定點對不匹配。這一閾值可在0.25—0.65之間變化,為了減少拒識現象,本文實驗中,這一閾值設為0.3。這一步的判斷可剔除掉那些類型相同(比如同是左旋),穩定點之間距離接近相同,但方向模式顯著不同的兩幅指紋。

   接着我們着眼於模板特征和輸入特征中每一匹配的穩定點,分別構建對應的星形結構.並計算星形結構的相似度分值。

最后,我們利用曲率場來作最終確認,若兩枚指紋的穩定點對被准確找到,並且局部的方向模式和細節模式均己匹配,那我們要查看是否存在這種情形,即非線性形變引起了上述特征的偏移,從而導致上述的誤匹配。如果曲率場的分值很低,則這是屬於誤匹配,否則,這種准確匹配得到進一步確認。前面各級得到的匹配分值都是兩枚指紋匹配與否的證據。

 從上述過程來看,經過逐級確認,兩枚指紋在全局拓撲結構和穩定點分布上的相似性在逐步明確,並且其周圍方向分布模式和周圍細節點分布模式的相似性也在逐步明確,那么最終的匹配分值可以由前面各階段的匹配分值加權組合而成。

  上述全局匹配策略的優點在於:1)較好地模擬了人工專家作指紋匹配時先全局后局部的工作思路,能夠統一指紋全局特征和局部特征。2)計算速度很快,這種方法在進行大規模指紋檢索時優勢非常突出。3)對於明顯匹配和明顯不匹配的指紋,給出的結果非常准確。比如兩枚指紋同為環型,均有兩個吸引點和兩個排斥點,但兩個吸引點對之間的OrientafionCodes值非常小,那么無需構建星形結構就能夠判斷兩者的差異所在。事實上在實際系統中,對於反復使用的用戶,采集的圖像其實是非常相似的,這種方法具有較好的適應性。

2.2從局部搜索指紋的匹配特征

當全局方面不足以給出指紋是否匹配的明確判斷時,需要從局部方面尋找指紋的相似度。這時的匹配特征主要從細節點特征展開搜索。其主要思路仍然是首先考慮全部的細節點,然后考慮到局部的細節點。

我們首先用Dalaunay三角剖分分別建立模板指紋和輸入指紋的全部細節點之間的關系,然后比較對應的特征向量,計算三角剖分的相似度分值,若匹配的細節點數目很多,且匹配分值明顯大於較大閾值,這時可判斷兩枚指紋成功匹配。或者,匹配的細節點數目不是非常之多,但在前面全局匹配中得到的匹配分值並不很小,同時Dalaunay三角剖分的相似度分值也較大(本文設為0.55),這時也可判斷兩枚指紋成功匹配。

然后,考慮那些Dalaunay三角剖分獲得的匹配數目不多的情況,采取點模式匹配方法來獲得匹配的細節點數目。為避免算法復雜度,減少誤匹配現象發生,這里要估計點模式匹配的核心參數。經過對Dalaunay三角剖分建立的模板特征矢量和輸入特征矢量進行比對,我們假定獲得了r對成功匹配的矢量。相應地,我們能夠建立模板細節點集與輸入細節點集的對應關系。

 接着,我們通過分別計算每一點對的OrientationCodes特征之間和PolyLines特征之間的相似度分值,來判斷這些點對是否真正匹配。然后將兩者以權重組成得到匹配分值,若這個分值很小,則認為兩枚指紋不匹配。若這個分值很大且得到的細節點對數目c大於一定閾值,則認為兩枚指紋匹配。若C=0,則認為兩枚指紋不匹配。對於其它情況,則進一步估計幾何變換參數。

最后,我們估計重新組織的點對集之間的幾何變換參數來得到最終的匹配結果。盡管在實際匹配過程中,模板圖像和輸入圖像的采集傳感器的分辨率大多相同。使用最小二乘法(LMS)來估計誤差的極小值。這樣,我們可以通過上述的估計參數來獲得模板指紋和輸入指紋的細節點集之間的匹配分值和匹配數目,進而做出明確判斷。這樣將最難確定的部分留在最后,即使發生錯誤也是一小部分劣質和嚴重形變的指紋。這樣不僅可提高匹配效率,而且可提高匹配的准確程度。

 

3.自動指紋識別技術的發展方向

    非接觸式真皮層指紋采集生理學的研究結果表明,指紋的結構在真皮層有着完整和穩定的表現.如果能實現在真皮層采集指紋結構,就可以在指紋采集技術方面實現突破,在指頭干、濕、臟和指紋磨損嚴重的情況下都能准確、清晰、完整地進行指紋采集.通過非接觸方式采集指紋,則可以有效解決指紋錄入時的變形問題.

兼容主流采集設備的識別芯片的開發現在已有一些企業將自動指紋識別的核心算法進行了封裝,以芯片的形式出售,這可以利用硬件提高程序的執行速度,提高系統穩定性.是值得肯定的.但幾乎所有的識別芯片都存在同樣一個問題:識別性能嚴重依賴采集設備,即一種芯片只能支持一種特定類別和型號的指紋采集設備這是非常嚴重的問題因為從本質上講,指紋采集和識別技術的研究是相互獨立的今天最好的采集技術未必能在明天繼續領先,將現在性能攝好的指紋采集設備和水平最高的識別芯片結合起來的系統,在今天應該是最先進的系統但當更先進的指紋采集技術和設備出現時,鑒於現有芯片對采集設備的依賴性,系統很難迅速將其利用起來.所以,自動指紋識別芯片的開發應該向獨立化、通用化的方向發展,具備良好的采集設備兼容性、支持主流的采集設備.這樣,識別算法的芯片化才具有更大的意義,系統才具有強大的生命力.

多種生物識別技術的融合生物識別技術是一個綜合的體系,指紋識別僅僅是其中的一種各種生物識別技術都具有自身的特點和優勢充分利用其他生物識別技術的優勢,將其他生物識別技術與指紋結合使用,實現優勢互補,是自動指紋識別技術的發展方向之一比如,可以將臉形和指紋識別技術相結合,使用臉形識別結果作為一種索引,實現辨識模式下的指紋識別,識別的速度可得到明顯的提高。

指紋識別技術是一項綜合性的高新技術,它涉及圖像處理、模式識別、計算機、光學、電子和生理等領域,是一個學科交叉性很強的研究領域.迄今為止,該技術的研究已經取得了巨大的成就,也面臨着一些困難,需要光學、電子、計算機、數學乃至生理等學科的共同參與和努力,才有可能盡快將這一技術完善並實現產業化.

 

 

 

#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "time.h"

#define X_h 50 
#define X_l -50 
#define Y_h 50 
#define Y_l -50 
#define NUM 100 

class Point
{
public:Point();
void Show();
double X; 
double Y; 
int Part; 

};

Point::Point()
{
X=((double)(rand()%1000)/1000.0)*(X_h-X_l)+X_l;
Y=((double)(rand()%1000)/1000.0)*(Y_h-Y_l)+Y_l;
Part=0;
if((X>=0)&&(X<X_h)&&(Y>0)&&(Y<Y_h))
Part=1;
if((X>X_l)&&(X<0)&&(Y>0)&&(Y<Y_h))
Part=2;
if((X>X_l)&&(X<X_h)&&(Y<=0)&&(Y>Y_l))
Part=3;

void Point::Show()
{ cout<<"("<<X<<","<<Y<<")"<<endl;
cout<<" Àà±ðΪ£º"<<Part<<"Àà"<<endl;
}


void Real(Point p[],Point rand_point)
{ int i;
rand_point.X=((double)(rand()%1000)/1000.0)*(X_h-X_l)+X_l;
rand_point.Y=((double)(rand()%1000)/1000.0)*(Y_h-Y_l)+Y_l;

double d1,temp_xl1,temp_xh1,temp_yl1,temp_yh1;
double d2,temp_xl2,temp_xh2,temp_yl2,temp_yh2;
double temp_x[NUM],temp_y[NUM],temp,dis[NUM] ; 


cin>>d1;

temp_xl1=rand_point.X-d1;
temp_xh1=rand_point.X+d1;
temp_yl1=rand_point.Y-d1;
temp_yh1=rand_point.Y+d1;

int k;
for(i=0;i<NUM;i++)
if((p[i].X>=temp_xl1)&&(p[i].X<=temp_xh1)&&(p[i].Y>=temp_yl1)&&(p[i].Y<=temp_yh1))
{
temp_x[i]=p[i].X-rand_point.X;
temp_y[i]=p[i].Y-rand_point.Y;
dis[i]=sqrt((pow(temp_x[i],2))+(pow(temp_y[i],2)));
k=i;
}
temp=dis[k];

for(i=0;i<NUM;i++)
{
if((p[i].X>=temp_xl1)&&(p[i].X<=temp_xh1)&&(p[i].Y>=temp_yl1)&&(p[i].Y<=temp_yh1))
{
temp_x[i]=p[i].X-rand_point.X;
temp_y[i]=p[i].Y-rand_point.Y;
dis[i]=sqrt((pow(temp_x[i],2))+(pow(temp_y[i],2)));
if(dis[i]<temp)
{
dis[i]=dis[i]+temp;
temp=dis[i]-temp;
dis[i]=dis[i]-temp;
k=i;
}

}
}

p[k].Show();


d2=(sqrt(2))*d1;
temp_xl2=rand_point.X-d2;
temp_xh2=rand_point.X+d2;
temp_yl2=rand_point.Y-d2;
temp_yh2=rand_point.Y+d2;

int m;
for(i=0;i<NUM;i++)
if((p[i].X>=temp_xl2)&&(p[i].X<=temp_xh2)&&(p[i].Y>=temp_yl2)&&(p[i].Y<=temp_yh2))
{
temp_x[i]=p[i].X-rand_point.X;
temp_y[i]=p[i].Y-rand_point.Y;
dis[i]=sqrt((pow(temp_x[i],2))+(pow(temp_y[i],2)));
m=i;
}
temp=dis[m];

for(i=0;i<NUM;i++)
{
if((p[i].X>=temp_xl2)&&(p[i].X<=temp_xh2)&&(p[i].Y>=temp_yl2)&&(p[i].Y<=temp_yh2))
{
temp_x[i]=p[i].X-rand_point.X;
temp_y[i]=p[i].Y-rand_point.Y;
dis[i]=sqrt((pow(temp_x[i],2))+(pow(temp_y[i],2)));
if(dis[i]<temp)
{
dis[i]=dis[i]+temp;
temp=dis[i]-temp;
dis[i]=dis[i]-temp;
m=i;
}
}
}

p[m].Show();

double X1,X2,Y1,Y2,L1,L2;
X1=p[k].X-rand_point.X;
Y1=p[k].Y-rand_point.Y;
L1=sqrt((pow(X1,2))+(pow(Y1,2)));

X2=p[m].X-rand_point.X;
Y2=p[m].Y-rand_point.Y;
L2=sqrt((pow(X2,2))+(pow(Y2,2)));

if(L1<L2)
rand_point.Part=p[k].Part;
else
rand_point.Part=p[m].Part;


rand_point.Show();


}
void main()
{
srand(time(0));
Point Point[NUM], rand_point;
Real(Point,rand_point);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM