Matlab

时间:2015-08-07 14:36:16

标签: matlab plot

我试图以编程方式在Matlab中创建一个场景,为场景评估添加随机对象。我正在使用补丁对象进行显示,所以我有myObject.Faces = [data]myObject.Vertices = [data]等行。如果我想在场景中添加点,我只需使用以下代码段附加新对象:

myScene.Vertices = [myScene.Vertices; myObject.Vertices];
myScene.Faces = [myScene.Faces; myObjects.Faces + numel(myScene.Faces)];

到目前为止,对于基本场景,一切都很好。当我希望能够在视觉上区分场景中的新对象时,我的问题出现了。我似乎无法为我单独添加到场景中的对象着色 - 一切都必须是相同的颜色。

我尝试使用repmat创建一个与<var>.Faces中的每个条目相对应的颜色条目,但是我收到Color value must be a 3 element numeric vector的错误。

据我所知,我可以通过使用结构数组并循环遍历每个元素,但我希望避免这种情况。我有许多想要跟踪的对象,我想将场景称为myScene,因此我可以使用patch(myScene)进行绘图,因此可以在myScene.Vertices上进行数学运算等。< / p>

我真的不想结束:

for i = 1:numel(myScene)
  myScene(i).Vertices = <some function>(myScene(i).Vertices);
  patch(myScene(i))
  hold on
end

我每次都需要与myScene进行互动,但同样,我希望场景中的不同对象也会有不同的颜色。

:编辑:

好的,对于简单示例,请尝试以下方法:

sceneX = [-5 5 5 -5 5 -5];
sceneY = [5 5 -5 5 -5 -5];
sceneZ = [0 0 0 0 0 0];
scene.Vertices = [sceneX.',sceneY.',sceneZ.'];
nPoints = size(scene.Vertices,1);
scene.Faces = reshape(1:nPoints,3,nPoints/3).';
scene.FaceColor = [0.7 0.7 0.7];
patch(scene)

objectX = [-1 -1  1 -1  1  1 -1 -1  0 -1  0  1  0  1  1 -1  0  1];
objectY = [-1  1  1 -1  1 -1 -1  1  0  1  0  1  0  1 -1 -1  0 -1];
objectZ = [ 1  1  1  1  1  1  1  1  3  1  3  1  3  1  1  1  3  1];
object.Vertices = [objectX.',objectY.',objectZ.'];
nPoints = size(object.Vertices,1);
object.Faces = reshape(1:nPoints,3,nPoints/3).';
object.FaceColor = [0.3 0.3 0.7];
hold on
patch(object)

现在,正如我上面所写,我可以通过以下方式将object添加到scene

newScene.Vertices = [scene.Vertices; object.Vertices];
newScene.Faces = [scene.Faces; object.Faces + numel(scene.Faces)];

然而,我无法保持颜色 - 据我所知,一切都必须设置为一种颜色。这是一个非常基本的例子;我实际生成的场景有数百个对象,每个对象有数百个面。

我正在寻找的内容:我将立即选择的答案是解释下面的方法(1),或解释为什么(1)不可能并提供如何做的答案(2)代替。

(1) - 解释如何使用newScene命令的patch(FV)版本在patch中为我自己指定的每组面部分配颜色。在上面的示例中,我希望newScene.Faces(1:2,:)为一种颜色,newScene.Faces(3:end,:)为另一种颜色。

(2) - 解释如何使用newScene命令的任何变体在patch中为我自己指定的每组面部分配颜色。

我有很多其他功能专门针对FV结构,并且鉴于我的场景非常大,我不想跟踪/维护同一场景的两个重复条目。修改我的所有其他功能将是适度的痛苦,如果它是必需的,那么我想我必须这样做,但我想知道为什么如果需要我必须这样做。

1 个答案:

答案 0 :(得分:1)

如果要为每个面指定颜色,则必须使用补丁属性FaceVertexCData(可以在具有相同名称的字段的结构中定义),并设置FaceColor'Flat',如Coloring Patches文档中所述。

所以你的例子变成了:

%%
sceneX = [-5 5 5 -5 5 -5];
sceneY = [5 5 -5 5 -5 -5];
sceneZ = [0 0 0 0 0 0];
scene.Vertices = [sceneX.',sceneY.',sceneZ.'];
nPoints = size(scene.Vertices,1);
scene.Faces = reshape(1:nPoints,3,nPoints/3).';
scene.FaceColor = 'Flat' ;
scene.FaceVertexCData = repmat( [0.7 0.7 0.7] , size(scene.Faces,1) , 1 ) ; %// assign the same color for each face
patch(scene)

objectX = [-1 -1  1 -1  1  1 -1 -1  0 -1  0  1  0  1  1 -1  0  1];
objectY = [-1  1  1 -1  1 -1 -1  1  0  1  0  1  0  1 -1 -1  0 -1];
objectZ = [ 1  1  1  1  1  1  1  1  3  1  3  1  3  1  1  1  3  1];
object.Vertices = [objectX.',objectY.',objectZ.'];
nPoints = size(object.Vertices,1);
object.Faces = reshape(1:nPoints,3,nPoints/3).';
object.FaceColor = 'Flat' ;
object.FaceVertexCData = repmat( [0.3 0.3 0.7] , size(object.Faces,1) , 1 ) ; %// assign the same color for each face
hold on
patch(object)

%%
newScene.Vertices  = [scene.Vertices ; object.Vertices];
newScene.Faces     = [scene.Faces    ; object.Faces + numel(scene.Faces)];
newScene.FaceVertexCData = [scene.FaceVertexCData ; object.FaceVertexCData ] ;
newScene.FaceColor = 'Flat' ;
patch(newScene)

现在,您的newScene结构中有一个字段FaceVertexCData,其中包含一个8x3矩阵,表示每个面的颜色(scene和下一个面的前两行object)面的6行。您可以通过更改此矩阵的相应行来单独更改每个面部颜色。

如果要更改一个对象的颜色,则必须更改与该对象的面相对应的所有行,因此在添加时跟踪哪个面/行对应哪个对象可能会很好它们。