Skip to content

Instantly share code, notes, and snippets.

@wangjiezhe
Created October 17, 2022 06:52
Show Gist options
  • Save wangjiezhe/bdb59677c45ef81c3bd6552d41ddc6d9 to your computer and use it in GitHub Desktop.
Save wangjiezhe/bdb59677c45ef81c3bd6552d41ddc6d9 to your computer and use it in GitHub Desktop.
BeginPackage["立体几何`"];
法向量::usage = "法向量[A,B,C]得到平面ABC的一个法向量";
单位法向量::usage = "单位法向量[A,B,C]得到平面ABC的一个单位法向量";
点面距离::usage = "点面距离[P,{A,B,C}]得到点P到平面ABC的距离";
四面体体积::usage = "四面体体积[A,B,C,D]得到四面体ABCD的体积";
线面夹角::usage = "线面夹角[{P,Q},{A,B,C}]得到直线PQ和平面ABC的夹角";
二面角::usage = "二面角[A,{B,C},D]得到二面角A-BC-D的平面角";
平行吗::usage = "平行吗[{P,Q},{A,B}]判断直线PQ和直线AB是否平行
平行吗[{P,Q},{A,B,C}]判断直线PQ和平面ABC是否平行
平行吗[{P,Q,R},{A,B,C}]判断平面PQR和平面ABC是否平行";
垂直吗::usage = "垂直吗[{P,Q},{A,B}]判断直线PQ和直线AB是否垂直
垂直吗[{P,Q},{A,B,C}]判断直线PQ和平面ABC是否垂直
垂直吗[{P,Q,R},{A,B,C}]判断平面PQR和平面ABC是否垂直";
Begin["`Private`"];
法向量[PointA_, PointB_, PointC_] :=
Cross[PointB - PointA, PointC - PointA]
单位法向量[PointA_, PointB_, PointC_] :=
Normalize @ 法向量[PointA, PointB, PointC]
点面距离[PointP_, {PointA_, PointB_, PointC_}] :=
RegionDistance[InfinitePlane[{PointA, PointB, PointC}], PointP]
四面体体积[PointA_, PointB_, PointC_, PointD_] :=
Volume[Tetrahedron[{PointA, PointB, PointC, PointD}]]
线面夹角[{PointP_, PointQ_}, {PointA_, PointB_, PointC_}] :=
Module[{pq = PointQ - PointP, nv = 法向量[PointA, PointB, PointC]},
VectorAngle[pq, pq - Projection[pq, nv]]
]
二面角[PointA_, {PointB_, PointC_}, PointD_] :=
Module[{v, w, a},
v = PointD - PointB;
w = PointA - PointB;
a = DihedralAngle[{PointB, PointC}, {v, w}];
If[a > Pi,
2 Pi - a,
a
]
]
平行吗[{PointP_, PointQ_}, {PointA_, PointB_}] :=
Module[{u, v},
u = PointP - PointQ;
v = PointA - PointB;
u \[Cross] v == {0, 0, 0}
]
垂直吗[{PointP_, PointQ_}, {PointA_, PointB_}] :=
Module[{u, v},
u = PointP - PointQ;
v = PointA - PointB;
u . v == 0
]
平行吗[{PointP_, PointQ_}, {PointA_, PointB_, PointC_}] :=
Module[{u, v},
u = PointP - PointQ;
v = 法向量[PointA, PointB, PointC];
u . v == 0
]
垂直吗[{PointP_, PointQ_}, {PointA_, PointB_, PointC_}] :=
Module[{u, v},
u = PointP - PointQ;
v = 法向量[PointA, PointB, PointC];
u \[Cross] v == {0, 0, 0}
]
平行吗[{PointP_, PointQ_, PointR_}, {PointA_, PointB_, PointC_}] :=
Module[{u, v},
u = 法向量[PointP, PointQ, PointR];
v = 法向量[PointA, PointB, PointC];
u \[Cross] v == {0, 0, 0}
]
垂直吗[{PointP_, PointQ_, PointR_}, {PointA_, PointB_, PointC_}] :=
Module[{u, v},
u = 法向量[PointP, PointQ, PointR];
v = 法向量[PointA, PointB, PointC];
u . v == 0
]
End[];
EndPackage[];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment