gpt4 book ai didi

matlab - 在 MATLAB/Octave 中矢量化三角形扫描线

转载 作者:行者123 更新时间:2023-12-04 18:11:47 25 4
gpt4 key购买 nike

我是 Octave/MATLAB 的新手。我想为一个三角形矢量化一个简单的扫描线填充。这是我要消除的 while 循环:

 #Iterate over all the scan lines from bottom to top
while(yCurr <= 200)

#VARIABLES:
# img - Zero matrix used as an image. Zero is black. Assume 320x200 pixels.
# leftIdx - Vector that contains the left-most pixel to fill in each
# scanline. Dim is 1x200. Each element represents x-coord of a pixel.
# rightIdx - Vector that contains the right-most pixel to fill in each
# scanline. Dim is also 1x200. Each element represents x-coord of a pixel.
# yCurr - The current row being scanned.

#Fill all the pixels in one scan line
img(leftIdx(yCurr) : rightIdx(yCurr), yCurr) = color;

#Increment the row
yCurr++;

endwhile

最佳答案

简单的解决方案 - 您可以将循环直接更改为一个 arrayfun 调用。 arrayfun 是一种编写循环的奇特方式——它为所有提供的参数调用用户定义的函数。需要注意的是,通常与 arrayfun 一起使用的匿名函数不能分配变量。但是,您可以编写一个普通函数,将颜色分配给 img 并将其作为参数传递给 arrayfun:

 function doAllWork(img, rightIdx, leftIdx)

arrayfun(@fill, 1:size(img, 1));

function fill(i)
img(leftIdx(i):rightIdx(i), i) = color;
end
end

我已经在 doAllWork 中将 fill 函数定义为本地函数,以便它可以访问 img、leftIdx、rightIdx。

复杂的解决方案通常在这种情况下,要一次性进行分配,您希望使用 sub2ind 来获得矩阵的线性索引(简而言之,在 C 中,您会写 sth. like j*nx+i)。然后你写 img(ind) 而不是 img(indrow, indcol)。问题是每一行在不同的地方都有不同数量的非零。

(复杂的)想法是创建一个明确的列索引数组 Ii{row} = [leftIdx(row):rightIdx(row)] 和相应的行索引数组 Ij{row} = [row*ones(1, lenght(Ii{行}))] 为所有行。没有可以使用 arrayfun 完成的循环。一旦你有了这个,你可以在对应的 Ii/Ij 条目上使用 sub2ind 构造一个线性索引到你的 img 中,也称为使用 arrayfun。代码看起来像这样
nrows=1:size(img, 1);
Ii=arrayfun(@(i)(leftIdx(i):rightIdx(i)), nrows, 'UniformOutput', false);
Ij=arrayfun(@(i)(i*ones(1,length(Ii{i}))), nrows, 'UniformOutput', false);
lin=arrayfun(@(i)(sub2ind(size(A), Ij{i}, Ii{i})), nrows, 'UniformOutput', false);
img([lin{:}])=color;

这种方法在您的情况下没有多大用处 - 它太复杂了。但它对 arrayfun 可以做什么具有指导意义,并且 sub2ind 的技巧通常非常有用。

关于matlab - 在 MATLAB/Octave 中矢量化三角形扫描线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com