(C程序)倾斜环的视线:计算环周围源沿我的视线的路径长度
我有一个均匀的环,沿着我的视线以一定角度倾斜。环的尺寸为:(C程序)倾斜环的视线:计算环周围源沿我的视线的路径长度,c,algorithm,3d,geometry,conditional-statements,C,Algorithm,3d,Geometry,Conditional Statements,我有一个均匀的环,沿着我的视线以一定角度倾斜。环的尺寸为: 9.5 : inner radius 10.5 : outer radius -3 to 3 : height of the ring 有许多源分布在环上,我试图计算从每个源绘制的线是否沿着我的方向穿过环。如果它通过环,它将显示多少路径长度通过该环(例如,通过两次环或一次或从未通过) 我有从每个源到我视线的方向向量,我用一个简单的向量加法沿着我的方向递增 我的程序的问题是: 它仅检查路径长度是否小于环的外半径。如何检查源是否通过两个
9.5 : inner radius
10.5 : outer radius
-3 to 3 : height of the ring
有许多源分布在环上,我试图计算从每个源绘制的线是否沿着我的方向穿过环。如果它通过环,它将显示多少路径长度通过该环(例如,通过两次环或一次或从未通过)
我有从每个源到我视线的方向向量,我用一个简单的向量加法沿着我的方向递增
我的程序的问题是:
它仅检查路径长度是否小于环的外半径。如何检查源是否通过两个环
任何帮助都将不胜感激
我的节目:
/********************************************************************
xn, yn, zn : coordinates of the sources
ns_ux, ns_uy, ns_uz : unit vectors for these sources
ns : distance of a source from the sun
int_val : path length
********************************************************************/
int main(){
FILE *fp=NULL;
fp=fopen("Av_path.txt","w");
int k,number=9;
float step=0.02;
float ns_ux[number],ns_uy[number],ns_uz[number],xn[number], yn[number],zn[number],l[number],b[number],ns[number],int_val,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.;
do {
u=u+step;
printf("%f\t%f\n" ,u,radial);
x_comp=xn[k]+u*ns_ux[k];
y_comp=yn[k]+u*ns_uy[k];
z_comp=zn[k]+u*ns_uz[k];
radial=pow((x_comp*x_comp+y_comp*y_comp+z_comp*z_comp),0.5);
}while (radial <10.5);
if(u >= 1.0 && z_comp >= -3.0 && z_comp <= 3.0){
int_val=1.0; // ring's width is only 1 unit
}
else if(u < 1.0 && z_comp >= -3.0 && z_comp <= 3.0) {
int_val=u-step;
}
else {
int_val=0.;
}
fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n",xn[k], yn[k], zn[k], ns[k], l[k], b[k], radial,z_comp,u,u/step, int_val);
}
return 0.;
}
/********************************************************************
xn,yn,zn:震源坐标
ns_ux,ns_uy,ns_uz:这些源的单位向量
ns:光源与太阳的距离
int_val:路径长度
********************************************************************/
int main(){
FILE*fp=NULL;
fp=fopen(“Av_path.txt”,“w”);
整数k,数字=9;
浮动步长=0.02;
浮点数ns_ux[数字]、ns_uy[数字]、ns_uz[数字]、xn[数字]、yn[数字]、zn[数字]、l[数字]、b[数字]、ns[数字]、int_val、x_comp、y_comp、z_comp、radial;
FILE*val=NULL;
val=fopen(“novae_uniform_unitvectors.txt”、“r”);
对于(k=0;k=-3.0&&z_comp我在将文本与代码结合起来时遇到一些问题。查看代码,我在(xn,yn,zn)
处看到一个点,以及从该点发出的方向(ns_ux,ns_uy,ns_uz)
。我认为您想知道光线何时何处与戒指相交
现在你做了一些非常糟糕的循环来找到一个交叉点。让我们把它变得更优雅。你正在寻找一些u
,比如sqrt(x_comp²+y_comp²+z_comp²)=10.5
。这是要求光线与球体相交的点,因此,如果您希望在此处使用圆柱体,您可能需要删除三个坐标中的一个。我现在将继续使用球体,但这很容易适应
用这个方程要做的第一件事是两边都平方:x_comp²+y_comp²+z_comp²=10.5²
。现在你可以把平方和解释为向量本身的点积:v∙v=10.5²
。但是向量v
实际上是位置n
加u
乘以一些向量ns\u?
,我称之为s
,所以你有(n+u*s)∙(n+u*s)=10.5²
。现在你可以利用分配定律可以应用于点积的事实,因为它是双线性的。所以你也可以这样写
(n∙n-10.5²)+(2n∙s) u+(s)∙s) u²=0
这是u
中的一个二次方程,可以使用二次公式求解
nn=xn*xn+yn*yn+zn*zn;
ns=xn*sn_ux+yn*sn_uy+zn*sn_uz;
ss=sn_ux*sn_ux+sn_uy*sn_uy+sn_uz*sn_uz;
r=10.5;
a=ss;
b=2*ns;
c=nn-r*r;
d=b*b-4*a*c;
if(d<0){
//完全不与半径为r的球体相交,但从外部通过。
}else如果(d==0){
//与球体相切,数值上极不可能
//所以您可能希望将此案例与下面的案例合并。
}否则{
//两个交点,由u1和u2参数化。
sqrtd=sqrt(d);
u1=(-b+sqrtd)/(2*a);
u2=(-b-sqrtd)/(2*a);
}
上面是一条线与一个球体相交。如果你想要一条光线,你可以将自己限制在解决方案u中≥0
。您可能希望对较小的半径执行相同的计算。在两个点上与较大球体相交但较小球体完全不相交的光线将只通过这两个球体之间的区域一次。所有这些都假定为完整球体;您仍然必须应用该厚度约束以查看光线从外侧穿过的位置e环的高度。我不能提供更多细节,因为我还没有完全理解你在这方面的问题,但我希望上面的内容能够帮助你自己解决这个问题。如果你想要一个圆柱体而不是球体,只需从上面的计算中删除所有的z
组件。一个简单的草图就可以帮助你解决这个问题o了解你想做什么这是我程序的图示。太阳和光环/光源不在同一平面上。[1]:为了弄清楚几何学:据我所知,你的环不是一个圆环,而是一个半径为10.5的圆柱体,从中切出一个半径为9.5的同心圆柱体,其中两个圆柱体的高度都是6。是吗?是的。这个环更像是一个内半径为9.5、外半径为10.5的空心圆柱体。他ight是6个单位。非常感谢你的帮助!我肯定把它弄得更复杂了。现在的问题是我无法理解“u”负值的意义。基本上,净路径长度应该是半径为10.5和9.5的两个圆柱体的“u”值的绝对差。因此,我的净u应该不超过这两个半径之间的差值,但不可行。uMy问题有一个倾斜环,具有一定的宽度(1个单位)和一定的高度(6个单位)在空间中。如果将一个源放置在环周围的随机位置,我想计算从该源向我的视线绘制的线的截距长度。我没有考虑切线场景,但当我绘制它时,它是有意义的。再次感谢您的帮助。如果我有任何这些源位于两者之间呢n 9.5和10.5单位?我似乎不明白逻辑,它是否会用var计算