您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何利用正則表達(dá)式提取出由三維軟件導(dǎo)出的STL文件中的頂點(diǎn)數(shù)據(jù)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何利用正則表達(dá)式提取出由三維軟件導(dǎo)出的STL文件中的頂點(diǎn)數(shù)據(jù)”這篇文章吧。
先簡單介紹matlab中的正則吧
(不全說,只講我下面要用到的)
regexpi(String, pattern) % 忽略大小寫
這個將返回pattern在String中出現(xiàn)的所有位置,如果為空則表示String中沒有patern
match = regexpi(String, pattern, 'match') % 忽略大小寫
這個將返回在String中出現(xiàn)的所有的pattern, 返回值是一個cell,
所有出現(xiàn)的pattern都作為單獨(dú)的一個元素放在這個cell中了
如果沒有匹配到pattern則match為空
下面說一下這個pattern
如果pattern = 'vertex',那么之后將在String中找和'vertex'一模一樣的位置
也就是:如果pattern是一個已知的字符串(只有一種可能),那么就是在String中尋找這個已知的字符串
如果pattern是一個并不確定的字符串(有多種可能),那么就要自己定義這個模式了。
\+ 表示'+'號
\- 表示'-'號
[] 表示一個字符集,[\+\-]表示這一個位置可以是'+'號也可以是'-'號,(只能表示一個字符)
\d 表示一個數(shù)字
* 表示'*'號前的那個字符可以重復(fù)任意次,\d* 表示任意長度的數(shù)字
好了只要知道以上這些就可以完成本篇推文中所需要的模式了
那么下面來分析一下要篩選出STL文件中的頂點(diǎn)坐標(biāo)需要怎樣的規(guī)則:
stl文件如下:
1. 每一個頂點(diǎn)數(shù)據(jù)都是以vertex打頭的(忽略空格)
2. 那么只要這一行中存在'vertex',那么就存在頂點(diǎn)坐標(biāo)
3. 判斷'vertex'是否存在在某行中可以用如下的方法:
if ~isempty(regexpi(line, 'vertex'))
4. 那么接下來分析這個頂點(diǎn)坐標(biāo)的字符串
每個方向的坐標(biāo)值前要么是+號,要么是-號:
[\+\-]
加減號之后就是一串?dāng)?shù)字:
\d*
再之后就到點(diǎn)號了 '.'
\.
再之后又是一串?dāng)?shù)字
\d*
再之后到 'E'
E
再之后到+號或-號
[\+\-]
之后再到一串?dāng)?shù)字
\d*
5. 那么連起來就是:
'[\+\-]\d*\.\d*E[\+\-]\d*'
6. 通過regexpi來獲取坐標(biāo)點(diǎn)
xyz_str_cell = regexpi(line, '[\+\-]\d*\.\d*E[\+\-]\d*', 'match');
接下來就就好整了:
clc
clear
file = fopen('palne_stl.txt', 'r');
f = @(c) str2num(c);
vertexs = []; % 三列(x, y, z),n行,每三行作為一組
while ~feof(file)
line = fgetl(file);
if ~isempty(regexpi(line, 'vertex'))
xyz_str_cell = regexpi(line, '[\+\-]\d*\.\d*E[\+\-]\d*', 'match');
xyz_cell = cellfun(f, xyz_str_cell, 'UniformOutput', false);
xyz = cell2mat(xyz_cell);
vertexs = [vertexs; xyz];
end
end
fclose(file)
% len = length(vertexs) 絕對是3的整數(shù)倍,不然就是文件有誤
for i = 1 : length(vertexs)
if ~rem(i, 3)
point1 = vertexs(i-2, :);
point2 = vertexs(i-1, :);
point3 = vertexs(i, :);
x = [point1(1), point2(1), point3(1)];
y = [point1(2), point2(2), point3(2)];
z = [point1(3), point2(3), point3(3)];
patch(x, y, z, 'r')
end
end
xyz_str_cell中的每一個元素都是一個數(shù)字字符串,所以需要用str2num來轉(zhuǎn)換一下,為了避免循環(huán),采用cellfun。
經(jīng)過cellfun轉(zhuǎn)換后,雖然由字符串變成了數(shù)字,但是整個還是一個cell,所以用cell2mat轉(zhuǎn)換一下。
fopen配合fgetl一次可以獲取文件中的一行。
這樣頂點(diǎn)數(shù)據(jù)就保存起來了
之后就利用patch把每一片給畫出來,每三組頂點(diǎn)為一片。
最后整個就完成了,即有了stl2matlab的功能,同時也能直接畫出原模型
可以修改patch的屬性達(dá)到你自己想要的結(jié)果。我在上面沒有進(jìn)行修改。
可以把這個腳本封裝成一個函數(shù),取個名字,添加到路徑,以后就能直接用了。
最后附上最后的模型把:
以上是“如何利用正則表達(dá)式提取出由三維軟件導(dǎo)出的STL文件中的頂點(diǎn)數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。