Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 从贝塞尔曲线到点的垂直线 问题:_Geometry_Computational Geometry_Intersection_Bezier_Cubic Bezier - Fatal编程技术网

Geometry 从贝塞尔曲线到点的垂直线 问题:

Geometry 从贝塞尔曲线到点的垂直线 问题:,geometry,computational-geometry,intersection,bezier,cubic-bezier,Geometry,Computational Geometry,Intersection,Bezier,Cubic Bezier,我需要得到一条三次(2d)贝塞尔曲线B(t)的点Q,从点Q到另一个给定点p的直线与贝塞尔曲线垂直相交 我知道:P,B(t) 我寻找:Q(基本上我想得到g的斜率,但当我知道Q时,我可以很容易地计算出来,但是g的斜率就足够了) 我现在所做的(你可以跳过这个) 请注意,我认为这个安萨兹是错误的。这只是出于完整性考虑 我试图用我的数学(基础)知识来解决这个问题,但我无法完成。这就是我现在拥有的(请不要对符号太严格,我在这方面不是很好): 以下公式将用y(x)表示,为了得到一个结果,必须对y(x)

我需要得到一条三次(2d)贝塞尔曲线B(t)的点Q,从点Q到另一个给定点p的直线与贝塞尔曲线垂直相交

  • 我知道:P,B(t)
  • 我寻找:Q(基本上我想得到g的斜率,但当我知道Q时,我可以很容易地计算出来,但是g的斜率就足够了)


我现在所做的(你可以跳过这个) 请注意,我认为这个安萨兹是错误的。这只是出于完整性考虑

我试图用我的数学(基础)知识来解决这个问题,但我无法完成。这就是我现在拥有的(请不要对符号太严格,我在这方面不是很好):

以下公式将用y(x)表示,为了得到一个结果,必须对y(x)x(y)进行计算。点P是控制点,Q是从Q到P的线g(x)垂直于贝塞尔曲线B(t)=(x,y)t的点。线g(x)的表达式可以通过

其中,B(x)是笛卡尔坐标系中的贝塞尔曲线,B'(x)是导数(笛卡尔坐标系中),k是与y轴的交点。要得到g(x)的斜率,必须求解

为了计算B(x),我们必须解出t的B(t),然后把它插回B(t)。所以在贝塞尔曲线上的每一点上都有一个关系

这也适用于导数B’(t)

B(t)的导数是(根据)

为t()解决这个问题会导致

其中a0=(P1-P0)x,a1=(P2-P1)x和a2=(P3-P2)x。将*ti*s插回B(t)会导致(,)


现在,下一步是使用y=B'(x)和第二个方程,并消除x,但我不知道如何,甚至不知道这是否可行。

您已经知道贝塞尔曲线的导数-它描述了曲线的切线。此切线应垂直于
QP
矢量。因此,此时需要编写向量
PQ
和切线向量
T
的两个分量

PQx = (1-t)^3 * P0.x + 3*t*(1-t)^2*P1.x  ... - P.x
PQy = (1-t)^3 * P0.y + ... - P.y
Tx = 3*(1-t)^2 * (P1.x - P0.x).... and so on
Ty = ....
并建立向量T和QP的点积方程(垂直向量的点积为零):

现在打开括号,得到未知
t
5次阶方程


这种多项式方程没有封闭形式的解,所以需要某种数值解(使用那些用于多项式根的数值解)

您已经知道贝塞尔曲线的导数-它描述了曲线的切线。此切线应垂直于
QP
矢量。因此,此时需要编写向量
PQ
和切线向量
T
的两个分量

PQx = (1-t)^3 * P0.x + 3*t*(1-t)^2*P1.x  ... - P.x
PQy = (1-t)^3 * P0.y + ... - P.y
Tx = 3*(1-t)^2 * (P1.x - P0.x).... and so on
Ty = ....
并建立向量T和QP的点积方程(垂直向量的点积为零):

现在打开括号,得到未知
t
5次阶方程


这样的多项式方程没有封闭形式的解,所以你需要某种数值解(使用那些用于多项式根的数值解)

我找到了一个解决我的问题的近似方法,这个方法是由谁根据关于贝塞尔曲线的思想实现的。如果你必须处理贝塞尔曲线,看看这个。这就解释了我在贝塞尔曲线上遇到的大多数问题

该算法的思想如下:

  • 粗略估计:
  • 通过插入B(t)中的不同Ti计算Qapprox,i(mbostock使用t1=0,t2=1/8,t3=2/8,…)
  • 计算Qapprox、i和P之间的二次(保存一个平方根计算)距离
  • 保存Qapprox、i和最近(距离最小)的ti
  • 进行更精确的近似:
  • 选择一个精度q
  • 计算tbefore=ti-q
  • 检查Qapprox,before=B(t之前)和P之间的距离是否小于Qapprox,i和P之间的距离,如果是,则设置Qapprox,i=Qapprox,before并从2开始(精确近似值),如果否,则继续
  • 计算tafter=ti+q
  • 检查Qapprox,after=B(tafter)和P之间的距离是否小于Qapprox,i和P之间的距离,如果是,设置Qapprox,i=Qafter并从2开始(精确近似值),如果否,继续
  • Qapprox,我是最接近的。如果精度足够好,就到此为止。如果不降低精度q(mbostock除以2),并在2(精确近似值)处重新开始
  • 如前所述,这是一项执行计划。我 在这里粘贴代码,以防链接断开。这不是我自己的代码

    var points=[[474276]、[586393]、[378388]、[338323]、[341138]、[547252]、[589148]、[346227]、[365108]、[562,62];
    可变宽度=960,
    高度=500;
    var line=d3.svg.line()
    .插入(“基数”);
    var svg=d3.选择(“正文”).追加(“svg”)
    .attr(“宽度”,宽度)
    .attr(“高度”,高度);
    var path=svg.append(“路径”)
    .基准(点)
    .attr(“d”,行);
    var line=svg.append(“line”);
    var circle=svg.append(“circle”)
    .attr(“cx”,-10)
    .attr(“cy”,-10)
    .attr(“r”,3.5);
    svg.append(“rect”)
    .attr(“宽度”,宽度)
    .attr(“高度”,高度)
    .on(“mousemove”,mousemoved);
    //添加坐标显示
    var coords=svg.append(“文本”);
    函数mousemoved(){
    var m=d3.鼠标(此),
    p=闭合点(path.node(),m);
    行属性(x1,p[0])。属性(y1,p[1])。属性(x2,m[0])。属性(y2,m[1]);
    圆.attr(“cx”,p[0]).attr(“cy”,p[1]);
    coords.attr(“x”,“p[0]+m[0])/2).attr(“y”,“p[1]+m[1])/2).html(“Q”(“+Math.round(p[0])+”,“+Math.round(p[1])+”);
    }
    函数闭合点(路径节点,点){
    var pathLength=pathNode.getTotalLength(),
    精度=8,
    最好的,
    最佳长度,
    最佳距离=无穷大;
    //粗近似线性扫描
    对于(变量扫描,扫描长度=0,扫描距离;扫描长度0.5){