2

我有一些代码可以向前或向后移动随机定向的 3D 地震线,类似于一般的交叉点播放器。它在 Petrel 2011 中运行良好,但是一旦我更新到 2012 年它似乎就坏了。问题是当我尝试设置一个新方面时,线的正常方向似乎改变了几个小数。下面是一些示例代码...

SeismicLine3D line = ...;
double distance = ...;
Direction3 direction = ...;
Direction3 normal = ...;

Facet facet = seismicLine3D.Intersection.Facets.ElementAt(0);
Vector3 offset = Vector3.Multiply(distance, direction.NormalizedVector);
Point3 point = Point3.Add(facet.Plane.DefiningPoint, offset);
Plane3 plane = new Plane3(point, normal);
Facet newFacet = new Facet(plane, new Plane3[] {});
IEnumerable<Facet> facets = new Facet[] {newFacet};

using (ITransaction transaction = DataManager.NewTransaction())
{
    transaction.Lock(seismicLine3D);

    try { seismicLine3D.Intersection.Facets = facets; }
    finally { transaction.Commit(); }
}

// BAD!!!
// seismicLine3D.Intersection.Facets.ElementAt(0).Plane.Normal != normal;

有谁知道海燕 2011 年和 2012 年之间可能发生了什么变化导致这种情况?另外,有人知道可能的解决方法吗?

编辑:
在任何切换窗口中查看时,正常方向的变化非常明显。随着线条的移动,您将在可视化中看到轻微的“故障”。

4

1 回答 1

1

问题是由于 double -> float 和 float->double 转换期间的舍入造成的。该算法在每次迭代时都会稍微修改其输入地震线,导致计算的法线每次都因舍入问题而略有不同。首先将归一化的法线转换为浮点数会稍微提高算法的精度。但到目前为止,最好的解决方法是存储第一个法线并在每次迭代中使用它。

干杯,普里亚

于 2013-02-19T21:19:25.210 回答