{"id":674,"date":"2009-10-13T21:37:00","date_gmt":"2009-10-13T01:37:00","guid":{"rendered":""},"modified":"2013-11-17T17:00:41","modified_gmt":"2013-11-17T09:00:41","slug":"%e5%8d%95%e5%83%8f%e7%a9%ba%e9%97%b4%e5%90%8e%e6%96%b9%e4%ba%a4%e4%bc%9a%e7%ae%97%e6%b3%95%e5%8d%95%e5%85%83singlecross-pas","status":"publish","type":"post","link":"https:\/\/kyle.ai\/blog\/674.html","title":{"rendered":"\u5355\u50cf\u7a7a\u95f4\u540e\u65b9\u4ea4\u4f1a\u7b97\u6cd5\u5355\u5143(SingleCross.pas)"},"content":{"rendered":"<pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\r\nunit SingleCross;\r\n{-------------------------------------------------\r\n             \u6444\u5f71\u6d4b\u91cf\u5355\u50cf\u7a7a\u95f4\u4f1a\u65b9\u4ea4\u4f1a\u7b97\u6cd5\u5355\u5143\r\n          == \u25ce\u25ce\u25ce   \u4f5c\u8005\uff1a\u9648\u660e(\u9f99\u5728\u5929)  \u25ce\u25ce\u25ce ==\r\n          == \u25ce\u25ce\u25ce   \u4efb\u8bfe\u8001\u5e08\uff1a  \u9093  \u975e  \u25ce\u25ce\u25ce ==\r\n                  QQ:810492306\r\n--------------------------------------------------}\r\n\r\ninterface\r\nuses SysUtils,Matrice,PerlRegEx,Classes,Dialogs;\r\n\r\ntype KZPoint=record    \/\/\u5730\u9762\u63a7\u5236\u70b9\u5750\u6807\r\n  X:extended;\r\n  Y:extended;\r\n  Z:extended;\r\nend;\r\ntype YXPoint=record   \/\/\u5f71\u50cf\u70b9\u5750\u6807\r\n  X:extended;\r\n  Y:extended;\r\nend;\r\ntype IData=record     \/\/\u4e09\u4e2a\u8f93\u5165\u4e0d\u65b9\u4fbf\u7684\u89d2\u5ea6\r\n  \u03c8:extended;\r\n  \u03c9:extended;\r\n  \u03ba:extended;\r\nend;\r\n\r\nvar m, f, x0, y0, Xs, Ys, Zs:extended; \/\/m,f,x0,y0\u4e3a\u5185\u65b9\u4f4d\u5143\u7d20\r\n    PointNum:integer;                             \/\/\u63a7\u5236\u70b9\u7684\u4e2a\u6570\r\n    LowLimit:extended;                            \/\/\u7cbe\u5ea6\u63a7\u5236\r\n    a1, a2, a3, b1, b2, b3, c1, c2, c3:extended;  \/\/R\u77e9\u9635\u5404\u503c\r\n    KZPs:array of KZPoint;         \/\/\u7528\u6237\u8f93\u5165\u7684\u5df2\u77e5\u63a7\u5236\u70b9\r\n    YXPs:array of YXPoint;         \/\/\u7528\u6237\u8f93\u5165\u7684\u5df2\u77e5\u50cf\u70b9\r\n    F3:IData;                      \/\/\u4e09\u4e2a\u8f93\u5165\u4e0d\u65b9\u4fbf\u7684\u89d2\u5ea6\r\n    A,X,L:RCOMat;                  \/\/\u5e73\u5dee\u77e9\u9635, X=&#x5B;dXs,dYs,dZs,d\u03c8,d\u03c9,d\u03ba]T;  A&#x5B;2n,6], L&#x5B;2n,1]\r\n\r\nvar splitStr:string=' *';           \/\/\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u5206\u9694\u7b26\r\n\r\n\/\/===========================\u4ece\u6587\u672c\u6587\u4ef6\u4e2d\u8bfb\u53d6\u521d\u59cb\u6570\u636e===========================\r\nprocedure DataFromText(filename:string);\r\n\/\/===========================\u521d\u59cb\u5316\u6570\u636e=========================================\r\nprocedure InitData;\r\n\/\/===========================\u8ba1\u7b97R\u77e9\u9635==========================================\r\nprocedure CalcR;\r\n\/\/===========================\u8ba1\u7b97L\u77e9\u9635==========================================\r\nprocedure CalcL;\r\n\/\/===========================\u8ba1\u7b97A\u77e9\u9635==========================================\r\nprocedure CalcA;\r\n\/\/===========================\u8ba1\u7b97X\u77e9\u9635==========================================\r\nprocedure CalcX;\r\n\/\/===========================\u5faa\u73af\u8ba1\u7b97\u76f4\u5230\u8bef\u5dee\u591f\u5c0f===============================\r\nprocedure Calc;\r\n\r\nimplementation\r\n\r\nuses Unit1;\r\n\r\n\/\/===========================\u4ece\u6587\u672c\u6587\u4ef6\u4e2d\u8bfb\u53d6\u521d\u59cb\u6570\u636e===========================\r\nprocedure DataFromText(filename:string);\r\nvar f:TextFile;\r\n    Reg:TPerlRegEx;\r\n    s:string;\r\n    List:TStrings;\r\n    rows,i:integer;\r\nbegin\r\n  Reg:=TPerlRegEx.Create(nil);\r\n  List:=TStringList.Create;\r\n  assignfile(f,filename);\r\n  reset(f);\r\n  s:='';   rows:=0;\r\n  while not Eof(f) do\r\n  begin\r\n    Readln(f,s); s:=trim(s);                            \/\/\u7b2c\u4e00\u884c\r\n    while s='' do begin readln(f,s); s:=trim(s); end;  \/\/\u5904\u7406\u7a7a\u884c\r\n    rows:=rows+1;\r\n  end;\r\n  SetLength(KZPs,rows);\r\n  SetLength(YXPs,rows);\r\n  PointNum:=rows;\r\n  Reset(f);\r\n  for I := 0 to rows - 1 do\r\n    begin\r\n      Readln(f,s); s:=Trim(s);\r\n      while s='' do begin readln(f,s); s:=trim(s); end;\r\n      reg.Subject := UTF8string(s);\r\n      reg.RegEx :=UTF8string(splitStr);\r\n      reg.Split(list,MaxInt);\r\n      KZPs&#x5B;i].X:=StrToFloat(List&#x5B;1]);\r\n      \/\/Form1.Memo1.Lines.Add(FloatToStr(Kzps&#x5B;i].X));\r\n      KZPs&#x5B;i].Y:=StrToFloat(List&#x5B;2]);\r\n      \/\/Form1.Memo1.Lines.Add(FloatToStr(Kzps&#x5B;i].Y));\r\n      KZPs&#x5B;i].Z:=StrToFloat(List&#x5B;3]);\r\n      \/\/Form1.Memo1.Lines.Add(FloatToStr(Kzps&#x5B;i].Z));\r\n      YXPs&#x5B;i].X:=StrToFloat(List&#x5B;4]) \/ 1000;\r\n      \/\/Form1.Memo1.Lines.Add(FloatToStr(Yxps&#x5B;i].X));\r\n      YXPs&#x5B;i].Y:=StrToFloat(List&#x5B;5]) \/ 1000;\r\n      \/\/Form1.Memo1.Lines.Add(FloatToStr(yxps&#x5B;i].y));\r\n      List.Clear;\r\n    end;\r\n  Reg.Free;\r\n  List.Free;\r\n  CloseFile(f);\r\nend;\r\n\r\n\/\/===========================\u521d\u59cb\u5316\u6570\u636e=========================================\r\nprocedure InitData;\r\nvar tempX,tempY:extended;\r\n  I: Integer;\r\nbegin\r\n  tempX:=0; tempY:=0;\r\n  F3.\u03c8 :=0;\r\n  F3.\u03c9 :=0;\r\n  F3.\u03ba :=0;\r\n  for I := 0 to PointNum - 1 do\r\n    begin\r\n      tempX:=tempX+KZPs&#x5B;i].X;\r\n      tempY:=tempX+KZPs&#x5B;i].Y;\r\n    end;\r\n  Zs:=m*f;\r\n  Xs:=tempX \/ PointNum;\r\n  Ys:=tempY \/ PointNum;\r\nend;\r\n\r\n\/\/===========================\u8ba1\u7b97R\u77e9\u9635==========================================\r\nprocedure CalcR;\r\nbegin\r\n  a1:=Cos(F3.\u03c8)*Cos(F3.\u03ba)-Sin(F3.\u03c8)*Sin(F3.\u03c9)*Sin(F3.\u03ba);\r\n  a2:=-Cos(F3.\u03c8)*Sin(f3.\u03ba)-Sin(f3.\u03c8)*Sin(f3.\u03c9)*Cos(f3.\u03ba);\r\n  a3:=-Sin(f3.\u03c8)*Cos(f3.\u03c9);\r\n  b1:=Cos(f3.\u03c9)*Sin(f3.\u03ba);\r\n  b2:=Cos(f3.\u03c9)*Cos(f3.\u03ba);\r\n  b3:=-Sin(f3.\u03c9);\r\n  c1:=Sin(f3.\u03c8)*Cos(f3.\u03ba)+Cos(f3.\u03c8)*Sin(f3.\u03c9)*Sin(f3.\u03ba);\r\n  c2:=-Sin(f3.\u03c8)*Sin(f3.\u03ba)+Cos(f3.\u03c8)*Sin(f3.\u03c9)*Cos(f3.\u03ba);\r\n  c3:=Cos(f3.\u03c8)*Cos(f3.\u03c9);\r\nend;\r\n\r\n\/\/===========================\u8ba1\u7b97L\u77e9\u9635==========================================\r\nprocedure CalcL;\r\nvar JSx, JSy:extended;    \/\/\u8fd1\u4f3c\u503c\r\n    I: Integer;\r\nbegin\r\n  SetLength(L,2*PointNum,1);      \/\/L&#x5B;2n,1]\r\n  for I := 0 to PointNum - 1 do\r\n    begin\r\n      JSx:=x0\/1000-f*( (a1*(KZPs&#x5B;i].X-Xs) + b1*(KZPs&#x5B;i].Y-Ys) + c1*(KZPs&#x5B;i].Z-Zs) ) \/ ( a3*(KZPs&#x5B;i].X-Xs) + b3*(KZPs&#x5B;i].Y-Ys) + c3*(KZPs&#x5B;i].Z-Zs) ) );\r\n      JSy:=y0\/1000-f*( (a2*(KZPs&#x5B;i].X-Xs) + b2*(KZPs&#x5B;i].Y-Ys) + c2*(KZPs&#x5B;i].Z-Zs) ) \/ ( a3*(KZPs&#x5B;i].X-Xs) + b3*(KZPs&#x5B;i].Y-Ys) + c3*(KZPs&#x5B;i].Z-Zs) ) );\r\n      L&#x5B;2*i,0]:=YXPs&#x5B;i].X-JSx;\r\n      L&#x5B;2*i+1,0]:=YXPs&#x5B;i].Y-JSy;\r\n    end;\r\nend;\r\n\r\n\/\/===========================\u8ba1\u7b97A\u77e9\u9635==========================================\r\nprocedure CalcA;\r\nvar a11, a12, a13, a21, a22, a23, a14, a15, a16, a24, a25, a26,Z1:extended;\r\n    i:integer;\r\nbegin\r\n  SetLength(A,2*PointNum,6);      \/\/A&#x5B;2n,6]\r\n  for I := 0 to PointNum - 1 do\r\n    begin\r\n      Z1:=a3*(KZPs&#x5B;i].X-Xs) + b3*(KZPs&#x5B;i].Y-Ys) + c3*(KZPs&#x5B;i].Z-Zs);\r\n      a11:=(a1*f+a3*YXPs&#x5B;i].X) \/ Z1;\r\n      a12:=(b1*f+b3*YXPs&#x5B;i].X) \/ Z1;\r\n      a13:=(c1*f+c3*YXPs&#x5B;i].X) \/ Z1;\r\n      a21:=(a2*f+a3*YXPs&#x5B;i].Y) \/ Z1;\r\n      a22:=(b2*f+b3*YXPs&#x5B;i].Y) \/ Z1;\r\n      a23:=(c2*f+c3*YXPs&#x5B;i].Y) \/ Z1;\r\n      a14:=YXPs&#x5B;i].Y*Sin(f3.\u03c9)-( (YXPs&#x5B;i].X*(YXPs&#x5B;i].X*Cos(f3.\u03ba)-YXPs&#x5B;i].Y*Sin(f3.\u03ba)))\/f+f*Cos(f3.\u03ba) )*Cos(f3.\u03c9);\r\n      a15:=-f*Sin(f3.\u03ba)-YXPs&#x5B;i].X*(YXPs&#x5B;i].X*Sin(f3.\u03ba)+YXPs&#x5B;i].Y*Cos(f3.\u03ba)) \/ f;\r\n      a16:=YXPs&#x5B;i].Y;\r\n      a24:=-YXPs&#x5B;i].X*Sin(f3.\u03c9)-( (YXPs&#x5B;i].X*(YXPs&#x5B;i].X*Cos(f3.\u03ba)-YXPs&#x5B;i].Y*Sin(f3.\u03ba)))\/f-f*Sin(f3.\u03ba) )*Cos(f3.\u03c9);\r\n      a25:=-f*Cos(f3.\u03ba)-YXPs&#x5B;i].Y*(YXPs&#x5B;i].X*Sin(f3.\u03ba)+YXPs&#x5B;i].Y*Cos(f3.\u03ba)) \/ f;\r\n      a26:=-YXPs&#x5B;i].X;\r\n\r\n      A&#x5B;2*i,0]:=a11;\r\n      A&#x5B;2*i,1]:=a12;\r\n      A&#x5B;2*i,2]:=a13;\r\n      A&#x5B;2*i,3]:=a14;\r\n      A&#x5B;2*i,4]:=a15;\r\n      A&#x5B;2*i,5]:=a16;\r\n      A&#x5B;2*i+1,0]:=a21;\r\n      A&#x5B;2*i+1,1]:=a22;\r\n      A&#x5B;2*i+1,2]:=a23;\r\n      A&#x5B;2*i+1,3]:=a24;\r\n      A&#x5B;2*i+1,4]:=a25;\r\n      A&#x5B;2*i+1,5]:=a26;\r\n    end;\r\nend;\r\n\r\n\/\/===========================\u8ba1\u7b97X\u77e9\u9635==========================================\r\nprocedure CalcX;\r\nvar AT,ATA,ATA1,ATA1AT:RCOMat;\r\n    det:extended;\r\nbegin\r\n  InitMat(2*PointNum);\r\n  SetLength(AT,6,2*PointNum);\r\n  TransMat(A,AT,2*PointNum,6);        \/\/AT=A\u7684\u8f6c\u7f6e\r\n  SetLength(ATA,6,6);\r\n  InitMat(6);\r\n  MatMatR(AT,A,2*PointNum,6,ATA);     \/\/ATA&#x5B;6,6]=AT*A\r\n  SetLength(ATA1,6,6);\r\n  InitMat(6);\r\n  InvMat(ATA,ATA1,det);               \/\/ATA1=ATA\u7684\u9006\r\n  SetLength(ATA1AT,6,2*PointNum);\r\n  InitMat(6);\r\n  MatMatR(ATA1,AT,6,2*PointNum,ATA1AT);\/\/ATA1AT&#x5B;6,2*n]=ATA1*AT\r\n  SetLength(X,6,1);\r\n  InitMat(6);\r\n  MatMatR(ATA1AT,L,2*PointNum,1,X);    \/\/\u6700\u540e\u6c42\u5f97X\r\nend;\r\n\r\n\/\/===========================\u5faa\u73af\u8ba1\u7b97\u76f4\u5230\u8bef\u5dee\u591f\u5c0f===============================\r\nprocedure Calc;\r\nvar rs:string;\r\n    times:integer;\r\nbegin\r\n  times:=0;\r\n  repeat\r\n    CalcR;\r\n    CalcL;\r\n    CalcA;\r\n    CalcX;\r\n    Xs:=Xs+X&#x5B;0,0]; Ys:=Ys+X&#x5B;1,0]; Zs:=Zs+X&#x5B;2,0];\r\n    f3.\u03c8:=f3.\u03c8+X&#x5B;3,0]; f3.\u03c9:=f3.\u03c9+X&#x5B;4,0]; f3.\u03ba:=f3.\u03ba+X&#x5B;5,0];\r\n    times:=times+1;\r\n    Form1.Memo1.Lines.Add('\u7b2c'+IntToStr(times)+'\u6b21\u8fed\u4ee3============');\r\n    Form1.Memo1.Lines.Add('Xs='+FloatToStr(Xs)+';Ys='+FloatToStr(Ys)+';Zs='+FloatToStr(Zs)+';');\r\n    Form1.Memo1.Lines.Add('\u03c8='+FloatToStr(f3.\u03c8)+';\u03c9='+FloatToStr(f3.\u03c9)+';\u03ba='+FloatToStr(f3.\u03ba)+';');\r\n    Form1.Memo1.Lines.Add('dXs='+FloatToStr(X&#x5B;0,0])+';dYs='+FloatToStr(X&#x5B;1,0])+';dZs='+FloatToStr(X&#x5B;2,0])+';d\u03c8='+FloatToStr(X&#x5B;3,0])+';d\u03c9='+FloatToStr(X&#x5B;4,0])+';d\u03ba='+FloatToStr(X&#x5B;5,0]));\r\n    Form1.Memo1.Lines.Add('');\r\n  until (abs(X&#x5B;0,0])&lt;LowLimit) and (abs(X&#x5B;1,0])&lt;LowLimit) and (abs(X&#x5B;2,0])&lt;LowLimit) and (abs(X&#x5B;3,0])&lt;LowLimit) and (abs(X&#x5B;4,0])&lt;LowLimit) and (abs(X&#x5B;5,0])&lt;LowLimit);\r\n  rs:=rs+FloatToStr(Xs)+' '+FloatToStr(Ys)+' '+FloatToStr(Zs)+#13#10;\r\n  rs:=rs+FloatToStr(f3.\u03c8)+' '+FloatToStr(f3.\u03c9)+FloatToStr(f3.\u03ba)+#13#10;\r\n  rs:=rs+IntToStr(times);\r\n  ShowMessage(rs);\r\nend;\r\n\r\nend.\r\n<\/pre>\n<p>\u7528\u6cd5\u8bf4\u660e\uff1a<\/p>\n<pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\r\nprocedure TForm1.FormCreate(Sender: TObject);\r\nbegin\r\n  Form1.Position:=poScreenCenter;\r\n  DataFromText('data.txt');\r\n  m:=50000; f:=0.0281359; x0:=0; y0:=0; LowLimit:=0.000029;\r\n  InitData;\r\n  Calc;\r\nend;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>unit SingleCross; {&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-674","post","type-post","status-publish","format-standard","hentry","category-code_related"],"_links":{"self":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/comments?post=674"}],"version-history":[{"count":1,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/674\/revisions"}],"predecessor-version":[{"id":4716,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/674\/revisions\/4716"}],"wp:attachment":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/media?parent=674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/categories?post=674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/tags?post=674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}