当前位置: 首页 > 知识库问答 >
问题:

沿路径求Y坐标。四次bezier曲线

璩和璧
2023-03-14

给定一个X值(或百分比),我需要沿着二次Bezier曲线找到一点的Y坐标

该曲线是在android中使用以下内容绘制的折线图的一部分:

path.quadto(prev.x,prev.y,(p.x+prev.x)/2,(p.y+prev.y)/2);

共有1个答案

艾哲
2023-03-14

二次Bezier曲线的公式是

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画布上测试,似乎并不完全匹配。
他们可能有一个与此略有不同的自定义实现。

您将不得不在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>
 类似资料:
  • 我的的代码是: 我已经定义了所有的设置,绘制等,但我想发射球从开始到贝塞尔曲线的中间,只要空间被压一次。 你有什么建议吗?

  • 我想沿着这条路径平稳地移动一个物体。为了实现这一点,我想创建基于点的二次或三次Bezier曲线,并插值这些曲线。然而,我如何适当地拟合曲线,以使路径不被破坏,如果。一条曲线在F点停止,另一条曲线开始?

  • 为了做到这一点,我将需要找到控制点的“边缘”曲线决定形状,然后填充形状,这是发现在两个新的曲线之间。然而,我很不确定如何做到这一点。我想过的一件事是通过简单地在连接原控制点和原终点的直线上画垂直段来确定新曲线的起点和终点,但这仍然不能解决为新曲线寻找新控制点的问题。

  • 我有一个postgis数据库(postgres 8.4.11,postgis 1.5.2),其中包含gps观测,我想计算一些旅行距离。 一小时后,我使用从gpspoint p1、gpspoint p2选择observedid、ST_distance(p1.shape_utm、p2.shape_utm)计算从一个点到另一个点的行驶距离,其中p2.datetime=p1.datetime间隔“1小时”

  • 我试图画一条具有一定厚度的三次bezier路径,但曲线看起来像是一系列断开的线段(在我的例子中是3段)。这是一张截图(蓝色圆圈是曲线的控制点)。 我注意到在cocos2d-x测试中的“绘制原语”中也出现了同样的效果。不管怎样,我很确定应该有一个变通办法,但我自己找不到。此外,线条受到锯齿效应的影响,我不知道如何应用一个alpha阴影来避免它。 这是我使用的代码:

  • 一个扩展了Curve的抽象基类。CurvePath仅仅是一个已连接的曲线的数组,但保留了曲线的API。 构造函数 CurvePath() 构造函数中不传入参数。 属性 共有属性请参见其基类Curve。 .curves : Array Curves数组。 .autoClose : Boolean 是否自动闭合路径。 方法 共有方法请参见其基类Curve。 .add ( curve : Curve )