我在绘制bezier Curve的代码时遇到了问题,它在iOS中运行得很完美。
我希望effect.使用触摸点。
但我错了。 这一行的问题
previousCenterPoint = CenterPointOf(new PointF(points.get(0).x,points.get(0).y), previousPoint);
在iOS中,使用currentPoint我们可以得到当前点。
请建议我如何获取当前轮廓路径 ....
这是我的代码..
public void makeBezierCurve(ArrayList<PointF> points) {
if (points.size() > 0) {
if (points.size() < 3) {
switch (points.size()) {
case 1:
lineTo(points.get(0).x, points.get(0).y);
case 2:
lineTo(points.get(1).x, points.get(1).y);
default:
break;
}
} else {
PointF previousPoint = new PointF(0, 0);
PointF previousCenterPoint = new PointF(0, 0);
PointF centerPoint = new PointF(0, 0);
double centerPointDistance = 0;
double obliqueAngle = 0;
PointF previousControlPoint1 = new PointF(0, 0);
PointF previousControlPoint2 = new PointF(0, 0);
PointF controlPoint1 = new PointF(0, 0);
float contractionFactor = 0.7f;
for (int i = 0; i < points.size(); i++) {
PointF pointI = points.get(i);
if (i > 0) {
previousCenterPoint = CenterPointOf(new PointF(points.get(0).x, points.get(0).y), previousPoint);
centerPoint = CenterPointOf(previousPoint, pointI);
centerPointDistance = DistanceBetween(previousCenterPoint, centerPoint);
obliqueAngle = ObliqueAngleOfStraightThrough(centerPoint, previousCenterPoint);
previousControlPoint2 = new PointF((float) (previousPoint.x - 0.5 * contractionFactor * centerPointDistance * Math.cos(obliqueAngle)), (float) (previousPoint.y - 0.5 * contractionFactor * centerPointDistance * Math.sin(obliqueAngle)));
controlPoint1 = new PointF((float) (previousPoint.x + 0.5 * contractionFactor * centerPointDistance * Math.cos(obliqueAngle)), (float) (previousPoint.y + 0.5 * contractionFactor * centerPointDistance * Math.sin(obliqueAngle)));
}
if (i == 1) {
quadTo(previousControlPoint2.x, previousControlPoint2.y, previousPoint.x, previousPoint.y);
} else if (i >= 2 && i < points.size() - 1) {
cubicTo(previousControlPoint1.x, previousControlPoint1.y, previousControlPoint2.x, previousControlPoint2.y, previousPoint.x, previousPoint.y);
} else if (i == points.size() - 1) {
cubicTo(previousControlPoint1.x, previousControlPoint1.y, previousControlPoint2.x, previousControlPoint2.y, previousPoint.x, previousPoint.y);
quadTo(controlPoint1.x, controlPoint1.y, pointI.x, pointI.y);
}
previousControlPoint1.set(controlPoint1);
previousPoint.set(pointI);
}
}
} else {
logger.e("BezierHelper", "makeBezierCurve: error");
}
}
答案 0 :(得分:0)
要实现您显示的链接的效果,您需要实现Catmull-Rom曲线。值得庆幸的是,如果您正在使用已经绘制了三次贝塞尔曲线的代码,那么这些是很容易实现的,因为它们是相同的曲线,只是使用不同的表示,并且从一个转换到另一个是incredibly easy。
获取您的积分列表,并为每个与您正在查看的点之前和之后的点对齐的点创建切线。设置所有CR点的通用代码:
points = ...
initialpoint = points[0] - (points[1] - points[0]) // invent a 'virtual' -1th point
finalpoint = points[last] + (points[last] - points[last-1]) // invent a 'virtual' (last+1)th point
points = initialpoint + points + finalpoint
foreach ((point,i) in points) {
try {
p = points[i-1]
n = points[i+1]
} catch { continue }
diff = n-p
point.tangent = diff/2 // let's be reasonable
}
points = points.slice(1,last-1) // throw those virtual points away
然后绘制catmull-rom曲线(通过将每个CR部分的坐标转换为Bezier坐标并绘制相应的Bezier曲线),使用您显示的页面中的滑块控制&#34;紧密度&#34;转换为贝塞尔坐标之前的因子。