iTwinjs 幾何 - Curve

CurvePrimitive

常用的見下

LineSegment3d直線段兩點直線邊、桿件、骨架
LineString3d折線多點連續直線輪廓線、路徑
Arc3d圓弧 / 橢圓弧圓心 + 半徑 + 起止角圓孔、圓角、弧段
BezierCurve3d貝塞爾曲線端點 + 控制點平滑過渡、動畫軌跡
BSplineCurve3dB 樣條 / NURBS控制點 + 節點矢量車身曲面、流線

LineSegment3d

示例代碼?LineSegment3d

核心部分,如何創建線段,及如何根據比例取點

  • 一條 LineSegment3d,由起點 pointA 和終點 pointB 組成。

  • fraction:一個 歸一化參數

    • 0.0 → 起點

    • 1.0 → 終點

    • 0.5 → 線段中點

    • 可超范圍:-0.21.3 等會得到延長線上的點。

import { LineSegment3d, Point3d } from "@itwin/core-geometry";export default class SimpleLineApi {public static createLineSegmentFromXY(point1X: number, point1Y: number, point2X: number, point2Y: number): LineSegment3d {const pointA = Point3d.create(point1X, point1Y, 0);const pointB = Point3d.create(point2X, point2Y, 0);return LineSegment3d.create(pointA, pointB);}public static createPointsAlongLine(lineSegment: LineSegment3d, fractionsAlongLine: number[]): Point3d[] {const points: Point3d[] = [];for (const fractionAlongLine of fractionsAlongLine) {const pointAlongLine = lineSegment.fractionToPoint(fractionAlongLine);points.push(pointAlongLine);}return points;}
}

LineString3d

連續線段集合

import { LineString3d, Point3d } from "@itwin/core-geometry";// 1. 從點數組
const ls = LineString3d.create([Point3d.create(0, 0, 0),Point3d.create(1, 2, 3),Point3d.create(4, 5, 6)
]);// 2. 兩點起止
const ls2 = LineString3d.create(Point3d.create(0,0), Point3d.create(10,0), Point3d.create(10,10));// 3. 空折線再 push
const ls3 = LineString3d.create();
ls3.pushXYZ(1,2,3);
ls3.pushXYZ(4,5,6);

Arc

Arc3d.create(center, vectorU, vectorV, AngleSweep.createStartEndDegrees(0, 90))

把圓心、半徑向量、垂直向量及起止角度交給 Arc3d.create,即可得到一條位于任意 3D 平面中的圓弧。

參數作用典型取值
center圓心坐標{x:0, y:0, z:0}
vectorX半徑向量?+?X 軸方向長度 = 半徑,例如?Vector3d.create(5,0,0)
vectorY與 vectorX 垂直,定義平面例如?Vector3d.create(0,5,0)
sweepStartEnd兩元素的數組?[startDeg, endDeg][0, 90]?表示 0° 到 90° 的圓弧

?

其余的一些對外函數,所以iTwin并不是只能去獲取幾何,還有大量的函數

類別函數簽名(簡寫)一句話作用
構造函數Arc3d.create(center, vector0, vector90, sweep)用圓心 + 兩正交向量 + 角度范圍建圓弧
Arc3d.createXY(center, radius, sweep?)快速建 X-Y 平面圓弧
Arc3d.createXYZ(center, radius, sweep?)快速建 X-Y-Z 空間圓弧
Arc3d.createUnitCircle()單位圓(半徑 1,0-360°)
Arc3d.fromJSON(json)反序列化恢復圓弧
Arc3d.createCircularStartMiddleEnd(start, middle, end)三點定圓弧
讀取屬性arc.center : Point3d圓心坐標
arc.vector0 : Vector3d0° 方向半徑向量
arc.vector90 : Vector3d90° 方向半徑向量
arc.sweep : AngleSweep起止角對象
arc.radiusXY : number平均半徑
arc.curveLength()弧長
arc.fractionToPoint(f)比例 0-1 取點
arc.fractionToPointAndDerivative(f)取點 + 切線
arc.closestPoint(spacePt)空間點到圓弧最近點
arc.isCircular : boolean是否整圓(360°)
變換 / 復制arc.clone()深拷貝
arc.cloneTransformed(transform)變換后拷貝
arc.reverseInPlace()就地反轉起止角
幾何操作arc.constructOffset(distance, method?)生成等距圓弧
arc.constructCircularArcChainApproximation(options)圓弧 → 多段小圓弧近似
arc.extendToStartEnd(start, end)延伸/裁剪到起止點
arc.getRange()返回包圍盒?Range3d
交互 / 判斷arc.isAlmostEqual(other)幾何相等比較
arc.intersectRay3d(ray)與射線求交
arc.intersectPlane(plane)與平面求交
arc.intersectRange(range)與包圍盒求交

