久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5545|回復: 5
打印 上一主題 下一主題
收起左側

MATLAB等距線掃描程序實現思路與源程序

[復制鏈接]
跳轉到指定樓層
樓主
由于網上多數都是c語言實現多邊形掃描的例子我這就給大家一個matlab實現的方法吧


實現思路如下:
6月19作業題任務是用等距離的掃描線掃描下不規則多邊形,如例圖所示,獲得掃描區間,并畫出結果。
B是多邊形頂點坐標
B=[0     1     2     3     6     7     9    10     9     8     7     5     4     3     2     1;
5     2     3     0     0     1     5     6    13    13    15    15    14    15    11    10]
Ymin=0,Ymax=15,需要n=100個掃描間隔,那么掃描距離就0.15,101條掃描線。
上面這部分編程肯定是沒問題,接下就是模型的難點:
1、如何求掃描線與間隔的交點;
2、如果掃描線剛好掃描到多邊形的頂點,要如何處理;
3、如果掃描線剛好掃描到多邊形的邊,要如何處理;
步驟:
1、從第一條掃描線開始掃描,掃描線為yi
2、從多邊形的第一個點開始,取第一個點n1,  n1的上一個點n0,n1的下一個點n2,n2的下一個點n3。那么n1-n2就表示當前多邊形的邊,n0-n1表示前一條邊,n2-n3表示后一條邊,等下需要用到。
3、判斷掃描線yi與n1-n2是否有交點,有就求交點,沒有就回到步驟2,取下一個點n1;
判斷是否有交點公式:abs(Y(n1)-yi)+ abs(Y(n2)-yi)== abs(Y(n1)-Y(n2)),abs(.)是絕對值的函數。
4、求得交點后,要判斷如何記錄。如果是普通的交點,就直接可以記錄。如果交點剛好是多邊形的頂點,或者掃描到多邊形的邊,就需要處理。
(1)情況1,掃描到普通交點,直接記錄
(2)情況2,掃描到橫線,這個時候就需要用到n0-n1,n2-n3,即前邊與后邊。
        <1> 如果是下圖的情況,記錄n1,n2
<2> 如果是下圖的情況,記錄n1
<3> 如果是下圖的情況,記錄n2
(3)情況3,掃描到頂點每一條邊的兩個頂點,第一個點是不算的,第二個點算。類似這樣,實心表示這個點算上,空心表示不算。這樣的目的是為了不讓掃描到頂點時,會記錄兩次。
<1>遇到極大小值
<2>遇到下一條邊n2-n3是橫線的話,這個點就不用記錄了。不然會多記錄了該點
5、循環完所有的掃描線,就OK啦。最終就獲得了一個所有掃描線多邊形的交點的矩陣!
6、每一條掃描線掃描到的交點肯定是偶數滴,每兩點畫起來就OK。

程序方面:

最終我是寫了如下兩個函數的形式,這題是我最近在做的項目的中間環節,方便調用:
function [smqj]=saomiao(B,dt)
輸入:B表示多邊形,dt表示掃描間隔
輸出:smqj表示最終的掃描區間    (英語特水,只能用拼音命名,用英語命名才高大上)
function huaxian(jl,ZB,MB,dt)(畫線的函數自己寫一下,我這里是有其他作用,多輸入了一個ZB參數,所以有所區別)
輸入:jl 表示掃描區間,ZB 表示子板多邊形,MB 表示母板多邊形,dt 表示掃描間隔
輸出:直接顯示圖像

這題只是讓你們處理母板多邊形而已,所以調用的時候,直接 huaxian(M_QJ,MB,MB,dt)就可以了,自己運行程序看看。


注:程序里面出現這樣的
其實是表示
abs(Y(n1)-yi)+ abs(Y(n2)-yi)== abs(Y(n1)-Y(n2))

(道理如A1==A2  ,寫成 abs(A1-A2)<=0.000001)

在matlab里面,有可能會出現A1跟A2相等,卻判斷A1==A2為0的情況。如果測試A1-A2的話,會出現  e-14,也就是無窮小量,這是matlab本身精確度的問題,把他們當作不相等了。

