中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據

發布時間:2021-12-29 16:42:10 來源:億速云 閱讀:264 作者:小新 欄目:大數據

這篇文章主要為大家展示了“如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據”這篇文章吧。

先簡單介紹matlab中的正則吧

(不全說,只講我下面要用到的)

regexpi(String, pattern)   % 忽略大小寫
這個將返回pattern在String中出現的所有位置,如果為空則表示String中沒有patern

match = regexpi(String, pattern, 'match')   % 忽略大小寫
這個將返回在String中出現的所有的pattern, 返回值是一個cell,
所有出現的pattern都作為單獨的一個元素放在這個cell中了
如果沒有匹配到pattern則match為空



下面說一下這個pattern

如果pattern = 'vertex',那么之后將在String中找和'vertex'一模一樣的位置
也就是:如果pattern是一個已知的字符串(只有一種可能),那么就是在String中尋找這個已知的字符串

如果pattern是一個并不確定的字符串(有多種可能),那么就要自己定義這個模式了。
\+  表示'+'號
\-  表示'-'號
[]  表示一個字符集,[\+\-]表示這一個位置可以是'+'號也可以是'-'號,(只能表示一個字符)
\d  表示一個數字
*   表示'*'號前的那個字符可以重復任意次,\d* 表示任意長度的數字

好了只要知道以上這些就可以完成本篇推文中所需要的模式了

那么下面來分析一下要篩選出STL文件中的頂點坐標需要怎樣的規則

stl文件如下:

如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據

1. 每一個頂點數據都是以vertex打頭的(忽略空格)

2. 那么只要這一行中存在'vertex',那么就存在頂點坐標

3. 判斷'vertex'是否存在在某行中可以用如下的方法:

if ~isempty(regexpi(line, 'vertex'))

4. 那么接下來分析這個頂點坐標的字符串

每個方向的坐標值前要么是+號,要么是-號:

[\+\-]

加減號之后就是一串數字:

\d*

再之后就到點號了 '.'

\.

再之后又是一串數字

\d*

再之后到 'E'

E

再之后到+號或-號

[\+\-]

之后再到一串數字

\d*

5. 那么連起來就是:

'[\+\-]\d*\.\d*E[\+\-]\d*'

6. 通過regexpi來獲取坐標點

xyz_str_cell = regexpi(line, '[\+\-]\d*\.\d*E[\+\-]\d*', 'match');

如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據

接下來就就好整了:

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的整數倍,不然就是文件有誤

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中的每一個元素都是一個數字字符串,所以需要用str2num來轉換一下,為了避免循環,采用cellfun。

經過cellfun轉換后,雖然由字符串變成了數字,但是整個還是一個cell,所以用cell2mat轉換一下。

fopen配合fgetl一次可以獲取文件中的一行。

這樣頂點數據就保存起來了

之后就利用patch把每一片給畫出來,每三組頂點為一片。

最后整個就完成了,即有了stl2matlab的功能,同時也能直接畫出原模型

可以修改patch的屬性達到你自己想要的結果。我在上面沒有進行修改。

可以把這個腳本封裝成一個函數,取個名字,添加到路徑,以后就能直接用了。

最后附上最后的模型把:

如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據

以上是“如何利用正則表達式提取出由三維軟件導出的STL文件中的頂點數據”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿图什市| 平潭县| 开江县| 明光市| 霞浦县| 河津市| 镇平县| 九龙坡区| 元朗区| 哈尔滨市| 乐陵市| 瑞丽市| 陕西省| 石阡县| 沙洋县| 高密市| 崇义县| 栾城县| 崇州市| 天门市| 乌鲁木齐县| 葫芦岛市| 麻栗坡县| 湘潭县| 辰溪县| 宾川县| 彩票| 安溪县| 吉木乃县| 沈阳市| 金湖县| 德保县| 三亚市| 尖扎县| 呼伦贝尔市| 会宁县| 韶山市| 来凤县| 长丰县| 寿阳县| 乐东|