从线与圆柱(环)的交点截距的长度

时间:2015-04-13 05:07:08

标签: c loops intercept

我有一些坐标(xn,yn,zn)w.r.t的来源,一个环的中心C和单位矢量(ns_ux,ns_uy,ns_uz)沿着我的视线。我想计算这些源是否分别通过内外径为9.5和10.5的圆柱体。如果它们与这个圆柱相交(或者我称之为响铃),那么我想计算这个截距的长度。我的位置在这个环之外,并且有一些来源位于另一侧的中心C之外。因此,这些来源将通过这个环两次。这张图片应该有助于可视化这个问题。 enter image description here

#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

1 个答案:

答案 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

这将只存储径向分量的第一个和最后一个值(即环上视线矢量截距的终点)