在測試程序的時候就被這情況干擾了,才做了abs(A1-A2)<=0.000001的處理。

題外話:
1、上面也說了,這個題目是我最近在做的“皮革排版”項目的小部分內容。任務大概是:一張大的不規則母板皮革,要用它來裁剪 如皮帶,皮包等材料的子板,如何排版這些材料,優化的處理這張母板皮革。
如輸入5個圖1,10個圖2,6個圖3,4個圖4。用我們上面的母板,如何最優。

這個項目涉及到數學建模,比如:”如何把子板放到母板里面”,這個東西如何轉化為數學描述就很有難度。  還有涉及到智能優化算法,如遺傳算法,模擬退火算法等用于求最優解。  有參加數學建模的,有時間的可以考慮跟著做這個項目,還是有一定的幫助。

MATLAB源程序:
  1. %輸出smqj為掃描區間,輸入B為板塊頂點,dt為掃描距離
  2. function [smqj]=saomiao(B,dt)
  3. X=B(:,1);
  4. Y=B(:,2);
  5. Y_MIN=min(Y);
  6. Y_MAX=max(Y);

  7. %%這一步是為了刪除一些頂點,可有可無,還是保留一下。相鄰兩條線段斜率一樣,刪中間點
  8. k=[];
  9. for n1=1:size(Y,1)                %計算斜率
  10.     if n1~=size(Y,1)
  11.         n2=n1+1;
  12.     else
  13.         n2=1;
  14.     end
  15.     ki=(Y(n1)-Y(n2))/(X(n1)-X(n2));
  16.     k=[k ki];
  17. end

  18. d_p=[];                          %刪除某些不必要頂點
  19. for n1=1:size(Y,1)
  20.      if n1~=size(Y,1)
  21.         n2=n1+1;
  22.     else
  23.         n2=1;
  24.      end
  25.     if k(n1)==k(n2)
  26.        d_p=[d_p n1];
  27.     end
  28. end

  29. X(d_p+1,:)=[];   %刪除數據     
  30. Y(d_p+1,:)=[];   %刪除數據
  31. k(:,d_p+1)=[];   %刪除數據

  32. %%下面才是掃描的重點

  33. %%開始掃描線
  34. smqj=[];           %用來保存交點
  35. for yi=Y_MIN:dt:Y_MAX
  36.     smqji=[];   %用于記錄每行交點
  37.     for n1=1:size(Y,1)
  38.         %n0-n1為上一條線段
  39.         if n1~=1
  40.             n0=n1-1;
  41.         else
  42.             n0=size(Y,1);
  43.         end
  44.         %n1-n2為當前線段
  45.         if n1~=size(Y,1)
  46.             n2=n1+1;
  47.         else
  48.             n2=1;
  49.         end
  50.         %n2-n3為下一條線段
  51.         if n2~=size(Y,1)
  52.             n3=n2+1;
  53.         else
  54.             n3=1;
  55.         end
  56.         
  57.         
  58.         %*******求交點坐標********
  59.         xi=[];   %初始無交點
  60.         if abs(abs(Y(n1)-yi)+abs(Y(n2)-yi)-abs(Y(n1)-Y(n2)))<=0.000001   %說明存在交點
  61.             if (X(n1)-X(n2))~=0 && (Y(n1)-Y(n2))~=0
  62.                 ki=(Y(n1)-Y(n2))/(X(n1)-X(n2));
  63.                 xi=(yi-Y(n2))/ki+X(n2);
  64.                 p=[xi;yi];             %交點坐標
  65.             elseif (X(n1)-X(n2))==0
  66.                 xi=X(n1);
  67.                 p=[xi;yi];
  68.             elseif (Y(n1)-Y(n2))==0    %先取兩個端點交點,再判斷是否取
  69.                 xi=X(n1);%表示存在而已,不記錄
  70.                 p1=[X(n1);yi];
  71.                 p2=[X(n2);yi];
  72.             end
  73.         end
  74.         %*****判斷改坐標是否記錄*****
  75.         if isempty(xi)==0    %如果存在xi,即有交點
  76.             if sum(Y(find(X==xi))==yi)==0   %說明不是多邊形頂點
  77.                 smqji=[smqji p];            %直接記錄
  78.             else %下面是頂點的情況
  79.                 if  sign(Y(n1)-Y(n2))==0     %本條線是橫線
  80.                     if (sign(Y(n0)-Y(n1))+sign(Y(n2)-Y(n3)))==0
  81.                         smqji=[smqji p1 p2];  %兩點都記錄
  82.                     end
  83.                     if sign(Y(n0)-Y(n1))>0 && sign(Y(n2)-Y(n3))>0
  84.                         smqji=[smqji p1];  %只取前一個
  85.                     end
  86.                     if sign(Y(n0)-Y(n1))<0 && sign(Y(n2)-Y(n3))<0
  87.                         smqji=[smqji p2];  %只取后一個
  88.                     end
  89.                 elseif   xi==X(n2)   %如果不是橫線,后交點才記錄,前交點不用管
  90.                     if  (sign(Y(n1)-Y(n2))+sign(Y(n2)-Y(n3)))==0  %說明是極大極小值
  91.                         smqji=[smqji p p];      %需要記錄兩個
  92.                     else
  93.                         if sign(Y(n2)-Y(n3))~=0 %下一條如果是橫線,也不用記錄
  94.                            smqji=[smqji p];        %記錄1個
  95.                         end
  96.                     end
  97.                 end
  98.             end
  99.         end
  100.     end
  101.     smqji=sort(smqji,2);  %按從小到大排列
  102.     smqj=[smqj smqji];
  103. end
