- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用一个名为 MIConvexHull 的 3D Voronoi 库,它为 3D 空间中的一系列点计算 3D Voronoi 图。但是,它不提供有关 Voronoi 图结构的高级信息;报告的边缘只是一个坐标对列表,然后必须计算外心。
现在库提供了一系列二维点的外心计算的实现。正如您在这里看到的,显示了开始(橙色)和结束(绿色)的坐标对:
您可以直观地看到,如果您取每条边中列出的顶点并制作一个圆,使该圆的圆周接触所有边,则中心就是边的起点。
我遇到的问题是我的点是 3D 的,因此返回的不是圆的中心,而是球体的中心。不幸的是,高等数学并不是我的头脑能够真正处理好的东西,所以我不知道如何解决这个问题。
给定 3D 空间中的 4 个点,如何获得球体的中心,使所有点都位于球体表面?
编辑:在 3D 中,将提供 4 个点,而不是 3 个。
最佳答案
我将上面链接的 Javascript 实现转换为 C#。在这里:
/// <summary>
/// Given four points in 3D space, solves for a sphere such that all four points
/// lie on the sphere's surface.
/// </summary>
/// <remarks>
/// Translated from Javascript on http://www.convertalot.com/sphere_solver.html, originally
/// linked to by http://stackoverflow.com/questions/13600739/calculate-centre-of-sphere-whose-surface-contains-4-points-c.
/// </remarks>
public class CircumcentreSolver
{
private const float ZERO = 0;
private double m_X0, m_Y0, m_Z0;
private double m_Radius;
private double[,] P =
{
{ ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO }
};
/// <summary>
/// The centre of the resulting sphere.
/// </summary>
public double[] Centre
{
get { return new double[] { this.m_X0, this.m_Y0, this.m_Z0 }; }
}
/// <summary>
/// The radius of the resulting sphere.
/// </summary>
public double Radius
{
get { return this.m_Radius; }
}
/// <summary>
/// Whether the result was a valid sphere.
/// </summary>
public bool Valid
{
get { return this.m_Radius != 0; }
}
/// <summary>
/// Computes the centre of a sphere such that all four specified points in
/// 3D space lie on the sphere's surface.
/// </summary>
/// <param name="a">The first point (array of 3 doubles for X, Y, Z).</param>
/// <param name="b">The second point (array of 3 doubles for X, Y, Z).</param>
/// <param name="c">The third point (array of 3 doubles for X, Y, Z).</param>
/// <param name="d">The fourth point (array of 3 doubles for X, Y, Z).</param>
public CircumcentreSolver(double[] a, double[] b, double[] c, double[] d)
{
this.Compute(a, b, c, d);
}
/// <summary>
/// Evaluate the determinant.
/// </summary>
private void Compute(double[] a, double[] b, double[] c, double[] d)
{
P[0, 0] = a[0];
P[0, 1] = a[1];
P[0, 2] = a[2];
P[1, 0] = b[0];
P[1, 1] = b[1];
P[1, 2] = b[2];
P[2, 0] = c[0];
P[2, 1] = c[1];
P[2, 2] = c[2];
P[3, 0] = d[0];
P[3, 1] = d[1];
P[3, 2] = d[2];
// Compute result sphere.
this.Sphere();
}
private void Sphere()
{
double r, m11, m12, m13, m14, m15;
double[,] a =
{
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO }
};
// Find minor 1, 1.
for (int i = 0; i < 4; i++)
{
a[i, 0] = P[i, 0];
a[i, 1] = P[i, 1];
a[i, 2] = P[i, 2];
a[i, 3] = 1;
}
m11 = this.Determinant(a, 4);
// Find minor 1, 2.
for (int i = 0; i < 4; i++)
{
a[i, 0] = P[i, 0] * P[i, 0] + P[i, 1] * P[i, 1] + P[i, 2] * P[i, 2];
a[i, 1] = P[i, 1];
a[i, 2] = P[i, 2];
a[i, 3] = 1;
}
m12 = this.Determinant(a, 4);
// Find minor 1, 3.
for (int i = 0; i < 4; i++)
{
a[i, 0] = P[i, 0] * P[i, 0] + P[i, 1] * P[i, 1] + P[i, 2] * P[i, 2];
a[i, 1] = P[i, 0];
a[i, 2] = P[i, 2];
a[i, 3] = 1;
}
m13 = this.Determinant(a, 4);
// Find minor 1, 4.
for (int i = 0; i < 4; i++)
{
a[i, 0] = P[i, 0] * P[i, 0] + P[i, 1] * P[i, 1] + P[i, 2] * P[i, 2];
a[i, 1] = P[i, 0];
a[i, 2] = P[i, 1];
a[i, 3] = 1;
}
m14 = this.Determinant(a, 4);
// Find minor 1, 5.
for (int i = 0; i < 4; i++)
{
a[i, 0] = P[i, 0] * P[i, 0] + P[i, 1] * P[i, 1] + P[i, 2] * P[i, 2];
a[i, 1] = P[i, 0];
a[i, 2] = P[i, 1];
a[i, 3] = P[i, 2];
}
m15 = this.Determinant(a, 4);
// Calculate result.
if (m11 == 0)
{
this.m_X0 = 0;
this.m_Y0 = 0;
this.m_Z0 = 0;
this.m_Radius = 0;
}
else
{
this.m_X0 = 0.5 * m12 / m11;
this.m_Y0 = -0.5 * m13 / m11;
this.m_Z0 = 0.5 * m14 / m11;
this.m_Radius = System.Math.Sqrt(this.m_X0 * this.m_X0 + this.m_Y0 * this.m_Y0 + this.m_Z0 * this.m_Z0 - m15 / m11);
}
}
/// <summary>
/// Recursive definition of determinate using expansion by minors.
/// </summary>
private double Determinant(double[,] a, int n)
{
int i, j, j1, j2;
double d = 0;
double[,] m =
{
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO },
{ ZERO, ZERO, ZERO, ZERO }
};
if (n == 2)
{
// Terminate recursion.
d = a[0, 0] * a[1, 1] - a[1, 0] * a[0, 1];
}
else
{
d = 0;
for (j1 = 0; j1 < n; j1++) // Do each column.
{
for (i = 1; i < n; i++) // Create minor.
{
j2 = 0;
for (j = 0; j < n; j++)
{
if (j == j1) continue;
m[i - 1, j2] = a[i, j];
j2++;
}
}
// Sum (+/-)cofactor * minor.
d = d + System.Math.Pow(-1.0, j1) * a[0, j1] * this.Determinant(m, n - 1);
}
}
return d;
}
}
关于c# - 计算表面包含 4 个点的球心 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13600739/
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在尝试将此 X、Y、Z 数据集拟合到未知表面。 不幸的是,线性拟合不足以显示表面数据。我认为多项式拟合可能适合这种情况。另外,问题是我不知道如何建立多项式拟合函数来完成曲面拟合。 任何帮助都会很棒
我已经用plotly构建了一个表面图表,并且我正在尝试根据我自己的文本获得hoverinfo。奇怪的是它不再工作了。 library(plotly) x % layout(dragmode = "tu
我有以下数据: library(rgl) x y,y->z,z->x) zmat <- matrix(data = z, nrow = 6, ncol = 5, byrow = FALSE) surf
我正在使用 DXVA 视频解码器。它工作正常,但我想与另一个 IDirect3D9 设备对象共享解压缩的表面。 我读了this文件,我调用 IDirectXVideoDecoderService::C
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
import pygame, sys, os.path pygame.init() # set up the colours # R G B BLACK = ( 0,
我的目标是在 pygame 实例内显示一个颜色图,以 49 个元素 ndarray 的形式反射(reflect)实时输入,范围从 -6 到 2,标准化为 0 到 1 的值。到目前为止,我正在使用 ma
我在 Visual C# -> surface -> v2.0 -> MS visual C# 2010 express 中的 Surface Application (WPF) 模板中工作。 我正在
我正在尝试在 JavaFX 中实现我自己的 3D 表面动画,但我不理解它应该工作的一切,有人可以帮助我理解哪个应该放在哪里吗? 已经知道使用类构建Mesh需要类对象TraingleMesh然后必须使用
根据我的阅读,我不相信 SurfaceView 可以设置动画,但我会问这个问题: 我在 ViewFlipper 中有一个 surfaceView 对象。当 ViewFlipper 向左或向右移动到新的
我想在 android 屏幕上有一个图像,图像的不同部分可以点击。我的意思是,如果它是 3 个圆圈的图像,我希望能够单击这些圆圈中的每一个, 然后我可以为每个可点击的圆圈添加不同的功能。对于下图中的示
我有一个通过kinect获得的点集,现在我想创建一个网格。我正在尝试使用 CGAL 库并且正在关注 this example . 我使用的是 VS2010,它运行没有任何错误,但是当然它没有在行中
在让我的 SurfaceView 显示我的相机预览时遇到一点问题。我在这里查看了一些问题并通过 Google 搜索了一些 tuts,但我认为这可能是我这边的一个小错误,我只是没有看到。 代码 publ
任何人都可以为我指出一些类(class)或对以下情况提出任何建议吗? 我有一个 SurfaceView,它有一个背景图像,我希望在其上绘制其他位图。我想支持以下操作: 点击一下,新的位图就会添加到背景
我正在尝试学习表面 View 并且我确实读到了它。 所以,我试着制作了一个游戏,我认为它可以帮助我更好地学习。 我创建了一个表面 View 类,如下所示: class SnakeEngine exte
我希望笑脸 div(在用户进入墙壁后显示)将覆盖主迷宫表面而不改变笑脸大小:你能帮帮我吗? 这是 fiddle 链接: http://jsfiddle.net/uqcLn/66/ 这是笑脸 div:
我有一组 (x,y,z) 点,这些点具有相应的法线和值。所以数据的形式是 [x y z nx ny nz c]。我想在这些垂直于这些法线的点上绘制一个 3D 表面,并且具有与该值对应的颜色。所以我想要
我有一个不是函数图的表面的 3D 数据集。数据只是 3D 中的一堆点,我唯一能想到的就是在 Matlab 中尝试 scatter3。 Surf 将不起作用,因为表面不是函数图。 使用 scatter3
假设我有一个函数,例如: 现在,我想绘制它的曲面图(matplotlib plot_surface )。我使用 np.arange(stop,end,increment) 构造了三个数组。 在这里,我
我是一名优秀的程序员,十分优秀!