IDL編程實現擬合樹的圓心代碼

pro dianyunchuli
;-----1.芒果樹a的圓心擬合-----
;COMPILE_OPT idl2
;envi, /restore_base_save_files
;envi_batch_init, log_file=‘芒果樹a.txt’
;;開始設置路徑,讀取txt(n列,n行)
;txtname=‘E:\dianyunchuli\dianyunchuli\芒果樹a.txt’
;if file_test(txtname)then begin
; nLines=file_lines(txtname) ;獲取行
; tmp=’’
; ; 打開文件
; openr,lun,txtname,/get_lun
; while(~EOF(lun))do begin
; readf,lun,tmp ;獲取第一行
; print,tmp
; ;help,tmp
; var=strsplit(tmp,/extract) ;拆分第一行獲取列數
;
; rowNum=N_elements(var)
; vararr=fltarr(rowNum,nLines-1) ;定義數組(n,n-1)
; readf,lun,vararr
;
; vararr=[[var],[vararr]] ;重新組合數組(n,n-1)+第一行=(n,n)
; print,‘lon and lat =’,vararr
; help,var
; help,vararr
; endwhile
; ;平均值法
; X=mean(vararr[0,]) ;x平均值計算
; Y=mean(vararr[1,
]) ;y平均值計算
; print,‘平均值x,y’
; print,x,y
; ;最小二乘法
; X0=mean(vararr[0,]) ;x平均值計算
; Y0=mean(vararr[1,
]) ;y平均值計算
; Ui=vararr[0,]-X0 ;x與均值之差
; Vi=vararr[1,
]-Y0 ;y與均值之差
; Sumu2=total(Ui^2) ;平方總和
; Sumu3=total(Ui^3) ;立方總和
; Sumv2=total(Vi^2) ;平方總和
; Sumv3=total(Vi^3) ;立方總和
; Sumuv=total(Uivi) ;x差值乘y差值
; Sumu2v=total(Ui^2
Vi) ;x差值平方乘y差值
; Sumuv2=total(UiVi^2) ;x差值乘y差值平方
; ;帶入公式
; Uc=(Sumu2v
Sumuv-Sumu3Sumv2-Sumuv2Sumv2+SumuvSumv3)/((2.0(Sumuv^2-Sumu2Sumv2)))
; Vc=((-1)Sumu2Sumu2v+Sumu3
Sumuv+SumuvSumuv2-Sumu2Sumv3)/(2.0*(Sumuv^2-Sumu2*Sumv2))
; ;均值加上改正數
; X=Uc+X0
; Y=Vc+Y0
; print,‘最小二乘法:x,y’
; print,X,Y
;end

;-----2.柱體4的圓心擬合-----
;COMPILE_OPT idl2
;envi, /restore_base_save_files
;envi_batch_init, log_file=‘柱體4.txt’
;;開始設置路徑,讀取txt(n列,n行)
;txtname=‘E:\dianyunchuli\dianyunchuli\柱體4.txt’
;if file_test(txtname)then begin
; nLines=file_lines(txtname) ;獲取行
; tmp=’’
; ; 打開文件
; openr,lun,txtname,/get_lun
; while(~EOF(lun))do begin
; readf,lun,tmp ;獲取第一行
; print,tmp
; ;help,tmp
; var=strsplit(tmp,/extract) ;拆分第一行獲取列數
; rowNum=N_elements(var)
; vararr=fltarr(rowNum,nLines-1) ;定義數組(n,n-1)
; readf,lun,vararr
; vararr=[[var],[vararr]] ;重新組合數組(n,n-1)+第一行=(n,n)
; print,‘lon and lat =’,vararr
; help,var
; help,vararr
; endwhile
; void = reform(vararr[2,]) ;三維座標點按z座標的值從小到大排序
; sidx = sort(void)
; narr= vararr[
,[sidx]]
; print,narr
; Zmax=max(narr[2,]) ;z座標最大值
; Zmin=min(narr[2,
]) ;z座標最小值
; H=Zmax-Zmin ;計算圓柱的高度
; print,‘原圓柱Z座標最大值最小值和高差’
; print,Zmax,Zmin,H ;用來大致確定需要分成小圓柱的個數
; print,‘各個小圓柱圓心座標(最小二乘法):X,Y,Z’
; a=0
; while (a le 2220) do begin ;設置循環,行數有2253,循環到2250結束
; subnarr=narr[,0:a+30] ;每30個三維座標點提取出一個子數組
; ;help,subnarr
; ;最小二乘法 ;每個子數組在循環中依次計算圓心座標
; X0=mean(subnarr[0,
]) ;x平均值計算
; Y0=mean(subnarr[1,]) ;y平均值計算
; Ui=subnarr[0,
]-X0 ;x與均值之差
; Vi=subnarr[1,]-Y0 ;y與均值之差
; Sumu2=total(Ui^2) ;平方總和
; Sumu3=total(Ui^3) ;立方總和
; Sumv2=total(Vi^2) ;平方總和
; Sumv3=total(Vi^3) ;立方總和
; Sumuv=total(Ui
vi) ;x差值乘y差值
; Sumu2v=total(Ui^2Vi) ;x差值平方乘y差值
; Sumuv2=total(Ui
Vi^2) ;x差值乘y差值平方
; ;帶入公式
; Uc=(Sumu2vSumuv-Sumu3Sumv2-Sumuv2Sumv2+SumuvSumv3)/((2.0*(Sumuv^2-Sumu2Sumv2)))
; Vc=((-1)Sumu2Sumu2v+Sumu3
Sumuv+SumuvSumuv2-Sumu2Sumv3)/(2.0*(Sumuv^2-Sumu2Sumv2))
; ;均值加上改正數
; X=Uc+X0
; Y=Vc+Y0
; Z=narr[2,a+15] ;每個小圓柱Z值的中數作爲小圓柱的圓心Z值
; print,X,Y,Z
; a=a+30
; endwhile
;end
;
;-----3.l兩個相交面求交線方程-----
COMPILE_OPT idl2
envi, /restore_base_save_files
envi_batch_init, log_file=‘兩個面相交4.txt’
;開始設置路徑,讀取txt(n列,n行)
txtname=‘E:\dianyunchuli\dianyunchuli\兩個面相交4.txt’
if file_test(txtname)then begin
nLines=file_lines(txtname) ;獲取行
tmp=’’
; 打開文件
openr,lun,txtname,/get_lun
while(~EOF(lun))do begin
readf,lun,tmp ;獲取第一行
print,tmp
;help,tmp
var=strsplit(tmp,/extract) ;拆分第一行獲取列數
rowNum=N_elements(var)
vararr=fltarr(rowNum,nLines-1) ;定義數組(n,n-1)
readf,lun,vararr
vararr=[[var],[vararr]] ;重新組合數組(n,n-1)+第一行=(n,n)
print,‘lon and lat =’,vararr
help,var
help,vararr
endwhile
void = reform(vararr[2,
]) ;三維座標點按z座標的值從小到大排序
sidx = sort(void)
narr= vararr[,[sidx]]
print,narr
Ymin=min(narr[1,
]) ;Y座標最小值
print,Ymin
; narr[1,i]=Ymin
; a=narr[*,i]

end
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章