Gra*_*ton 11 c# math geometry area computational-geometry
我有一个3D表面,(想想xy平面).飞机可以倾斜.(想想一条斜坡路).
鉴于三维坐标的列表定义面(Point3D1X
,Point3D1Y
,Point3D1Z
,Point3D12X
,Point3D2Y
,Point3D2Z
,Point3D3X
,Point3D3Y
,Point3D3Z
,等),如何计算表面的面积是多少?
请注意,我的问题类似于在2D平面中查找区域.在2D平面中,我们有一个定义多边形的点列表,使用这个点列表我们可以找到多边形的面积.现在假设所有这些点都具有z
这样的值,即它们在3D中升高以形成表面.我的问题是如何找到3D表面的区域?
Gab*_*abe 10
既然你说它是一个多面体,堆叠器的链接(http://softsurfer.com/Archive/algorithm_0101/algorithm_0101.htm)适用.
这是我对您的情况的C代码的近似C#转换:
// NOTE: The original code contained the following notice:
// ---------------------------------------
// Copyright 2000 softSurfer, 2012 Dan Sunday
// This code may be freely used and modified for any purpose
// providing that this copyright notice is included with it.
// iSurfer.org makes no warranty for this code, and cannot be held
// liable for any real or imagined damage resulting from its use.
// Users of this code must verify correctness for their application.
// ---------------------------------------
// area3D_Polygon(): computes the area of a 3D planar polygon
// Input: int n = the number of vertices in the polygon
// Point[] V = an array of n+2 vertices in a plane
// with V[n]=V[0] and V[n+1]=V[1]
// Point N = unit normal vector of the polygon's plane
// Return: the (float) area of the polygon
static float
area3D_Polygon( int n, Point3D[] V, Point3D N )
{
float area = 0;
float an, ax, ay, az; // abs value of normal and its coords
int coord; // coord to ignore: 1=x, 2=y, 3=z
int i, j, k; // loop indices
// select largest abs coordinate to ignore for projection
ax = (N.x>0 ? N.x : -N.x); // abs x-coord
ay = (N.y>0 ? N.y : -N.y); // abs y-coord
az = (N.z>0 ? N.z : -N.z); // abs z-coord
coord = 3; // ignore z-coord
if (ax > ay) {
if (ax > az) coord = 1; // ignore x-coord
}
else if (ay > az) coord = 2; // ignore y-coord
// compute area of the 2D projection
for (i=1, j=2, k=0; i<=n; i++, j++, k++)
switch (coord) {
case 1:
area += (V[i].y * (V[j].z - V[k].z));
continue;
case 2:
area += (V[i].x * (V[j].z - V[k].z));
continue;
case 3:
area += (V[i].x * (V[j].y - V[k].y));
continue;
}
// scale to get area before projection
an = Math.Sqrt( ax*ax + ay*ay + az*az); // length of normal vector
switch (coord) {
case 1:
area *= (an / (2*ax));
break;
case 2:
area *= (an / (2*ay));
break;
case 3:
area *= (an / (2*az));
break;
}
return area;
}
Run Code Online (Sandbox Code Playgroud)
我赞成了一些 我认为正确的答案。但我认为最简单的方法 - 无论是 2D 还是 3D,都是使用以下公式:
\narea = sum(V(i+1) \xc3\x97 V(i))/2;\n
Run Code Online (Sandbox Code Playgroud)\n向量十字\xc3\x97
在哪里。
执行此操作的代码是:
\n public double Area(List<Point3D> PtList)\n {\n\n int nPts = PtList.Count;\n Point3D a;\n int j = 0;\n\n for (int i = 0; i < nPts; ++i)\n {\n j = (i + 1) % nPts;\n a += Point3D.Cross(PtList[i], PtList[j]);\n }\n a /= 2;\n return Point3D.Distance(a,default(Point3D));\n }\n\n public static Point3D Cross(Point3D v0, Point3D v1)\n {\n return new Point3D(v0.Y * v1.Z - v0.Z * v1.Y,\n v0.Z * v1.X - v0.X * v1.Z,\n v0.X * v1.Y - v0.Y * v1.X);\n }\n
Run Code Online (Sandbox Code Playgroud)\n请注意,该解决方案不依赖于 x 平面的投影,我认为这很笨拙。
\n你怎么认为?
\n 归档时间: |
|
查看次数: |
5091 次 |
最近记录: |