【问题标题】:Try to poll Y coordinates of a Bezier curve but got a straight line instead?尝试轮询贝塞尔曲线的 Y 坐标但得到一条直线?
【发布时间】:2019-01-25 07:21:50
【问题描述】:

我想从我生成的贝塞尔曲线路径中获取 Y 坐标值列表。

但我得到的只是一条直线,出了什么问题?

这里是sn-p的代码:

private static ArrayList<Integer> ys;

path.moveTo(point0.x, point0.y); //the origin, 0,0
path.cubicTo(point1.x, point1.y, point2.x, point2.y, point3.x, point3.y);//nothing wrong with the coordinates of these points as I checked them repeatedly and used several online websites to verify

PathMeasure pm = new PathMeasure(path, false);

float aCoordinates[] = {0f, 0f};

for (int i = 1;i<=totalNumberOfDots;i++) {
    pm.getPosTan(pm.getLength()*(float)i/totalNumberOfDots, aCoordinates, null);
    ys.add(Math.round(aCoordinates[1]));
}

因此,我没有给出正确的结果 - y 坐标在开始和结束时挤在一起,而在中间更分散,我得到了一个增量的整数系列,增量是恒定的,这表明它是一条直线。怎么了?

【问题讨论】:

  • 没有对应的X值就无法判断直线:)。 (0,0),(56,0),(100,44),(100,100) 的结果是什么(像四分之一圆的曲线)?
  • X的增量当然是一个常数,否则就没有意义了。我试过你的坐标,还是一条直线。真的很奇怪——我使用的cubicTo函数错了吗?
  • 所以你画这条路,看到直线?
  • 是的,我已经找到原因了。

标签: android path bezier cubic-bezier


【解决方案1】:

所以显然要使用这个cubicPath方法,最好有一个1:1的X yo Y轴比而不是任意一个。

也就是说,想象一个实心正方形,其中每边的长度相同。将所有点 P0、P1、P2、P3 固定到这个正方形的边上,这样就可以得到三次贝塞尔曲线。在一天结束时,您的第一个和最后一个点(P0 和 P3)应该是这样的:

(0,0) (squareLength, squareLength)

或者这个:

(0,squareLength) (squareLength,0)

我强烈建议不要使用不相等的 X 到 Y 轴,这会给你带来很多麻烦,因为曲线会显得很奇怪,在我的情况下,我的 Y 轴的范围是 1~1000 而 X 轴有范围只有 1~50,曲线被拉得很长,如果你绘制它,它看起来就像一条直线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多