Geometry 从贝塞尔曲线到点的垂直线 问题:
我需要得到一条三次(2d)贝塞尔曲线B(t)的点Q,从点Q到另一个给定点p的直线与贝塞尔曲线垂直相交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)
- 我知道: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次阶方程
这样的多项式方程没有封闭形式的解,所以你需要某种数值解(使用那些用于多项式根的数值解)我找到了一个解决我的问题的近似方法,这个方法是由谁根据关于贝塞尔曲线的思想实现的。如果你必须处理贝塞尔曲线,看看这个。这就解释了我在贝塞尔曲线上遇到的大多数问题 该算法的思想如下:
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){