微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

行进立方体 - 获得倾斜的表面

如何解决行进立方体 - 获得倾斜的表面

我尝试绘制 Paul brouke (http://paulbourke.net/geometry/polygonise/) 的 marching 立方体 LUT 生成的所有等值面。我通过 triTable LUT 选择顶点作为边缘的中点。我得到了这些高度倾斜的表面,我想弄清楚我是否犯了任何错误。这是用于此的 matlab 代码

我得到的结果似乎不是 MC 应该提供的 14 种独特配置的对称性.. 我想知道我哪里出错了.. 我确定 LUT 是正确的,因为来源有被广泛使用..

function visualize
clear all
close all
clc
for id =1:256
    fig = figure('color',[1 1 1]);
    [vertices,faces] = mc(id);
    [rows,cols]=size(vertices);
    patch('vertices',vertices,'faces',faces,'edgecolor',[0 0 0],...
            'facecolor',[1 0 0],'facelighting','phong')
    Box on
    ax = gca;
    ax.BoxStyle = 'full';
    axis([0 1 0 1 0 1])
    set(gca,'linewidth',2)
    title(strcat(num2str(id),'(',num2str(round(rows/3)),' Triangles)'));
    xlabel('X')
    ylabel('Y')
    zlabel('Z')
    view(3)
    camup([0 0 1])
    fname = strcat('outputs/',num2str(id),'.png');
    saveas(gcf,fname)
    pause()
    close(fig)
end

end 

%id can be from 0-256 configuration
function [vertices,faces] = mc(id)
    triTable = [
        -1,-1,-1;
        0,8,3,1,9,-1;
        1,2,10,-1;
        9,-1;
        2,-1;
        3,11,-1;
        4,7,4,-1;
        8,-1;
        11,5,-1;
        5,-1;
        10,-1;
        7,6,-1;
        6,-1;
        -1,-1
    ]+1;
    edgeConnection = [
    0,1;
    1,3;
    2,3;
    0,2;
    4,5;
    5,7;
    6,7;
    4,6;
    0,4;
    1,5;
    3,7;
    2,6]+1;
vertexList = [
    0,0;
    1,0;
    0,1;
    0,1];
edgeDim = [
    0;
    1;
    0;
    1;
    0;
    1;
    0;
    1;
    2;
    2;
    2;
    2;
]+1;
    dummy = triTable(id,:);
    vertices = [];
    faces = [];
    for i=0:4
        if dummy(3*i+1)==0
            break;
        end
        for k=1:3 %3verticies for triangle
            vertex = [0,0];
            for j=1:3 %3 Dim
                if edgeDim(dummy(3*i+k))==j
                    vertex(j) = 0.5*(vertexList(edgeConnection(dummy(3*i+k),1),j)+vertexList(edgeConnection(dummy(3*i+k),2),j));
                else
                    vertex(j) = vertexList(edgeConnection(dummy(3*i+k),j);
                end
            end
            vertices = [vertices;vertex];
        end
        faces = [faces;[3*i+1,3*i+2,3*i+3]];
    end
end

enter image description here

解决方法

我犯了一个愚蠢的错误,用不同的编号符号定义了 EdgeConnection 和 vertexList...我现在已经编辑了现在可以工作的问题中的代码

非常感谢@Ander Biguri 在调试过程中为我指明了正确的方向

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。