我有一些代码可以向前或向后移动一个随机定向的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;
有谁知道Petrel 2011和2012之间可能发生了什么变化导致这种情况?另外,有没有人知道可能的解决方法?
编辑:
在任何切换窗口中查看时,正常方向的变化非常明显。当线条移动时,您会在可视化中看到轻微的“毛刺”。
答案 0 :(得分:1)
问题是由于在双倍期间舍入 - > float和float-&gt; double转换。该算法在每次迭代时稍微修改其输入地震线,由于该舍入问题,导致计算的法线每次略微不同。 首先将规范化法线转换为float会增加算法的精度。但到目前为止,最好的工作是存储第一个法线并在每次迭代时使用它。
干杯, 普里亚