zolraa 2021-09-11 17:17 采纳率: 100%
浏览 62
已结题

MATLAB求解抛物面和抛物线内部某条射线的交点

具体问题是这样的

抛物面内侧有两个已知点,求它与抛物面交点中靠近靠近抛物面顶点的那个点

  • 写回答

1条回答 默认 最新

  • joel_1993 2021-09-11 19:21
    关注

    同学你好,求交点原理都差不多,下面给出我的老办法

    function [x0,y0,z0] = crossPt(a,b,c,x1,y1,z1,x2,y2,z2)
    % 输入参数abc为抛物面的三个参数
    % x1,y1,z1和x2,y2,z2分别是点P1和点P2的坐标【P1和P2构成线段】
    % 输出参数x0,y0,z0分别是求得的抛物面和线段的交点坐标
    % 若无交点:输出x0,y0,z0为空
    % 有一个交点则输出x0,y0,z0各有一个值
    % 若两个交点,那么x0,y0,z0各有两个值
    alpha =  x2 - x1;%计算alpha、beta、gamma
    beta  =  y2 - y1;
    gamma =  z2 - z1;
    p = gamma^2-4*a*alpha^2*c-4*b*beta^2*c...
        +4*a*alpha^2*z1 + 4*b*beta^2*z1...
        -4*a*alpha*gamma*x1 - 4*b*beta*gamma*y1...
        -4*a*b*beta^2*x1^2 - 4*a*alpha^2*b*y1^2+8*a*b*alpha*beta*x1*y1;% 计算sigma1右边根号里的内容
    x0 = []; y0=[]; z0 = []; % 首先取空值
    t1 = []; t2=[]; % 这里随便给了t的初始值
    if(p==0) % 根号里的内容为0,说明t有一个解,一个交点
        sig = sqrt(p);
        t1 =  -(sig-gamma+2*a*alpha*x1+2*b*beta*y1)/(2*(a*alpha^2+b*beta^2));
    elseif(p>0) %根号里的内容大于0,说明t有两个解,两个交点
        sig = sqrt(p);
        t1 =   -(sig-gamma+2*a*alpha*x1+2*b*beta*y1)/(2*(a*alpha^2+b*beta^2));
        t2 =  -(-sig-gamma+2*a*alpha*x1+2*b*beta*y1)/(2*(a*alpha^2+b*beta^2));
    end
    if(~isempty(t1))
        x0 = [x0; x1 + t1*alpha];
        y0 = [y0; y1 + t1*beta];
        z0 = [z0; z1 + t1*gamma];
    end
    if(~isempty(t2))
        x0 = [x0; x1 + t2*alpha];
        y0 = [y0; y1 + t2*beta];
        z0 = [z0; z1 + t2*gamma];
    end
    end
    

    主程序:

    % 首先要给出 a b c 和多条线段的 x1,y1,z1 以及 x2,y2,z2
    x1 = 1;
    y1 = 1;
    z1 = 2.3;
    x2 = 2.3;
    y2 = 2;
    z2 = 2.5;
    a = 1/8; b = 1/8; c=1; % 给出抛物面参数
    f = @(x,y) a*x.^2+b*y.^2+c; % 这个是抛物面的方程
    [X, Y] = meshgrid(linspace(-4,4,101));%准备画抛物面的数据
    Z = f(X,Y); %准备画抛物面的数据
    xb = 0; % 底部点x坐标
    yb = 0; % 底部点y坐标
    zb = c; % 底部点z坐标
    figure(1);clf
    mesh(X,Y,Z); % 画抛物面
    
    hold on
    plot3([x1,x2],[y1,y2],[z1,z2],'r-o','markerfacecolor','r','markersize',5); %画线段 红色
    [x0,y0,z0] = crossPt(a,b,c,x1,y1,z1,x2,y2,z2);% 调用函数求交点
    axis equal
    if(~isempty(x0))
    dis = (x0-xb).^2+(y0-yb).^2+(z0-zb).^2;
    q = dis==min(dis);
    for i = 1:numel(q)
        if(q(i))
            plot3(x0(i),y0(i),z0(i),'bd','markerfacecolor','b','markersize',5)% 画交点 蓝色
            text(x0(i),y0(i),z0(i),'最近交点','color','r','fontsize',12)% 蓝色
        end    
    end
    else
        fprintf('没有交点!')
    end
    
    

    效果如下

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月19日
  • 已采纳回答 9月11日
  • 创建了问题 9月11日

悬赏问题

  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题