Matlab AABB与空间分区相交,示例代码性能和可靠性

Matlab AABB与空间分区相交,示例代码性能和可靠性,matlab,performance,computational-geometry,aabb,Matlab,Performance,Computational Geometry,Aabb,我最初编写了以下Matlab代码来查找一组轴对齐边界框(AABB)和空间分区(这里是8个分区)之间的交点。我相信它本身是可读的,而且,为了更加清晰,我添加了一些评论 function [A,B] = AABBPart(bbx,it) % bbx: aabb, it: iteration global F IT = it+1; n = size(bbx,1); F = cell(n,it); A = Part([min(bbx

我最初编写了以下Matlab代码来查找一组轴对齐边界框(AABB)和空间分区(这里是8个分区)之间的交点。我相信它本身是可读的,而且,为了更加清晰,我添加了一些评论

function [A,B] = AABBPart(bbx,it)                                     % bbx: aabb, it: iteration
global F
IT = it+1;
n = size(bbx,1);
F = cell(n,it);
A = Part([min(bbx(:,1:3)),max(bbx(:,4:6))],it,0);                     % recursive partitioning
B = F;                                                                % matlab does not allow
    function s = Part(bx,it,J)                                        %   output to be global
        s = {};
        if it < 1; return; end
        s = cell(8,1);
        p = bx(1:3);
        q = bx(4:6);
        h = 0.5*(p+q);
        prt = [p,h;...                                                % 8 sub-parts (octa)
            h(1),p(2:3),q(1),h(2:3);...
            p(1),h(2),p(3),h(1),q(2),h(3);...
            h(1:2),p(3),q(1:2),h(3);...
            p(1:2),h(1),h(1:2),q(3);...
            h(1),p(2),h(3),q(1),h(2),q(3);...
            p(1),h(2:3),h(1),q(2:3);...
            h,q];
        for j=1:8                                                     % check for each sub-part
            k = 0;
            t = zeros(0,1);
            for i=1:n
                if all(bbx(i,1:3) <= prt(j,4:6)) && ...               % interscetion test for
                        all(prt(j,1:3) <= bbx(i,4:6))                 %   every aabb and sub-parts
                    k = k+1;
                    t(k) = i;
                end
            end
            if ~isempty(t)
                s{j,1} = [t; Part(prt(j,:),it-1,j)];                  % recursive call
                for i=1:numel(t)                                      % collecting the results
                    if isempty(F{t(i),IT-it})
                        F{t(i),IT-it} = [-J,j];
                    else
                        F{t(i),IT-it} = [F{t(i),IT-it}; [-J,j]];
                    end
                end
            end
        end
    end
end

这可能更适合@excaza如果作者怀疑代码给出了不正确的结果,那么这个问题就与代码审查无关了。代码不太可读,我们也没有责任对其进行反向工程,请解释该方法。@YvesDaoust虽然我被鼓励添加一些解释,我突然注意到4票接近。这足以让我感到沮丧,我没有在这篇文章上做任何进一步的努力。我将以任何其他方式找出解决办法。我只是热衷于分享我的代码和寻求建议,可能对未来的读者有用。无论如何,谢谢。代码阅读可能是一个困难的练习。通过帮助回答者理解你所做的事情,而不是抛开你的全部问题让他们去做,你将增加获得帮助的机会。
n = 10000;                        % in the original application, n would be millions
bbx = rand(n,6);
it = 3;
[A,B] = AABBPart(bbx,it);