2015-09-23 1 views
2

En Matlab, nous pouvons créer une surface de base avec la foudre face plane en utilisant les éléments suivants:Est-il possible d'obtenir des informations d'intensité lumineuse pour une surface en utilisant la fonction «lumière» de Matlab?

peaks(10) 
light 

Cela crée l'image suivante:

Peaks

Y at-il un moyen d'obtenir la matrice indiquant intensité lumineuse sur les taches de surface pour la vue actuelle? Alternativement est-il un moyen d'obtenir simplement l'attribut FaceColor qui est appliqué aux patches individuels sur la surface (je suppose qu'en soustrayant cette FaceColor de la FaceColor non éclairée, nous pouvons obtenir l'intensité)?

Répondre

1

Après avoir appelé les pics, un objet de surface est défini. Donc, après avoir exécuté

peaks(10) 
light 

vous pouvez trouver cet objet avec

s = findall(gcf,'Type','surface'); 
forme

ici, vous pouvez convertir la surface à un objet patch et d'obtenir les couleurs de sommet par

fv = surf2patch(s.XData,s.YData,s.ZData,s.CData); 
fvcdata = fv.facevertexcdata; 

dans le figure que vous avez créée matlab utilise un ombrage plat à partir des couleurs par vertex, ainsi les couleurs de la face sont calculées à partir des couleurs des sommets et des angles de la source lumineuse avec les normales de face, ce qui équivaut à

patch(fv,'FaceVertexCData',fvcdata,'FaceColor','flat'); light 

Mise à jour

Je regardais les matlab documentation de la propriété FaceColor. S'il est défini comme 'plat' et que le FaceVertexCData est défini par sommet alors matlab choisira pour chaque face la couleur du premier sommet du visage.

Ainsi, pour obtenir l'efficacité par la couleur du visage, vous pouvez le faire:

c = fvcdata(fv.faces(:,1)); % per face color 
[cmin,cmax] = caxis; 
cmap = colormap; 
m = length(cmap); 
index = fix((c-cmin)/(cmax-cmin)*m)+1; 
%Clamp values outside the range [1 m] 
index(index<1) = 1; 
index(index>m) = m; 
faceColors = cmap(index,:); 
+0

Merci pour votre commentaire. Malheureusement, ce sont les données lumineuses que je veux (ou bien la couleur de visage efficace (pas le CData de l'objet surfacique) Il existe un moyen de trouver l'algorithme de Matlab pour l'ombrage plat (ou tout autre ombrage) est-ce simplement une sorte d'échelle scalaire où si les vecteurs sont tangentiels, la valeur est 1 et si les vecteurs sont perpendiculaires, la valeur est 0? – TSGM

+0

J'ai regardé la documentation matlab de la propriété FaceColor. comme 'plat' et le FaceVertexCData est défini par sommet alors matlab choisira pour chaque face la couleur du premier sommet du visage.J'ai mis à jour ma réponse pour vous montrer comment obtenir la couleur du visage efficace – DontCareBear

+0

Désolé, mais nous pourrions être confus: quand la lumière frappe la surface, le facecolor précédent du patch (appelez-le FaceColor1) sera changé en une couleur différente (appelez-le FaceColor2) .Ceci est ce que je appelle le «colo efficace» r ". D'après ce que je comprends de votre mise à jour, vous expliquiez comment FaceColor1 a été trouvé en interpolant les valeurs de vertex. Dit autrement. Est-il possible d'appeler un objet patch avec exactement la même couleur qu'un patch * lit * mais sans appeler la commande light? – TSGM