Beschattung funktioniert nicht mit patches die Angabe von Gesicht Farben?

Ich verstehe nicht, warum der folgende code löst eine Warnung:

% mesh of a plane at z=0 for x,y in [0,5] with 20 vertices per side
n = 20;
[x,y] = ndgrid( linspace(0,5,n) );
x = x(:); y = y(:); z = zeros(n^2,1);

% triangulation to obtain faces, and draw a patch with random color for each face
F = delaunay(x,y);
V = [x,y,z];
patch( 'Vertices', V, 'Faces', F, 'FaceVertexCData', rand( size(F,1), 1 ) );
axis tight; grid on; box off;

% faceted shading works fine, but interp doesn't seem to work
shading('faceted'); % works fine
shading('interp'); % throws a warning

   Warning: Error creating or updating Patch
    Error in value of property  FaceVertexCData
    Number of colors must equal number of vertices

Hoffentlich die Kommentare sind genug Erklärung, um zu verstehen, das Thema-aber nur kurz, es scheint, dass die interpolation Gesicht Farbe nicht funktioniert, wenn die Eigenschaft FaceVertexCData gibt die Farben der Flächen und keine Ecken.

InformationsquelleAutor Sheljohn | 2016-12-10



2 Replies
  1. 2

    Als Warnmeldung angezeigt, wenn Sie verwenden möchten die 'interp' shading-Methode, die Sie benötigen, um Ihre FaceVertexCData haben einen Eintrag für jede vertex. Derzeit haben Sie einen Eintrag für jedes Gesicht.

    patch( 'Vertices', V, 'Faces', F, 'FaceVertexCData', rand( size(V,1), 1 ) );
    shading('interp')

    Dies ist nicht ein Problem oder ist das ein bug, weil shading legt die FaceColor Eigenschaft des patch-Objekts zu 'interp' die explizit verlangt, dass ein Eintrag in FaceVertexCData für jeden vertex.

    'interp' — Interpoliert die Farbe zwischen jedem Gesicht. Geben Sie zunächst CData oder FaceVertexCData als array mit einem Wert pro vertex. Bestimmen Sie das Gesicht Farben durch die Verwendung einer bilinearen interpolation der Werte an jedem Scheitelpunkt.

    • Deine Antwort macht mich lächeln, weil das ist genau das, was die Warnung sagt, ich kann Lesen, aber ich verstehe nicht, warum das der Fall ist? Es ist „legal“ (nach der Dokumentation) angeben FaceVertexCData für jedes Gesicht, und die Dokumentation für shading nicht nennen keine besonderen Problem mit der option interp. Glaubst du, das ist ein bug, und wenn nicht, warum wäre es keine Erwähnung über dieses Thema in der Dokumentation?
    • Bitte nehmen Sie es nicht persönlich, und lassen Sie mich wissen, wenn meine Frage unklar ist (ich habe einen text unter den Auszug), aber ich werde downvote Ihre Antwort, denn ich glaube nicht, dass es sinnvoll ist.
    • Es ist kein bug. Ich habe enthalten links zu den offiziellen Dokumentation und Hinzugefügt, einen Auszug, in dem explizit definiert das Verhalten
    • Wähle ich dann meine Antwort in zwei Tagen, weil es mir erlaubt, umgehen diese Einschränkung, aber danke für deine Antwort!
  2. 1

    FYI, wenn Sie wollen, zu konvertieren, ein Vektor, der die Farben für jede Fläche zu einem Vektor von Farben für jeden Eckpunkt, können Sie folgende Funktion verwenden:

    function cdata = face2vertex(cdata,faces,nvert)
    
        fmax = max(faces(:));
        if nargin < 3, nvert=fmax; end
        if size(faces,1)~=3, faces=faces'; end
    
        assert( size(faces,1)==3, 'Bad faces size.' );
        assert( size(faces,2)==numel(cdata), 'Input size mismatch.' );
        assert( nvert >= fmax, 'Number of vertices too small.' );
    
        faces = faces(:);
        cdata = repelem( cdata(:), 3 ); % triplicate face colors
    
        nfpv  = accumarray( faces, 1, [nvert,1] ); % #of faces per vertex
        cdata = accumarray( faces, cdata, [nvert,1] ) ./ max(1,nfpv);
    
    end

    Diese Funktion nimmt in Eingang:

    • eine Nfaces x 1 Spalten-Vektor von Farben cdata,
    • eine Nfaces x 3 array von vertex-Indizes (ein Dreieck pro Zeile),
    • Optional die Anzahl der vertices, die überschreiben die Größe der Ausgabe (sonst abgeleitet aus der face-Indizes).

    und gibt einen Nvertices x 1 Spalten-Vektor von Farben, so dass für jeden vertex, die Farbe ist gemittelt über die Flächen, enthalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.