简短版本 如何输入半径为三个可移动点之间距离的函数的圆?例如:
board.create('circle',[A,A.Dist(B)+A.Dist(C)]);
随着点的移动,中心发生变化,但半径保持不变。
更长的版本我正在尝试编写一个函数来计算从外部点到椭圆的切线,使用
给出的构造http://whistleralley.com/conics/conic_construction/tangent_to_conic/
除此之外,这需要我生成一个以焦点为中心的圆,其半径等于椭圆的长轴。这是我到目前为止所拥有的(部分):
var f1 = board.create('point',[4,0],{name:f1});
var f2 = board.create('point',[-4,0],{name:f2});
var A = board.create('point',[0,3]);
var ell = board.create('ellipse',[f1,f2,A]);
var P = board.create('point',[-6,6]);
var c2 = board.create('circle',[f2, A.Dist(f1)+A.Dist(f2)]);
在我开始移动点之前,这一切都很好 - 如果定义椭圆的初始点发生变化,圆的半径不会改变。无论该点移动到哪里,它的中心都会跟随 f2,但半径不会改变。显然这是因为半径需要定义为函数。但如何呢?例如,这不起作用:
var c2 = board.create('circle',[f2, function(f1,f2,A){return A.Dist(f1)+A.Dist(f2)}]);
这会引发类型错误(在控制台中):“TypeError:无法读取未定义的属性(读取“Dist”)”。
我可以使用滑块给出的参数手动编写椭圆函数(使用
curve
)。但这似乎有点矫枉过正,因为已经有了椭圆函数。
我还可以写三个监听函数:
A.on('drag', ()=> { });
f1.on('drag', ()=> { });
f2.on('drag', ()=> { });
每当这些点之一移动时,它就会更新半径。但同样,这似乎有点矫枉过正。
我最好的选择是什么?非常感谢!
在你的第一次尝试中
var c2 = board.create('circle',[f2, A.Dist(f1)+A.Dist(f2)]);
圆的半径
c2
设置为静态值 A.Dist(f1)+A.Dist(f2)
,该值在执行 board.create('circle',...)
时进行评估。
为了使半径动态化,一个简单的方法必须提供一个返回该值的函数,例如
var c2 = board.create('circle',[f2, () => A.Dist(f1)+A.Dist(f2)]);
然后在每次更新棋盘时评估距离。 这是完整的代码(另外点名称是字符串):
var f1 = board.create('point',[4,0],{name:'f1'});
var f2 = board.create('point',[-4,0],{name:'f2'});
var A = board.create('point',[0,3], {name: 'A'});
var ell = board.create('ellipse',[f1,f2,A]);
var P = board.create('point',[-6,6], {name: 'P'});
var c2 = board.create('circle',[f2, () => A.Dist(f1)+A.Dist(f2)]);