【发布时间】:2019-12-02 14:15:17
【问题描述】:
程序说明如下:
我从一个文件中取 3 个坐标,然后画了一个三角形
我想绘制一个网格,如果网格点在三角形中,我想绘制一个黑色圆圈,否则绘制一个红色圆圈。
我用来检查点是否在三角形内的方法是,如果点 (xco,yco) 在三角形内,它与其他三个点组成的小三角形的面积之和等于三角形。
所以我的 if 语句是如果总面积 = 三角形面积 -> 绘制黑色圆圈,否则绘制红色圆圈。
问题是,即使某些点使总面积等于三角形图的面积,也没有绘制黑色圆圈,而是绘制了红色圆圈。
这似乎是随机的,我无法弄清楚这个简单的问题。
那么你能帮我画点吗?
figure()
% Loading the data from .mat file
A = load('triangle_a.mat','pt1');
B = load('triangle_a.mat','pt2');
C = load('triangle_a.mat','pt3');
% Assigning values of array from .mat into each variable
x1 = A.pt1(1,1);
y1 = A.pt1(1,2);
x2 = B.pt2(1,1);
y2 = B.pt2(1,2);
x3 = C.pt3(1,1);
y3 = C.pt3(1,2);
% Drawing coordinates of a triangle on a grid
plot(x1, y1,'or');
hold on
plot(x2, y2,'or');
hold on
plot(x3, y3,'or');
hold on
% Joining three coordinates to make a triangle
plot ([x1,x2],[y1,y2],'-b');
plot ([x1,x3],[y1,y3],'-b');
plot ([x3,x2],[y3,y2],'-b');
xmin = A_coor(1,1);
xmax = B_coor(1,1);
ymin = A_coor(1,2);
ymax = C_coor(1,2);
xgrid = xmin-1:0.5:xmax+1;
ygrid = ymin-1:0.5:ymax+1;
tri_x = [x1 x2 x3];
tri_y = [y1 y2 y3];
area = polyarea(tri_x,tri_y);
% Making a grid
for x = 1:1:numel(xgrid)
for y = 1:1:numel(ygrid)
xco = xgrid(1,x);
yco = ygrid(1,y);
aa = [xco, x2, x3];
bb = [yco, y2, y3];
cc = [x1, xco, x3];
dd = [y1, yco, y3];
ee = [x1,x2,xco];
ff = [y1,y2,yco];
area1 = polyarea(aa,bb);
area2 = polyarea(cc,dd);
area3 = polyarea(ee,ff);
totarea = area1 + area2 + area3;
if totarea == area
plot(xco,yco,'ok');
else
plot(xco,yco,'.r');
end
end
end
在我更改 if 语句的条件以创建网格部分后,我的代码工作了。 (感谢 Hoki 的建议)
之前
if totarea == area
之后
if abs(area-totarea)<0.002;)
【问题讨论】:
-
我怀疑这与数值公差有关,特别是来自函数
polyarea用于非常接近三角形边缘的点。可能尽量不要使用纯相等,但要查找给定的容差是否仍然适用于您的情况(例如if abs(area-totarea)<tolerance;) -
它确实有效!非常感谢!
-
很高兴它为您工作。也许您可以在此处的答案中解释并展示您实施的工作解决方案。这样,与您有相同问题的人将得到更明显的答案;-)
标签: matlab