gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:43:25 26 4
gpt4 key购买 nike

我有一些源,其坐标(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com