2012-12-07 25 views
3

我具有以下數據:測量高度以[X Y]點

kx = 20; 
ky = 20; 
k = [kx ky]; 

PointsL = [ 
    [ 32 0 0] % P1 
    [387 0 0] 
    [475 0 0] 
    [475 30 0] 
    [602 30 0] % P5 
    [602 220 0] 
    [475 220 0] 
    [475 737 0] 
    [387 737 0] 
    [ 32 737 0] % P10 
    [ 32 555 0] 
    [ 0 555 0] 
    [ 0 277 0] 
    [ 27 277 0] 
    [ 27 250 0] % P15 
    [ 0 250 0] 
    [ 0 57 0] 
    [ 32 57 0] % P18 
]; 
PointsH = [ 
    [ 32 0 270] % P1 
    [387 0 270] 
    [475 0 183] 
    [475 30 183] 
    [602 30 183] % P5 
    [602 220 183] 
    [475 220 183] 
    [475 737 183] 
    [387 737 270] 
    [ 32 737 270] % P10 
    [ 32 555 270] 
    [ 0 555 270] 
    [ 0 277 270] 
    [ 27 277 270] 
    [ 27 250 270] % P15 
    [ 0 250 270] 
    [ 0 57 270] 
    [ 32 57 270] % P18 
]; 

PointsL是下表面的點 - 所有z=0

PointsH是更高表面的點 - 可在z軸上變化。

所有這些都代表房間的點。

下面的代碼繪製3D模型:

plength = size(PointsL,1); 
for i=1:plength 
    if i == 1 
     pl1 = PointsL(plength,:); 
     ph1 = PointsH(plength,:); 
    else 
     pl1 = PointsL(i-1,:); 
     ph1 = PointsH(i-1,:); 
    end 
    pl2 = PointsL(i,:); 
    ph2 = PointsH(i,:); 

    line([pl1(1) pl2(1)], [pl1(2) pl2(2)], [pl1(3) pl2(3)]); 
    line([ph1(1) ph2(1)], [ph1(2) ph2(2)], [ph1(3) ph2(3)]); 
    line([pl1(1) ph1(1)], [pl1(2) ph1(2)], [pl1(3) ph1(3)]); 
end 

p1 = PointsH(2,:); 
p2 = PointsH(9,:); 
line([p1(1) p2(1)], [p1(2) p2(2)], [p1(3) p2(3)]); 

p1 = PointsH(4,:); 
p2 = PointsH(7,:); 
line([p1(1) p2(1)], [p1(2) p2(2)], [p1(3) p2(3)]); 

3d model

是否有可能獲得高度(z值)給出x,y值?

回答

2

好吧,我想說,這可以很容易地使用TriScatteredInterp()PointsH。我意識到讓它產生我想要的並不是那麼簡單。我採取了增加額外的點,並移動它們來創建正確的插值三角形。

我終於得到了可以產生對應點(a,b)的z值的東西。

以下是我最後做...

epsilon = 1e-8; 

PointsL_diff = epsilon*[ 
    [ -1 0 0] % P1 
    [ 0 -1 0] 
    [ 0 -1 0] 
    [ 1 0 0] 
    [ 0 -1 0] % added 
    [ 1 -1 0] 
    [ 1 0 0] % P5 
    [ 0 -1 0] 
    [ 1 1 0] 
    [ 1 1 0] 
    [ 0 1 0] 
    [ 1 0 0] % added 
    [ 0 1 0] 
    [ -1 0 0] % P10 
    [ 0 1 0] % added 
    [ -1 1 0] 
    [ -1 1 0] 
    [ -1 0 0] 
    [ 0 -1 0] % added 
    [ -1 -1 0] 
    [ -1 1 0] % P15 
    [ -1 0 0] 
    [ 0 1 0] % added 
    [ -1 -1 0] 
    [ -1 -1 0] % P18 
]; 

PointsL = [ 
    [ 32 0 0] % P1 
    [ 32 0 0] % added 
    [387 0 0] 
    [475 0 0] 
    [475 0 0] % added 
    [475 30 0] 
    [602 30 0] % P5 
    [602 30 0] % added 
    [602 220 0] 
    [475 220 0] 
    [475 737 0] 
    [475 737 0] % added 
    [387 737 0] 
    [ 32 737 0] % P10 
    [ 32 737 0] % added 
    [ 32 555 0] 
    [ 0 555 0] 
    [ 0 277 0] 
    [ 0 277 0] % added 
    [ 27 277 0] 
    [ 27 250 0] % P15 
    [ 0 250 0] 
    [ 0 250 0] % added 
    [ 0 57 0] 
    [ 32 57 0] % P18 
]; 

PointsH = [ 
    [ 32 0 270] % P1 
    [387 0 270] 
    [475 0 183] 
    [475 30 183] 
    [602 30 183] % P5 
    [602 220 183] 
    [475 220 183] 
    [475+epsilon 220 183] % added 
    [475 220+epsilon 183] % added 
    [475 737 183] 
    [387 737 270] 
    [387 220 270] % added 
    [ 32 737 270] % P10 
    [ 32 555 270] 
    [ 0 555 270] 
    [ 0 277 270] 
    [ 27 277 270] 
    [ 27 250 270] % P15 
    [ 0 250 270] 
    [ 0 57 270] 
    [ 32 57 270] % P18 
]; 

% plot bounds 
x_min = -200; 
x_max = 800; 
y_min = -200; 
y_max = 800; 

newPointsL = PointsL + PointsL_diff; 

x = [PointsH(:,1); newPointsL(:,1); x_min; x_max; x_min; x_max]; 
y = [PointsH(:,2); newPointsL(:,2); y_min; y_min; y_max; y_max]; 
z = [PointsH(:,3); newPointsL(:,3);  0;  0;  0;  0]; 

F = TriScatteredInterp(x,y,z); % default is linear interpolation 

% find z-value for point (a,b) 
a = 100; 
b = 200; 
z_value = F(a,b) 

% generate mesh and plot surface 
ti_x = x_min:10:x_max; 
ti_y = y_min:10:y_max; 
[qx,qy] = meshgrid(ti_x,ti_y); 
qz = F(qx,qy); 
mesh(qx,qy,qz); 
hold on; 
plot3(x,y,z,'o'); 

...這裏是代碼生成數字:

Mesh of simple building.

+0

這就是我需要的。非常感謝你 ! – hsz

+0

@hsz很高興我能幫忙 - 即使它不是最美麗的解決方案... – user1884905

0

快速一般方式:

嘗試在數字窗口工具欄Data Cursor選項。

而且,如果您想以編程方式執行此操作,請按照此link

+0

我有數學做。 – hsz

+0

如果你必須用數學方法做,那麼你必須人爲地創建這個圖的'3×n Martix',並且對任何給定的'x,y'都很容易找到'z'。 –