【问题标题】:Length of the intercept from intersection of a line with a cylinder (ring)直线与圆柱(环)相交的截距长度
【发布时间】:2023-03-28 12:37:01
【问题描述】:

我有一些坐标 (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。

        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…………径向

121.890999 0.100000 0.016025 9.561846 我

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

【问题讨论】:

  • 这里是图片表示的链接:postimg.org/image/wu40cg5ur
  • 您显然已经努力尝试解释您的问题,我对此表示赞赏,但不幸的是,即使有图像,您所描述的内容也并不完全清楚。您描述了一个圆柱体,但是从您的图像中,很难判断 9.5 和 10.5 径向线的原点是否与环同心,以及环本身是否就是您描述的圆柱体。你的视线单位矢量是否相对于位置 1,2,3,4... 位于环平面的上方、下方等。这使得很难判断这是否是来自/在飞机问题等。再试一次?
  • 9.5 和 10.5 与圆环同心。这个环基本上是一个空心圆柱体,内半径和外半径分别为 9.5 和 10.5 以及给定的高度。视线单位向量本质上是 3 维的。这个想法是:首先,我只检查我的视线的径向分量,以在 9.5 和 10.5 之间的任何地方与环相交。然后,我正在计算该特定步骤的高度(z_comp)并检查它是否超过环的高度(z_c)。上面的示例(数据)显示了这种情况,它两次通过环。我希望这是有道理的?
  • 圆柱的轴向是否与笛卡尔轴之一共线,例如z?
  • 是的,它与 z 共线。

标签: c loops intercept


【解决方案1】:

想出一种方法来使用布尔运算符只存储最终值和初始值,如下所示(接问题中的代码):

define bool change = true;
...(rest of the program)...
if(radial >= r_min && radial <= r_max) {
    z_comp = zn[k] + u * ns_uz[k];

    if (z_comp >= -z_c && z_comp <= z_c)

        if (change) {
        printf("%f\t%f\t%f\t%f\t", l[k], b[k], ns[k], radial[i]);
        change = !change;
    }
} else { // if the condition of radial and z_comp is not met 
    if (!change) {
        fprintf(fp, "%f\n", radial[i - 1]);
        change = !change;
    }
}

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

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多