BezierCurve3d

Bezier示例

不好意思這個例子很多函數名沒改。。。。但是我不想改了。。

伯恩斯坦多項式

成員返回值一句話作用
curve.controlPoints : Point3d[]控制點數組直接拿到當前控制點
curve.order : number階數2=二次,3=立方
curve.curveLength()近似弧長快速積分長度
curve.fractionToPoint(f)Point3d比例 0-1 取點
curve.fractionToPointAndDerivative(f){point,derivative}取點 + 切線
curve.closestPoint(spacePt){point,fraction}空間點到曲線最近

BSplineCurve3d

B樣條曲線示例

Loop

是由折線(或任意曲線鏈)首尾閉合形成的“環”,比如面域邊界、孔洞、截面輪廓

把折線變 Loop(強制閉合)

import { Loop, LineString3d } from "@itwin/core-geometry";const ls = LineString3d.create([p0, p1, p2, p0]); // 首尾同點
const loop = Loop.create(ls);                     // 生成閉合環

從 Loop 取回折線

const lsAgain = loop.children[0] as LineString3d;

Path

Path 是一個可以混裝任意曲線類型不強制閉合開放曲線鏈(poly-curve),比如布線、掃描路徑、拉伸軌跡。它只表示一條“路徑”,不包圍任何區域;若要圍成區域,請用 Loop。

會把多種線類型,如線段和弧,拼接成一個Path,然后用Decorator來渲染,用作路徑展示之類

import { LineString3d, Arc3d, Path } from "@itwin/core-geometry";const ls   = LineString3d.create([p0, p1]);
const arc  = Arc3d.createXY(Point3d.create(2,0), 3);const path = Path.create(ls, arc);  // 折線 + 圓弧 連成開放鏈
console.log(path.curveLength());

其他的例子

幾何的例子

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917125.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iPhone 恢復出廠設置是否會刪除所有內容?

當你的 iPhone 經常崩潰、出現黑屏死機、卡在加載屏幕上等問題時,你可能會考慮進行恢復出廠設置來修復它。或者在其他情況下,如果你要將使用多年的設備交給新主人,出于安全考慮,也需要進行恢復出廠設置。那么,恢復出廠…

機器學習②【字典特征提取、文本特征處理(TF-IDF)、數據標準化與歸一化、特征降維】

文章目錄先言一、特征工程概述二、特征提取1.字典特征提取(特征離散化)2.文本特征提取2.1英文文本提取2.2中文文本提取(jieba分詞器)3.TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取三、數據歸一化與標準化1.MinMaxScaler …

3、CC3200串口DMA

先說下CC3200存在2個16*8的fifos, 分別用于發送和接收 當fifos被disable時,將會作為一個1字節深度的保持寄存器, 所以無論fifos是開是關,發送和接收都繞不開fifos DMA 由于發送和接收都繞不過fifos,所以DMA也繞不開FIFOS. MAP_UARTFIFOLevelS…

從游戲NPC到手術助手:Agent AI重構多模態交互,具身智能打開AGI新大門

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

Lesson 29 Taxi!

Lesson 29 Taxi! taxi n.出租車 同義詞:cab n.出租車 相關:taxi meter計價器 taxi stand taxi rank 出租車站 call ataxi 叫車,打車 例句:對不起,請問出租車站在哪里? Excuse me, do you know where the taxi rank is please? land v.著陸,登陸n.陸地…

怎樣將allegro的brd文件轉化為AD的PCB文件

由于工作需要將allegro的PCB轉成ad給同事,在使用AD軟件導入Allegro的brd格式文件時出現各種的異常報錯彈窗問題,現分享兩種將Allegro PCB文件導入到AD中的方法。一、第1種方法使用高版本的AD軟件(AD22,同時操作電腦需安裝了Allegr…

[免費]【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts)【論文+源碼+SQL腳本】

大家好,我是python222_小鋒老師,看到一個不錯的【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts),分享下哈。 項目視頻演示 【免費】【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts爬蟲) Pytho…

什么是CI/CD?

CI/CD是持續集成(Continuous Integration)和持續交付/持續部署(Continuous Delivery/Continuous Deployment)的縮寫:持續集成(Continuous Integration, CI):CI是一種開發實踐&#x…

【Linux】重生之從零開始學習運維之Mysql

