Improving Radial Pinch
This commit is contained in:
parent
552eab94a7
commit
381cddf825
2 changed files with 56 additions and 5 deletions
|
|
@ -199,7 +199,10 @@ namespace MatterHackers.MatterControl.DesignTools
|
||||||
var enclosingCircle = SourceContainer.GetSmallestEnclosingCircleAlongZ();
|
var enclosingCircle = SourceContainer.GetSmallestEnclosingCircleAlongZ();
|
||||||
var rotationCenter = enclosingCircle.Center + RotationOffset;
|
var rotationCenter = enclosingCircle.Center + RotationOffset;
|
||||||
|
|
||||||
var horizontalOffest = LinearHorizontalOffset.GetOffsetPath(enclosingCircle.Radius + RotationOffset.Length, size);
|
var maxRadius = enclosingCircle.Radius + RotationOffset.Length;
|
||||||
|
var horizontalOffset = new FlattenCurves(LinearHorizontalOffset.GetOffsetPath(maxRadius, size));
|
||||||
|
|
||||||
|
var xAtYInterpolator = new XAtYInterpolator(horizontalOffset);
|
||||||
|
|
||||||
var pinchedChildren = new List<IObject3D>();
|
var pinchedChildren = new List<IObject3D>();
|
||||||
|
|
||||||
|
|
@ -233,13 +236,15 @@ namespace MatterHackers.MatterControl.DesignTools
|
||||||
}
|
}
|
||||||
|
|
||||||
var positionXy = new Vector2(position) - rotationCenter;
|
var positionXy = new Vector2(position) - rotationCenter;
|
||||||
if (true)
|
var fromLine = true;
|
||||||
|
if (fromLine)
|
||||||
{
|
{
|
||||||
positionXy *= Easing.Quadratic.InOut(ratio);
|
//positionXy *= horizontalOffset.GetXAtY(position.Z) / maxRadius;
|
||||||
|
positionXy *= xAtYInterpolator.Get(position.Z) / maxRadius;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//positionXy *= horizontalOffest.GetXAtY(positionXy.Y - bottom);
|
positionXy *= Easing.Quadratic.InOut(ratio);
|
||||||
}
|
}
|
||||||
positionXy += rotationCenter;
|
positionXy += rotationCenter;
|
||||||
transformedMesh.Vertices[i] = new Vector3Float(positionXy.X, positionXy.Y, position.Z);
|
transformedMesh.Vertices[i] = new Vector3Float(positionXy.X, positionXy.Y, position.Z);
|
||||||
|
|
@ -306,4 +311,50 @@ namespace MatterHackers.MatterControl.DesignTools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class XAtYInterpolator
|
||||||
|
{
|
||||||
|
private double bottom;
|
||||||
|
private double top;
|
||||||
|
|
||||||
|
private int numberOfSegments;
|
||||||
|
private double[] offsetAtY;
|
||||||
|
|
||||||
|
public XAtYInterpolator(IVertexSource inputCurveIn)
|
||||||
|
{
|
||||||
|
var inputCurve = new VertexStorage(inputCurveIn);
|
||||||
|
|
||||||
|
var bounds = inputCurve.GetBounds();
|
||||||
|
bottom = bounds.Bottom;
|
||||||
|
top = bounds.Top;
|
||||||
|
numberOfSegments = 100;
|
||||||
|
offsetAtY = new double[numberOfSegments + 1];
|
||||||
|
for (int i = 0; i < numberOfSegments + 1; i++)
|
||||||
|
{
|
||||||
|
var y = bottom + (top - bottom) * i / numberOfSegments;
|
||||||
|
offsetAtY[i] = inputCurve.GetXAtY(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal double Get(double y)
|
||||||
|
{
|
||||||
|
// check if we are bellow the bottom
|
||||||
|
if (y <= bottom)
|
||||||
|
{
|
||||||
|
return offsetAtY[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if we are above the top
|
||||||
|
if (y >= top)
|
||||||
|
{
|
||||||
|
return offsetAtY[numberOfSegments];
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the segment we are in
|
||||||
|
var segment = (int)((y - bottom) / (top - bottom) * numberOfSegments);
|
||||||
|
// lerp between the two points
|
||||||
|
var ratio = (y - bottom) / (top - bottom) * numberOfSegments - segment;
|
||||||
|
return offsetAtY[segment] * (1 - ratio) + offsetAtY[segment + 1] * ratio;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit fc0be85c4d05613470865d548f88c16e1c38b6b2
|
Subproject commit d7786240ef49ae59929da73363e8a17311941aef
|
||||||
Loading…
Add table
Add a link
Reference in a new issue