AABB与空间分区的交叉点,示例代码性能和可靠性

时间:2017-03-26 20:27:48

标签: matlab performance computational-geometry aabb

我最初编写了以下Matlab代码,用于查找一组Axes Aligned Bounding Boxes(AABB)和空间分区(此处为8个分区)之间的交集。我相信它本身是可读的,而且,为了更加清晰,我添加了一些注释。

tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {

    @Override
    public void handle(ScrollEvent scrollEvent) {

    stock.setCellFactory(column -> {

    return new TableCell<VerreFX, Number>() {
        @Override
        protected void updateItem(Number item, boolean empty) {
        super.updateItem(item, empty);

            TableRow<VerreFX> currentRow = getTableRow();

            if (empty || item == null) {
                setText("");
                setGraphic(null);
               currentRow.setStyle(tableVerre.getStyle());
            } else {
                setText(getItem().toString());
            }

            if (!isEmpty()) {
                if ((int) item == 0 && st.getVerresBOX()) currentRow.setStyle("-fx-background-color:lightcoral");
            }
        }
    };
});

            }
     });

关注:

  • 在我的测试中,似乎很少有十字路口丢失,比如1000个或更多设置的10个左右。如果您能帮助找出代码中的任何有问题的部分,我将很高兴。

  • 我也关注使用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 。我宁愿摆脱它​​。

  • 在速度方面,任何其他更好的解决方案都会受到喜爱。

请注意代码已完成。您可以通过以下设置轻松尝试。

global F

0 个答案:

没有答案