一主一從主12主機準備工作mkdir -p /data/mysql/logbin chown -R mysql:mysql /data/mysql主節點mysql配置vim /etc/my.cnf.d/mysql-server.cnf server-id177 log_bin/data/mysql/logbin/mysql-bin default_authentication_pluginmysql_native_password查看效果systemctl resta…

Trust Management System (TMS)

Trust Management System (TMS)信托管理系統學習信托管理系統(TMS)是一種用于高效管理信托業務的綜合平臺,涵蓋客戶信息、資產配置、風險監控等功能。通過學習TMS,可以掌握信托產品設計、業務流程優化及合規…

Spring Boot中使用Bouncy Castle實現SM2國密算法(與前端JS加密交互)

Spring Boot中使用Bouncy Castle實現SM2國密算法(與前端JS加密交互)一、環境準備二、核心實現三、前后端交互流程四、關鍵問題解決方案五、常見問題排查六、最佳實踐建議在現代Web應用中,數據安全傳輸至關重要。SM2作為我國自主設計的非對稱加…

機器學習sklearn:隨機森林的決策樹

bg:對比決策樹來說,搞多幾棵樹就是隨機森林了rlf_1 [] rlf_2 [] for i in range(10):rfc RandomForestClassifier(n_estimators25)rfc_s cross_val_score(rfc, wine.data, wine.target, cv10).mean()rlf_1.append(rfc_s)clf DecisionTreeClassifier…

上海月賽kk

1.十六進制#include<bits/stdc.h> using namespace std;int n;int main(){cin>>n;stack<int>re;if(n<16)cout<<0;while(n){re.push(n%16);n/16;}while(!re.empty()){int xre.top();re.pop();if(x<10)cout<<x;else cout<<char(Ax-10)…

暑期算法訓練.12

目錄 52. 力扣1 兩數之和 52.1 題目解析&#xff1a; 52.2 算法思路&#xff1a; 52.3 代碼演示&#xff1a; ?編輯 52.4 總結反思&#xff1a; 53 面試題&#xff1a;判定是否互為字符重排 53.1 題目解析&#xff1a; 53.2 算法思路&#xff1a; 53.3 代碼演示&…

MySQL時間處理完全指南:從存儲到查詢優化

時間是數據庫中最活躍的數據維度之一&#xff0c;正確處理時間數據關系到系統穩定性、數據分析準確性和業務邏輯正確性。本文將深入剖析MySQL時間處理的完整知識體系。一、MySQL時間數據類型詳解1. 核心時間類型對比類型存儲空間范圍特性時區影響DATE3字節1000-01-01~9999-12-3…

Text2SQL 智能問答系統開發-預定義模板(二)

背景 在構建一個支持多輪對話的 Text2SQL 系統過程中&#xff0c;我完成了以下關鍵功能&#xff1a; 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后&#xff0c;系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整&#xff0…

JavaScript 異步編程:Promise 與 async/await 詳解

一、Promise 1. 什么是 Promise&#xff1f; Promise 是 JavaScript 中用于處理異步操作的對象&#xff0c;它代表一個異步操作的最終完成&#xff08;或失敗&#xff09;及其結果值。 2. Promise 的三種狀態 ??Pending&#xff08;待定&#xff09;??&#xff1a;初始狀態…

OS架構整理

OS架構整理引導啟動部分bios bootloader區別啟動流程&#xff08;x86 BIOS 啟動&#xff09;&#xff1a;biosboot_loader3.切換進保護模式實模式的限制如何切換進保護模式加載kernel到內存地址1M加載內核映像文件elf一些基礎知識鏈接腳本與代碼數據段創建GDT表段頁式內存管理顯…

【WRF-Chem第二期】WRF-Chem有關 namelist 詳解

目錄namelist 選項&#xff1a;chem_opt 的選擇其他化學相關的 namelist 選項氣溶膠光學屬性與輸出邊界與初始條件配置&#xff08;氣體&#xff09;參考本博客詳細介紹 WRF-Chem有關 namelist 選項。 namelist 選項&#xff1a;chem_opt 的選擇 chem_opt 是什么&#xff1f;…

STM32-USART串口實現接收數據三種方法(1.根據\r\n標志符、2.空閑幀中斷、3.根據定時器輔助接收)

本章概述思維導圖&#xff1a;USART串口初始化配置串口初始化配置在&#xff08;STM32-USART串口初始化章節有詳細教程配置&#xff09;&#xff0c;本章不做講解直接代碼示例&#xff0c;本章重點在于串口實現接收數據三種方法&#xff1b;配置USART1串口接收初始化函數步驟&a…