如何根据移动的点和最近的点得到抛物线形状
How to get a parabola shape according to a moved point and nearest points
数学不是很好,我的项目有问题。
objective 是 3D 文件的边界校正。
在我的应用程序中,用户在 X 轴上移动一个 3D 点以校正或修改对象的边界。
我想以相同的方向但递减地移动最近的边界点。我的意思是,任何一点都不应超过要点。最近的点移动最多,最远的点移动较少。
图中,红点代表点的初始状态。用户在 x 方向上拉动 P0。其他要点紧随其后。积分的最后状态由紫色圆点表示。
这是我试过的。
//On point moved event
//Get nearest boundary Points (Uses Geometry3D to get boundary points).
(var clothDMesh, _) = Utilities3D.BuildDMesh(baseMesh);
CreateClothModel(clothDMesh);
var boundryVertices = nodes.Where(ro => ro.Value.isBorder).Select(ro => ro.Value.vertex).ToList();
var refPoint = CustomPoint.FromPoint3D(movedPoint);
//Gets the delta X.
var deltaX = p.X - initialX;
//Gets nearest country points, so 15 points above and 15 points below to move only a given number of points (I know maybe this should be calculated according to delta).
var nearestPoints = refPoint.GetNearesPoints(boundryVertices, 30);
foreach (var item in nearestPoints)
{
//This is only one of what I tried as a function. None of them worked correctly.
item.X += deltaX - (deltaX * 1/ Math.Pow(item.Distance, 2));
}
我们将不胜感激。
提前致谢。
这是数学部分:
我称“a”为“deltaX”。
我们还需要第二个参数:“b”,红点的最大高度。我假设它是对称的,“-b”将是红点的最小高度。
因此,如果您根据点的坐标 Y 查找值 X,水平移动:
X = a - a * Y * Y / (b * b);
您可以验证对于 Y = 0,您获得 X = a,对于 Y = b(或 -b),您获得 X = 0。
你有你的抛物线(X 是 Y^2 的函数)。
数学不是很好,我的项目有问题。
objective 是 3D 文件的边界校正。
在我的应用程序中,用户在 X 轴上移动一个 3D 点以校正或修改对象的边界。
我想以相同的方向但递减地移动最近的边界点。我的意思是,任何一点都不应超过要点。最近的点移动最多,最远的点移动较少。
图中,红点代表点的初始状态。用户在 x 方向上拉动 P0。其他要点紧随其后。积分的最后状态由紫色圆点表示。
这是我试过的。
//On point moved event
//Get nearest boundary Points (Uses Geometry3D to get boundary points).
(var clothDMesh, _) = Utilities3D.BuildDMesh(baseMesh);
CreateClothModel(clothDMesh);
var boundryVertices = nodes.Where(ro => ro.Value.isBorder).Select(ro => ro.Value.vertex).ToList();
var refPoint = CustomPoint.FromPoint3D(movedPoint);
//Gets the delta X.
var deltaX = p.X - initialX;
//Gets nearest country points, so 15 points above and 15 points below to move only a given number of points (I know maybe this should be calculated according to delta).
var nearestPoints = refPoint.GetNearesPoints(boundryVertices, 30);
foreach (var item in nearestPoints)
{
//This is only one of what I tried as a function. None of them worked correctly.
item.X += deltaX - (deltaX * 1/ Math.Pow(item.Distance, 2));
}
我们将不胜感激。
提前致谢。
这是数学部分: 我称“a”为“deltaX”。 我们还需要第二个参数:“b”,红点的最大高度。我假设它是对称的,“-b”将是红点的最小高度。
因此,如果您根据点的坐标 Y 查找值 X,水平移动:
X = a - a * Y * Y / (b * b);
您可以验证对于 Y = 0,您获得 X = a,对于 Y = b(或 -b),您获得 X = 0。 你有你的抛物线(X 是 Y^2 的函数)。