我有一些坐标(xn,yn,zn)w.r.t的来源,一个环的中心C和单位矢量(ns_ux,ns_uy,ns_uz)沿着我的视线。我想计算这些源是否分别通过内外径为9.5和10.5的圆柱体。如果它们与这个圆柱相交(或者我称之为响铃),那么我想计算这个截距的长度。我的位置在这个环之外,并且有一些来源位于另一侧的中心C之外。因此,这些来源将通过这个环两次。这张图片应该有助于可视化这个问题。
#define PI 3.142
int main(){
int k,number=200;
float r_min=9.50000;
float r_max=10.500000;
float step=0.3;
float z_c = 3.0;
float ns_ux[number],ns_uy[number],ns_uz[number],xn[number], yn[number],zn[number],l[number],b[number],ns[number],x_comp,y_comp,z_comp,radial;
FILE* val= NULL;
val=fopen("novae_uniform_unitvectors.txt", "r");
for(k=0;k<=(number-1);k++){
fscanf(val,"%f %f %f %f %f %f %f %f %f", &xn[k], &yn[k], &zn[k], &ns_ux[k], &ns_uy[k], &ns_uz[k], &l[k], &b[k], &ns[k]);
float u=0.;
for (u=0.;u<=30.;u=u+step){
x_comp=xn[k]+u*ns_ux[k];
向量加法:当我的l.o.s中的'u'单位步进时,计算中心C的x_comp w.r.。
y_comp=yn[k]+u*ns_uy[k];
radial=pow((x_comp*x_comp+y_comp*y_comp),0.5);
if (radial >=r_min && radial <=r_max){
z_comp=zn[k]+u*ns_uz[k];
检查高度是否与戒指的高度一致
if(z_comp >=-z_c && z_comp <= z_c)
printf("%f\t%f\t%f\t%f\n",l[k],u, z_comp, radial);
}
}
}
return 0.;
}
这个“径向”值给出了我的视线与环相交的点列表。但是,我只需要端点来计算环上截距的长度。 例如在下面列出的情况下,我的l.o.s.在I处穿过戒指然后在II处离开。然后它继续前进,直到它在III处再次击中环,然后在IV处从它出来。我需要在我的文件中只存储I,II,III和IV点。我怎么能这样做?
经度.......... u ........ z_comp ........ radial
121.890999 0.100000 0.016025 9.561846 I
121.890999 0.200000 0.038453 9.538050
121.890999 0.300000 0.060881 9.515191 II
121.890999 4.799998 1.070159 9.518372 III
121.890999 4.899998 1.092587 9.541364
121.890999 4.999998 1.115016 9.565292
......跳过以节省空间........
121.890999 7.399995 1.653297 10.400277
121.890999 7.499995 1.675725 10.444989
121.890999 7.599995 1.698153 10.490416 IV
答案 0 :(得分:0)
通过使用布尔运算符计算出只存储最终值和初始值的方法,如下所示(从问题中的代码继续):
Private Sub SaveName_Click(sender As Object, e As EventArgs) Handles SaveName.Click
Username = NameInput.Text.Trim
If Username = "" Then
MsgBox("Enter a name please!")
Else
Try
File.WriteAllText(AppPath & "/highscore.txt", Username & " " & UScore)
UScore = vbNull
Me.Close()
MainMenu.Show()
Catch ex As Exception
MsgBox("Error Saving High Score File!" & vbCrLf & vbCrLf & ex.ToString(), MsgBoxStyle.Critical)
End Try
End If
End Sub
这将只存储径向分量的第一个和最后一个值(即环上视线矢量截距的终点)