估计眼睛可以看到的半球表面区域的数量?

时间:2016-06-21 11:18:48

标签: matlab simulation matlab-figure matlab-cvst geometry-surface

我们假设3D空间中有一个半球和三个三角形。半球底部的中心点用C表示。半球底部的半径用R表示。半球底部的法向量用n表示。

第一个三角形由三个点V1,V2和V3给出。第二个三角形由三个点V4,V5和V6给出。第三个三角形由三个点V7,V8和V9给出。点V1,V2,...,V9的位置是任意的。现在,我们进一步假设眼睛位于E点。注意三角形可能阻挡从眼睛到半球表面的视线;因此,眼睛可能看不到半球表面的某些区域。

请开发一种方法来估算眼球可以看到的半球表面积? 这是矩形而不是半球的代码:

function r = month_1()
P1 = [0.918559, 0.750000, -0.918559];
P2 = [0.653394, 0.649519, 1.183724];
P3 = [-0.918559, -0.750000, 0.918559];
P4 = [-0.653394, -0.649519, -1.183724];

V1 = [0.989609, -1.125000, 0.071051];
V2 = [1.377838, -0.808013, -0.317178];
V3 = [1.265766, -0.850481, 0.571351];

V4 = [0.989609, -1.125000, 0.071051];
V5 = [1.265766, -0.850481, 0.571351];
V6 = [0.601381, -1.441987, 0.459279];

V7 = [0.989609, -1.125000, 0.071051];
V8 = [1.377838, -0.808013, -0.317178];
V9 = [0.713453, -1.399519, -0.429250];

E = [1.714054, -1.948557, 0.123064];

C = [0,1,0];
Radius = 2;
n = [0,1,0]; 

%hold on
patches.vertices(1,:)= P1;
patches.vertices(2,:)= P2;
patches.vertices(3,:)= P3;
patches.vertices(4,:)= P4;

patches.vertices(5,:)= V1;
patches.vertices(6,:)= V2;
patches.vertices(7,:)= V3;
patches.vertices(8,:)= V4;
patches.vertices(9,:)= V5;
patches.vertices(10,:)= V6;
patches.vertices(11,:)= V7;
patches.vertices(12,:)= V8;
patches.vertices(13,:)= V9;

patches.faces(1,:)= [5,6,7];
patches.faces(2,:)= [8,9,10];
patches.faces(3,:)= [11,12,13];
patches.faces(4,:)= [1,2,3];
patches.faces(5,:)= [1,3,4];

patches.facevertexcdata = 1;
patch(patches);
shading faceted; view (3);
% dispatch([1,1,1])
hold on

Num = 20;
Sum = 0;
%Srec = norm(cross(P1 - P4, P3 - P4));
for i = 1:Num
    x1 = rand;
    x2 = rand;
    v1 = P1-P4;
    v2 = P3-P4;
    Samp = P4+v1*x1+v2*x2;
    ABC = fun_f(E, Samp, V1,V2,V3)*fun_f(E,Samp, V4, V5, V6)*fun_f(E,Samp, V7,V8,V9);
    Sum = Sum + ABC;
   % if ABC ==1
   %      plot3(Samp(1), Samp(2), Samp(3),'r +'), hold on
   % else
   %      plot3(Samp(1), Samp(2), Samp(3),'b +'), hold on
   % end
%............................
[x, y, z]= sphere;
patches = surf2patch(x,y,z,z);
patches.vertices(:,3) = abs(patches.vertices(:,3));
patches.facevertexcdata = 1;
patch(patches)
shading faceted; view(3)
daspect([1 1 1])
%............................
end

%r = Sum/Num;
%view(31, 15)
%end


r = Sum/Num*norm(cross (P1-P4,P3-P4));
disp(sprintf('the integration is: %.5f',r));
disp(sprintf('the accurate result is: %.5f',norm(cross(P1-P4,P3-P4)/4)));



function res = fun_f(LineB, LineE, V1, V2, V3)
O = LineB;
Len = norm(LineE-LineB);
v = (LineE-LineB)/Len;
N = cross(V2-V1, V3-V1)/norm(cross(V2-V1, V3-V1));
if dot(N,v)~=0
    tp = dot(N, V1-O)/ dot(N,v);
   % if tp >=0 && tp <= (1:3);
    P = LineB+tp*v(1:3);

    A = V1 - P;
    B = V2 - P;
    Stri1 = norm(cross(A,B))/2;

    A = V1 - P;
    B = V3 - P;
    Stri2 = norm(cross(A,B))/2;

    A = V3 - P;
    B = V2 - P;
    Stri3 = norm(cross(A,B))/2;

    A = V1 - V2;
    B = V3 - V2;
    Stotal = norm(cross(A,B))/2;

    if (Stri1 + Stri2 + Stri3)> (Stotal + 1e-8)
        res = 1;
    else
        res = 0;
    end
 else
    res =1;
end
end
end

This is the image showing the hemisphere and the triangles occluding the eye

2 个答案:

答案 0 :(得分:1)

enter image description here为中心的一小部分表面区域,尺寸为enter image description here。区域元素由

给出

enter image description here

想法是在球体上循环这些元素;计算enter image description here处元素的中心点,并确定此点与相机之间的线段是否与三角形相交。更多信息:https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm

现在我们需要找到要点;这意味着这意味着enter image description here在整个半球上增加enter image description here这会使采样分辨率不均匀 - enter image description here因子会使元素在半球顶点附近比在边缘处大得多。

相反:

  • 设置一个固定数量的N个环来循环,即enter image description here的迭代次数。

  • 设置最小迭代区域enter image description hereenter image description hereM的迭代次数为gven by

    enter image description here

    enter image description hereenter image description here处环的总面积:

    enter image description here

enter image description here

  • 当然,从上面来看,增量由

    给出

    enter image description here

  • 循环遍历所有戒指,注意enter image description here给出每个戒指的中间行(所以从![![enter image description here开始);由于对称性,同样的关注不一定适用于enter image description here。对于每个enter image description here上的每个环形循环,并进行如上所述的线交叉测试。

上述方法可以减小区域采样分辨率中的偏差量enter image description here

更好的方法是 Fibonacci晶格,但它们更复杂。请参阅此文:http://geonaut.eu/published/016_Fibonacci_Lattice.pdf

答案 1 :(得分:0)

{
  "from": 0,
  "size": 5,
  "query": {
    "bool": {
      "must": [
        { "match":  { "NIPNAS": "2000259"}},
        { "wildcard": {
        "SID.keyword": "300106840-00313750*"
        }}
      ]
    }
  }