Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何为任何二维形状(或曲线)生成楼梯踏步曲线(轮廓)?_Algorithm_Matlab_Graph - Fatal编程技术网

Algorithm 如何为任何二维形状(或曲线)生成楼梯踏步曲线(轮廓)?

Algorithm 如何为任何二维形状(或曲线)生成楼梯踏步曲线(轮廓)?,algorithm,matlab,graph,Algorithm,Matlab,Graph,如果我有任意二维形状轮廓上的点的坐标,我如何找到构成楼梯台阶曲线轮廓的点的坐标,该曲线最能代表原始轮廓,但只使用一组已知坐标(xi,I=1,…,n和yi,I=1,…,m)。例如,原始三角形由粗的蓝色实线表示。如果我的理解正确的话,它与matlab楼梯函数不同。 matlab代码会很好,但在其他语言也可以,算法是最重要的。谢谢 似乎您需要任何线光栅化算法(给出近似线段的整数网格点坐标) 考虑Algortim或DDA one。首先,我将根据绘图定义一组样本数据。假设像素中心以整数值对齐(MATLAB

如果我有任意二维形状轮廓上的点的坐标,我如何找到构成楼梯台阶曲线轮廓的点的坐标,该曲线最能代表原始轮廓,但只使用一组已知坐标(xi,I=1,…,n和yi,I=1,…,m)。例如,原始三角形由粗的蓝色实线表示。如果我的理解正确的话,它与matlab楼梯函数不同。 matlab代码会很好,但在其他语言也可以,算法是最重要的。谢谢


似乎您需要任何线光栅化算法(给出近似线段的整数网格点坐标)


考虑Algortim或DDA one。

首先,我将根据绘图定义一组样本数据。假设像素中心以整数值对齐(MATLAB的约定如下),并且左下角位于
(0.5,0.5)
,我们得到的数据如下:

vx = [1.5; 9.7; 3.7; 1.5];  % X values of triangle vertices
vy = [8.3; 6.0; 1.7; 8.3];  % Y values of triangle vertices
x = 1:10;                   % X pixel center coordinates
y = 1:9;                    % Y pixel center coordinates
请注意,顶点坐标从三角形的左上角开始按顺时针方向排列,重复末端的第一个顶点以闭合多边形

获取面具(最简单的部分): 如果您有:使用:

讨论了该函数使用的算法。但是,如果您想使用不需要特殊工具箱的纯MATLAB方法,可以使用:

在这种情况下,只要像素的中心点位于多边形内,它就包括在遮罩中。在这个特定的示例中,这两种方法产生相同的结果遮罩,但它们并不总是因为它们决定是否包括像素的标准不同

获取轮廓坐标: 获取遮罩轮廓的坐标要稍微复杂一点,在周长周围进行适当的排序。为此,我们可以将遮罩表示为一系列顶点和三角形面(使用函数),然后计算(即,仅存在于一个三角形面上的边):

我们可以这样画:

imagesc(x, y, mask);
axis equal
set(gca, 'XLim', [min(x)-0.5 max(x)+0.5], ...
         'YLim', [min(y)-0.5 max(y)+0.5], ...
         'XTick', x, 'YTick', y, 'YDir', 'normal');
colormap([0.9 0.9 0.9; 0.6 0.6 0.6]);
hold on;
plot(xOutline, yOutline, 'b', 'LineWidth', 2);
plot(xOutline(1), yOutline(1), 'go', 'LineWidth', 2);
plot(vx, vy, 'r', 'LineWidth', 2);


xOutline
yOutline
中的轮廓坐标是从围绕遮罩区域逆时针旋转的绿色圆圈开始排序的。

您的最终目标是获得蓝线的坐标,还是生成深灰色区域的遮罩?@gnovice,正确。最后的目标是面具。但是我需要它轮廓的坐标数组,这样我就可以生成遮罩了。或者,如果算法/函数可以生成掩码并给我其轮廓的坐标,也可以。谢谢。您是只需要显示蓝色的轮廓,还是需要以特定的顺序(即围绕灰色区域顺时针方向)显示轮廓的坐标?是的,我需要坐标。我有一系列原始轮廓点的坐标(例如,圆、三角形或其他闭合曲线)。我需要新的坐标。从一个坐标到另一个坐标,非常感谢你的伟大贡献help@gnovice. 我相信在matlab中,除了实现原始算法之外,还有一种替代方法。你的方法很棒!谢谢你让我知道这个问题背后的想法@MBo!我也喜欢你的回答。
[cx, cy] = meshgrid(x, y);         % Generate a grid of x and y values
mask = inpolygon(cx, cy, vx, vy);
% Create raw triangulation data:
[cx, cy] = meshgrid(x, y);
xTri = bsxfun(@plus, [0; 1; 1; 0], cx(mask).');
yTri = bsxfun(@plus, [0; 0; 1; 1], cy(mask).');
V = [xTri(:) yTri(:)];
F = reshape(bsxfun(@plus, [1; 2; 3; 1; 3; 4], 0:4:(4*nnz(mask)-4)), 3, []).';

% Trim triangulation data:
[V, ~, Vindex] = unique(V, 'rows');
V = V-0.5;
F = Vindex(F);

% Create triangulation and find free edge coordinates:
TR = triangulation(F, V);
freeEdges = freeBoundary(TR).';
xOutline = V(freeEdges(1, [1:end 1]), 1);  % Ordered edge x coordinates
yOutline = V(freeEdges(1, [1:end 1]), 2);  % Ordered edge y coordinates
imagesc(x, y, mask);
axis equal
set(gca, 'XLim', [min(x)-0.5 max(x)+0.5], ...
         'YLim', [min(y)-0.5 max(y)+0.5], ...
         'XTick', x, 'YTick', y, 'YDir', 'normal');
colormap([0.9 0.9 0.9; 0.6 0.6 0.6]);
hold on;
plot(xOutline, yOutline, 'b', 'LineWidth', 2);
plot(xOutline(1), yOutline(1), 'go', 'LineWidth', 2);
plot(vx, vy, 'r', 'LineWidth', 2);