復制代碼


全部資料51hei下載地址:
matlab等距線掃描多邊形程序實現.zip (153.92 KB, 下載次數: 35)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:523872 發表于 2019-4-28 22:00 | 只看該作者
您好,能提供一下子板材的程序嗎,我郵箱:1764245803@qq.com,謝謝
回復

使用道具 舉報

板凳
ID:523872 發表于 2019-4-28 22:08 | 只看該作者
您好啊,能提供一下子板材的程序么
回復

使用道具 舉報

地板
ID:584107 發表于 2019-7-14 22:07 來自手機 | 只看該作者
樓主能把排版放置那部分的算法給一下嗎?
回復

使用道具 舉報

5#
ID:757518 發表于 2020-5-21 16:28 | 只看該作者
定定 ,介紹不錯,不過感覺這個思想還是沒有掌握
回復

使用道具 舉報

6#
ID:757518 發表于 2020-5-27 15:52 | 只看該作者
好奇下,如果是多連通區域呢 ,就是中間有孔洞呢,掃描線要怎么避開然后實現連接?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区大片 | 97色综合| 91亚洲国产成人久久精品网站 | 麻豆久久久9性大片 | 日韩中文一区 | av一级毛片 | 国产精品一区二区视频 | 成人深夜福利 | 国产91丝袜 | 亚洲精品91 | 欧美视频免费在线观看 | 一区影院 | 亚洲激情综合网 | 国产乱码精品1区2区3区 | 一区二区精品 | 91精品国产91久久久久久丝袜 | 欧美成ee人免费视频 | 日日天天| 欧美成人第一页 | 伊人狠狠 | 成人av免费在线观看 | 337p日本欧洲亚洲大胆精蜜臀 | 一区二区免费在线 | 午夜精品一区二区三区免费视频 | 99久久久久久 | 一级看片免费视频囗交动图 | 成人一区二区在线 | 黄色一级大片在线免费看产 | 日韩免费一区 | 99热.com| 日韩中文字幕在线视频观看 | 精品久久久久久一区二区 | 久久久久亚洲精品 | 国产成人午夜高潮毛片 | 国产乱码精品一区二区三区中文 | 国产综合网址 | 日韩视频在线免费观看 | 一区二区免费看 | www.国产| 国产福利精品一区 | 亚洲国产成人在线视频 |