【发布时间】:2016-01-11 18:37:11
【问题描述】:
我正在尝试创建自己的 voronoi 图。我有一个由存储在单独向量中的 x 和 y 坐标定义的任意形状。在这个形状内部是一些兴趣点(具有已知坐标),它们属于两个不同的组并充当 voronoi 图的种子。例如,整个图的范围从 x=-10 到 x=90 和 y=-20 到 y=60。边界形状不是矩形,而是在上面的轴范围内。
到目前为止,我所做的是创建一个 3D 矩阵 (100 X 80 X 3),C 和所有的,以便默认颜色为白色。然后我从 i=1:100, j=1:80 开始循环,测试单个像素以查看它们是否在使用多边形的形状内。如果是这样,我会找出最接近的像素点,并根据最近的点属于第 1 组还是第 2 组为其分配颜色。
到目前为止一切都很好。然后我使用 imagesc 显示具有自定义轴范围的图像。问题是 voronoi 图具有一般形状,但由于像素坐标与实际世界坐标不同,因此在位置方面有所偏差。
我尝试使用 imref2d 对其进行映射,但我不知道它的实际工作原理或使用 imref2d 后如何显示图像。请帮我解决这个问题。
我也愿意接受其他方法!
谢谢!
编辑: 根据要求,让我给出一个更详细的例子和解释我的问题。
让我们假设一个简单的菱形边界具有以下向量和 4 个点具有以下坐标向量:
%Boundary vectors
Boundary_X = [-5 40 85 40 -5];
Boundary_Y = [20 50 20 -10 20];
%Point vectors
Group_One_X = [20 30];
Group_One_Y = [10 40];
Group_Two_X = [50 70];
Group_Two_Y = [5 20];
接下来我将它们全部绘制出来,不同的组有不同的颜色。
%Plot boundary and points
hold on
plot(Boundary_X,Boundary_Y)
scatter(Group_One_X,Group_One_Y,10,'MarkerFaceColor','Black',...
'MarkerEdgeColor','Black')
scatter(Group_Two_X,Group_Two_Y,10,'MarkerFaceColor','Red',...
'MarkerEdgeColor','Red')
hold off
axis([-10, 90, -20, 60])
这是结果: Boundary with points
接下来,我逐个像素地测试整个图形区域,并根据它们是否更接近第 1 组或第 2 组点将它们着色为青色或黄色。
%Create pixel vector with default white colour
C=ones(100,80,3);
Colour_One = [0 1 1];
Colour_Two = [1 1 0];
%Loop through whole diagram
for i=1:100
for j=1:80
x=i;
y=j
if inpolygon(x,y,Boundary_X,Boundary_Y)
%Code for testing which point is pixel closest to
%If closest to group 1, assign group 1 colour, else group 2
%colour
end
end
end
%Display image
hold on
imagesc(C)
hold off
右侧的形状有些正确,但其他形状不正确。我明白这是因为我的世界坐标从负值开始,但像素坐标从 1 开始。
因此,我不知道该如何解决这个问题。
谢谢!
【问题讨论】:
-
@flawr 嘿,我已按要求提供了一个示例。谢谢!
标签: matlab