沿 Path.quadTo 贝塞尔曲线查找 Y 坐标
Find Y coordinate along Path.quadTo bezier curve
给定 X 值(或百分比)我需要找到沿着二次贝塞尔曲线的点的 Y 坐标
该曲线是在 android 中使用以下方法绘制的折线图的一部分:
Path.quadTo(prev.x, prev.y, (p.x + prev.x)/2, (p.y + prev.y)/2);
二次贝塞尔曲线的公式为
x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
...但我只是在 HTML canvas 上测试它,似乎并不完全匹配。
他们可能有一个与此略有不同的自定义实现。
您必须在 android 上进行测试,然后看看,希望这会让您走上正确的道路。
var c = document.getElementById("c");
var ctx = c.getContext("2d");
function drawCurve(p) {
ctx.beginPath();
ctx.bezierCurveTo(p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y);
ctx.stroke();
ctx.fillStyle = "red";
for (var i = 0; i < 100; i++) {
ctx.beginPath();
t = i/100;
x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
ctx.arc(x, y, 1, 0, 2 * Math.PI);
ctx.fill();
}
}
drawCurve([
{x:10, y:120},
{x:340, y:120},
{x:340, y:20},
])
drawCurve([
{x:50, y:10},
{x:180, y:150},
{x:240, y:10},
])
<canvas id="c" width="350" height="150"></canvas>
给定 X 值(或百分比)我需要找到沿着二次贝塞尔曲线的点的 Y 坐标
该曲线是在 android 中使用以下方法绘制的折线图的一部分:
Path.quadTo(prev.x, prev.y, (p.x + prev.x)/2, (p.y + prev.y)/2);
二次贝塞尔曲线的公式为
x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
...但我只是在 HTML canvas 上测试它,似乎并不完全匹配。
他们可能有一个与此略有不同的自定义实现。
您必须在 android 上进行测试,然后看看,希望这会让您走上正确的道路。
var c = document.getElementById("c");
var ctx = c.getContext("2d");
function drawCurve(p) {
ctx.beginPath();
ctx.bezierCurveTo(p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y);
ctx.stroke();
ctx.fillStyle = "red";
for (var i = 0; i < 100; i++) {
ctx.beginPath();
t = i/100;
x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
ctx.arc(x, y, 1, 0, 2 * Math.PI);
ctx.fill();
}
}
drawCurve([
{x:10, y:120},
{x:340, y:120},
{x:340, y:20},
])
drawCurve([
{x:50, y:10},
{x:180, y:150},
{x:240, y:10},
])
<canvas id="c" width="350" height="150"></canvas>