c - 直线与圆柱(环)相交的截距长度

标签 c loops intercept

我有一些源,其坐标(xn,yn,zn)相对于环的中心C和沿着我的视线的单位 vector (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]; 

vector 加法:沿着我的 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.;
     }

这个“径向”值给了我一个视线与环相交点的列表。但是,我只需要端点来计算环上截距的长度。 例如在下面列出的情况下,我的损失在 I 处穿过环,然后在 II 处离开。然后它继续前进,直到在 III 处再次撞击环,然后在 IV 处离开环。我只需要在我的文件中存储 I、II、III 和 IV 点。我怎样才能做到呢?

经度......u......z_comp......径向

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

最佳答案

找到了一种使用 bool 运算符仅存储最终值和初始值的方法,如下所示(继续问题中的代码):

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;
    }
}

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

关于c - 直线与圆柱(环)相交的截距长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29598193/

相关文章:

c - 我应该修改什么以仅预处理整个项目中的所有 C 文件?

c - 为操作系统开发自定义文件系统

c - 遍历字符串并在 C 中用空格分隔输入

gcc - 拦截 GNU tar 的 openat() 系统调用

c++ - 将三角形带转换为三角形?

c++ - 格式化 float

在循环 R 中迭代时从函数返回值

arrays - 循环遍历数组并一次显示单个项目,并具有动态持续时间,例如react js中的setTimeout或SetInterval

r - 在 geom_abline 中跨面使用不同的斜率

android - 如何创建 XWalk WebResourceResponse?