資源簡介
通過matalb實現圖形學中的掃描線填充空心多邊形程序實現
代碼片段和文件信息
clear
clc
[xy]=ginput();
%測試樣例
%?x=[5?10?5?0];
%?y=[11?6?2?6];
len=length(x);
x1=x;
y1=y;
x1(len+1)=x(1);
y1(len+1)=y(1);
plot(x1y1‘b‘);
hold?on;
%畫內部空缺部分
[x2y2]=ginput();
%測試樣例
%?x2=[5?8?5?2];
%?y2=[9?6?3?6];
len=length(x2);
x3=x2;
y3=y2;
x3(len+1)=x2(1);
y3(len+1)=y2(1);
plot(x3y3‘b‘);
%找到外部的最小值
row=find(y==min(y));
%如果有多個最小值則只取一個
if?length(row)>1
????row=row(1);
end
%找到內部的最小值
row2=find(y2==min(y2));
%如果有多個最小值則只取一個
if?length(row2)>1
????row2=row2(1);
end
for?oy=0:0.0001:(max(y)-y(row))
????n=0;
????m=0;
????w=0;
????n2=0;
????m2=0;
????t1=y(row)+oy;
????%遍歷外部的每一個點
????for?i=1:1:length(y)
????????c=i-1;
????????h=i+1;
????????if?c==0
????????????c=length(y);
????????end
????????if?h==length(y)+1
????????????h=1;
????????end
????????%找出該t1值穿過的線段
????????if??y(i)<=t1?&&?y(c)>=t1
????????????n=n+1;
????????????low1(n)=i;
????????????up1(n)=c;
????????????
????????end
????????%找出該t1值穿過的另一條線段
????????if??y(i)<=t1?&&?y(h)>=t1
????????????
????????????m=m+1;
????????????low2(m)=i;
????????????up2(m)=h;
????????????
????????end
????????
????end
????
????%遍歷內部的每一個點
????%初始化Low2?Up2因為從底部開始劃線一開始
????%不會與內部有交點
????Low2=[];
????Up2=[];
????for?i=1:1:length(y2)
????????c=i-1;
????????h=i+1;
????????if?c==0
????????????c=length(y2);
????????end
????????if?h==length(y2)+1
????????????h=1;
????????end
????????%找出該t1值穿過的線段
????????if??y2(i)<=t1?&&?y2(c)>=t1
????????????n2=n2+1;
????????????Low1(n2)=i;
????????????Up1(n2)=c;
????????????
????????end
????????%找出該t1值穿過的另一條線段
????????if??y2(i)<=t1?&&?y2(h)>=t1
????????????
????????????m2=m2+1;
????????????Low2(m2)=i;
????????????Up2(m2)=h;
????????????
????????end
????????
????end
????%?初始化ox1
????ox1=[];
????%求該t1值穿過外部一條線段的所有交點的x值
????for?j=1:m
????????
????????k1=(x(low2(j))-x(up2(j)))/(y(up2(j))-y(low2(j)));
????????ox=x(low2(j))-((t1-y(row))-(y(low2(j))-y(row)))*k1;
????????w=w+1;
????????ox1(w)=ox;
????????
????????if?ismember(oxx)
????????????xb=find(x==ox);
????????????for?k=1:length(xb)
????????????????f=xb(k);
????????????????if(y(f)==t1)
????????????????????break;
????????????????end
????????????end
????????????
????????????c=f-1;
????????????h=f+1;
????????????
????????????if?c==0
????????????????c=length(y);
????????????end
????????????
????????????if?h==length(y)+1
????????????????h=1;
????????????end
????????????
????????????if??(y(f)-y(c))?*?(y(f)-y(h))<0
????????????????xb2=find(ox1==ox);
????????????????if?length(xb2)>=2
????????????????????ox1(w)=[];
????????????????????w=w-1;
????????????????end
????????????????
????????????end
????????end
????end
????%求該t1值穿過線段的內部一條線的所有交點的x值
????for?j=1:m2
????????
????????k11=(x2(Low2(j))-x2(Up2(j)))/(y2(Up2(j))-y2(Low2(j)));
????????ox=x
- 上一篇:反步控制軌跡跟蹤算法
- 下一篇:粒子群算法權重改變
評論
共有 條評論