как да начертая неизпъкнала повърхност от набор от n x 3 данни

Има ли пряк начин за начертаване на неизпъкнала повърхност в R?

Използвал съм нещо като следното за изпъкнали повърхности и работи добре:

xyz <- cbind(y,x,z)
tbr <- t(surf.tri(xyz, delaunayn(xyz)))
rgl.triangles(xyz[tbr,1], xyz[tbr,2], xyz[tbr,3])

Въпреки това, за неизпъкнали повърхности, вдлъбнатите области се запълват. Мисля, че това е проблем с функцията delaunayn(), тъй като тя използва библиотеката Qhull, която не поддържа ограничени триангулации на Делоне или генериране на мрежа от неизпъкнали обекти.

Всички предложения се оценяват.

P.S.

Имам данни като ascii файл, но той има 3 колони и е дълъг 225 реда. Какъв е най-добрият начин за осигуряване на това?

Данните са налични на: http://pastebin.com/R2p4Cf7d

Горната част на парцела трябва да е вдлъбната! Това е изображение, създадено с помощта на persp3d() как трябва да изглежда повърхността. Тя е изчислена с помощта на повече точки от мрежата на правилна мрежа в полярни координати, вместо с помощта на неправилни точки на колокация.

Правилно изобразяване на повърхността, но с повече точки на мрежата.


person Graham G    schedule 07.07.2014    source източник
comment
Моля, добавете възпроизводим пример, нещо със симулирани данни.   -  person Remko Duursma    schedule 07.07.2014
comment
Триангулацията на Делоне винаги е изпъкнала. Може би трябва да промените цветовете на графиката за някои гранични триъгълници (т.е. тези с дълъг ръб)   -  person mdsumner    schedule 07.07.2014
comment
Вижте пакета alphahull.   -  person mdsumner    schedule 07.07.2014
comment
Какво ще се случи, ако просто промените малко вашите x,y,z данни и използвате lattice::wireframe със засенчване или драпиране?   -  person Carl Witthoft    schedule 07.07.2014
comment
Моля, вижте: stackoverflow .com/questions/5963269/   -  person nico    schedule 07.07.2014


Отговори (2)


Чувствам, че deldir::deldir() прави нещо по-добро от geometry::delaunayn() в този случай (като спомен за нова функция rgl::plot3d.deldir()). (Използвах данните на OP.)

library(rgl); library(deldir)

dxyz <- deldir(xyz[,1], xyz[,2], z=xyz[,3])

open3d()
plot3d(dxyz, col=cm.colors(256)[cut(xyz[,3], 256)], alpha=0.9)  # there isn't a bottom
wire3d(as.mesh3d(dxyz), col="black")

въведете описание на изображението тук

person cuttlefish44    schedule 29.08.2016
comment
Благодаря за този пример. Въпреки това, използването на същите данни (пропускане на заглавка) plot3d() хвърля грешка. Опитах различни формати на данни без резултат. Как прочетохте данните? - person Graham G; 30.08.2016
comment
Току-що актуализирани пакети deldir и rgl и кодът работи добре. Благодаря отново, страхотно е. - person Graham G; 30.08.2016

Следното решение не е перфектно, но работи, ако имате копие на Matlab.

library(rgl)
library(geometry)
# Read in data - also at: http://pastebin.com/R2p4Cf7d
simDat <- read.csv("testDat.csv")
#
x   <- simDat[,1];y<-simDat[,2];z<-simDat[,3]
xyz <- cbind(simDat[,1],simDat[,2],simDat[,3])
#
triNodes <- delaunayn(xyz)
tbr1     <- t(surf.tri(xyz, triNodes ))
# Plot data from R generated triangles
open3d()
rgl.triangles(xyz[tbr1,1], xyz[tbr1,2], xyz[tbr1,3])
#
# Import data generated by Matlab function delaunay()
#  - also at: http://pastebin.com/vQV2Zaii
nodeDat_ML <- read.csv("testDatNodes.csv")
triNodes2  <- cbind(nodeDat_ML[,1], nodeDat_ML[,2], nodeDat_ML[,3],1)
#
tbr2 <- t(surf.tri(xyz, triNodes2))
# Plot data from Matlab generated triangles
open3d()
rgl.triangles(xyz[tbr2,1], xyz[tbr2,2], xyz[tbr2,3])

Кодът създава следните две повърхности. Левият график се основава на триангулация, генерирана от R функцията delaunayn(), а десният график се основава на триангулация, генерирана от Matlab функцията delaunay().

Графики от триангулации, генерирани от R и Matlab

Генерираните от Matlab данни са достъпни на: http://pastebin.com/vQV2Zaii

а свързаният код на Matblab е:

fname = 'testDat.csv';
tt = table2array(readtable(fname)); % get data
x =  tt(:,1);y = tt(:,2);z = tt(:,3);
tri = delaunay(x,y); % the triangulation data
trisurf(tri,x(:,1),y(:,1),z(:,1)); % surface plot

Резултатът не е напълно перфектен, тъй като крайният график (вдясно) има фалшив триъгълник.

Надявам се, че горното ще бъде полезно за всеки с подобен проблем.

person Graham G    schedule 09.07.2014