尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

三维中圆的参数化表达

三维中圆的参数化表达 生成圆环的时候我们经常需要通过扫掠生成一个离散的平面圆路径点集。平面圆的数学表示定义考虑n维空间的圆中心点C,圆上点P半径r平面法向为N其满足{∣P⃗−C⃗∣r(P⃗−C⃗)⋅N⃗0 \begin{cases} |\vec{P} - \vec{C}| r \\ (\vec{P} - \vec{C}) \cdot \vec{N} 0 \end{cases}{∣P−C∣r(P−C)⋅N0​推导考虑二维圆的平面方程为(x−a)2(y−b)2r2(x-a)^2(y-b)^2r^2(x−a)2(y−b)2r2其参数化方程为{x(θ)arcos⁡θy(θ)brsin⁡θ,θ∈[0,2π) \begin{cases} x(\theta) a r\cos\theta \\ y(\theta) b r\sin\theta \end{cases}, \theta \in [0, 2\pi){x(θ)arcosθy(θ)brsinθ​,θ∈[0,2π)考虑三维上面的例子其本质是圆平面坐标系通过换基矩阵到达了整体的坐标系如图考虑圆所在平面的法向量N⃗\vec{N}N归一化后记为k^\hat{k}k^在平面内取两个互相垂直的单位向量i^\hat{i}i^、j^\hat{j}j^​构成换基矩阵[i^, j^, k^][\hat{i},\ \hat{j},\ \hat{k}][i^,j^​,k^]其中i^,j^,k^\hat{i},\hat{j},\hat{k}i^,j^​,k^均为在全局坐标系下的表达。则圆的三维参数化方程为P⃗(θ)C⃗rcos⁡θ i^rsin⁡θ j^,θ∈[0,2π) \vec{P}(\theta) \vec{C} r\cos\theta\,\hat{i} r\sin\theta\,\hat{j}, \quad \theta \in [0, 2\pi)P(θ)Crcosθi^rsinθj^​,θ∈[0,2π)其矩阵表达为P⃗(θ)C⃗[i^, j^, k^][rcos⁡θrsin⁡θ0],θ∈[0,2π) \vec{P}(\theta) \vec{C} [\hat{i},\ \hat{j},\ \hat{k}] \begin{bmatrix} r\cos\theta \\ r\sin\theta \\ 0\end{bmatrix}, \quad \theta \in [0, 2\pi)P(θ)C[i^,j^​,k^]​rcosθrsinθ0​​,θ∈[0,2π)代码/** 单位圆离散点: p(i) u·cos(i/n·2π) v·sin(i/n·2π) */functiondiscreteRing(u,v,segments){constpositions[];for(leti0;isegments;i1){constt(i/segments)*Cesium.Math.TWO_PI;constcMath.cos(t);constsMath.sin(t);positions.push(newCesium.Cartesian3(u.x*cv.x*s,u.y*cv.y*s,u.z*cv.z*s,),);}returnpositions;}functiontoWorld(localUnit,radius){returnlocalUnit.map((p){constscaledCesium.Cartesian3.multiplyByScalar(p,radius,newCesium.Cartesian3());returnCesium.Matrix4.multiplyByPoint(frame,scaled,newCesium.Cartesian3());});}functionaddRing(geometry,color){viewer.scene.primitives.add(newCesium.Primitive({geometryInstances:newCesium.GeometryInstance({geometry}),appearance:newCesium.PolylineMaterialAppearance({material:Cesium.Material.fromType(Color,{color}),translucent:false,renderState:{depthTest:{enabled:false}},}),asynchronous:false,allowPicking:false,}),);}functionpolylineGeometry(positions){returnnewCesium.PolylineGeometry({positions,width:4,arcType:Cesium.ArcType.NONE,vertexFormat:Cesium.PolylineMaterialAppearance.VERTEX_FORMAT,});}functiondrawScaleAxis(){}functiondrawRotationAxis(){// Roll 绕 X(红): 圆在 YZconstgeometryXpolylineGeometry(toWorld(discreteRing(Cesium.Cartesian3.UNIT_Y,Cesium.Cartesian3.UNIT_Z,RING_SEGMENTS),RING_RADIUS),);// Pitch 绕 Y(绿): 圆在 ZXconstgeometryYpolylineGeometry(toWorld(discreteRing(Cesium.Cartesian3.UNIT_Z,Cesium.Cartesian3.UNIT_X,RING_SEGMENTS),RING_RADIUS),);// Yaw 绕 Z(蓝): 圆在 XYconstgeometryZpolylineGeometry(toWorld(discreteRing(Cesium.Cartesian3.UNIT_X,Cesium.Cartesian3.UNIT_Y,RING_SEGMENTS),RING_RADIUS),);addRing(geometryX,Cesium.Color.fromCssColorString(#e8514f));addRing(geometryY,Cesium.Color.fromCssColorString(#7ac943));addRing(geometryZ,Cesium.Color.fromCssColorString(#4a90e2));}注:本代码平面圆默认在(0,0,0)处
返回列表