半圆柱线交点,matlab

半圆柱线交点,matlab,matlab,geometry,Matlab,Geometry,我有以下几点来描述半圆柱体 p1 = [7.9463,-1.0200,-9.7586]; % start points(boundary) pS = [9.1163,-1.0200,-9.5886]; % start points (middle) p2 = [10.2863,-1.0200,-9.7586]; % start points(boundary) p3 = [7.9463,-1.78,-9.7586]; % End points(boundary) pE = [9.1163

我有以下几点来描述半圆柱体

p1 = [7.9463,-1.0200,-9.7586];  % start points(boundary)
pS = [9.1163,-1.0200,-9.5886];  % start points (middle)
p2 = [10.2863,-1.0200,-9.7586]; % start points(boundary)


p3 = [7.9463,-1.78,-9.7586]; % End points(boundary)
pE = [9.1163,-1.78,-9.5886]; % End points (middle)
p4 = [10.2863,-1.78,-9.7586]; % End points (boundary)

r=1.17

and line 
line_=[8,-1,-8,9,-8,-10]; %[P0,P1];
%%%%%%%代码部分采用自

%气缸的起始位置

c0 = pS;
%圆柱的方向向量

c0 = pS;
dc=pE-PS

%圆柱半径

c0 = pS;
r=1.17

%计算判别式

δ=B^2-4*A*C

%检查解决方案的存在性


如果从matlab中抽象出delta,看起来很容易找到任意半圆柱与任意线段的交点

线段可以参数化为

x_L=x_L0+(x_L1-x_L0)*t,其中t在0和1之间变化,x_L0和x_L1-端点(与y,z相同)

半圆柱齿轮可通过以下两个参数进行参数化:

z=z0+(z1-z0)*u,u在0和1之间变化 (x-x0)^2+(y-y0)^2=r^2,y>0 (x0,y0-半圆的中心,z0,z1-范围,假设圆位于x,y平面)

将x和y代入半圆的方程式,得到t的平方方程式: (x_L0+(x_L1-x_L0)*t-x0)^2+(y_L0+(y_L1-y_L0)*t-y0)^2=r^2 因此:

    A = (x_L1-x_L0)^2+(y_L1-y_L0)^2;
    B = 2*(x_L0-x0)*(x_L1-x_L0)+2(y_L0-y0)*(y_L1-y_L0);
    C = (x_L0-x0)^2+(y_L1-y_L0)^2-r^2;
    D = B^2-4*A*C;
    if D <0
    %no solution
    else
    t(1) = (-B+sqrt(D))/2/A;
    t(2) = (-B-sqrt(D))/2/A;
    sol=nan(3,2);
    for i=1:2
    if t(i)>0 &&... 
t(i)<1 &&... 
y_L0+(y_L1-y_L0)*t(i)>0 &&... 
z_L0+(z_L1-z_L0)*t(i)>z0 &&... 
z_L0+(z_L1-z_L0)*t(i)<z1  
%solution is within interval of parametrization and y > 0, and z_intersectio nis between z0 and z1
    sol(1,i)=x_L0+(x_L1-x_L0)*t(i);
    sol(2,i)=y_L0+(y_L1-y_L0)*t(i);
    sol(3,i)=z_L0+(z_L1-z_L0)*t(i);
    end;
    end;
A=(x_L1-x_L0)^2+(y_L1-y_L0)^2;
B=2*(x_L0-x0)*(x_L1-x_L0)+2(y_L0-y0)*(y_L1-y_L0);
C=(x_L0-x0)^2+(y_L1-y_L0)^2-r^2;
D=B^2-4*A*C;
如果d0&。。。
t(i)0&&。。。
z_L0+(z_L1-z_L0)*t(i)>z0&&。。。
z_L0+(z_L1-z_L0)*t(i)0,z_相交于z0和z1之间
溶胶(1,i)=x_L0+(x_L1-x_L0)*t(i);
sol(2,i)=y_L0+(y_L1-y_L0)*t(i);
sol(3,i)=z_L0+(z_L1-z_L0)*t(i);
结束;
结束;

如果您能解释这些点是如何构成圆柱体和直线的,读者会更加友好。我只能假设构成这条线的点遵循以下逻辑:(x0,y0,z0,x1,y1,z1),但也许我错了?我认为你的问题表述错误或误解了什么,因为交点不取决于线的方向(线的哪一点是起点,哪一点是终点),此外,还不清楚“赛林德内部方向的交点”是什么意思…@Ilya Kobelevskiy,你能告诉我更多关于分析公式的信息吗。我想不出解决办法。如果你能写一些matlab代码就好了。查看我答案的编辑,我没有仔细检查数学,但如果实施得当,这种方法将得到正确的答案-参数化线段,用方程代替半圆,确定任意方向的交点,检查条件-该点在线段内且在z范围内