Javascript 倒圆半径计算

Javascript 倒圆半径计算,javascript,geometry,Javascript,Geometry,我想计算一个倒圆的半径 我设法实现了一切,但经过数小时的努力,我找不到一个公式来计算正确的倒置半径 有关圆反转的更多信息: 到目前为止,我的代码是: 这似乎是可行的,但你可以很容易地看出这是完全错误的 var c = $('#c'), b = $('body'), canvas = c[0], ctx = canvas.getContext('2d'), pi = Math.PI, r = 100, mr = 30, width,

我想计算一个倒圆的半径

我设法实现了一切,但经过数小时的努力,我找不到一个公式来计算正确的倒置半径

有关圆反转的更多信息:

到目前为止,我的代码是:

这似乎是可行的,但你可以很容易地看出这是完全错误的

var c = $('#c'),
    b = $('body'),
    canvas = c[0],
    ctx = canvas.getContext('2d'),
    pi = Math.PI,
    r = 100,
    mr = 30,
    width, height, hw, hh;
var setup = function() {
  width = b.width();
  height = b.height();
  hw = width/2;
  hh = height/2;
  canvas.width = width;
  canvas.height = height;
  mid();
};
var mid = function() {
  circle(hw,hh,0.25);
  circle(hw,hh,r);
}
var circle = function(x,y,r) {
  ctx.beginPath();
  ctx.arc(x,y,r,0,pi*2);
  ctx.stroke();
  ctx.closePath();
};
var move = function(evt) {
  var x = evt.clientX,
      y = evt.clientY;
  ctx.clearRect(0,0,width,height);
  mid();
  circle(x,y,mr);
  var dx = x-hw,
      dy = y-hh,
      d = dist(dx,dy),
      nd = r*r/d,
      nx = dx*nd/d,
      ny = dy*nd/d,
      nr = mr*mr*pi/d; // whats the correct formula?
  console.log(nr);
  circle(nx+hw, ny+hh, nr);
};
var dist = function(x,y) {
  return Math.pow(x*x + y*y, 1/2);
};
$(setup);
$(window).resize(setup);
$(window).mousemove(move);

需要数学专家的帮助

我的错误是,我假设倒圆的中心也符合OP x OP'=r2,但如下图所示,它显然不符合。解决方法是计算圆上的两个点并反射每个点,然后使用这些点之间的一半距离来找到半径

这是正确的代码:

var c=$('#c'),
b=$(“正文”),
canvas=c[0],
ctx=canvas.getContext('2d'),
固定半径=100,
已保存=[],
宽度,高度,
一半={
w:0,
h:0
},
鼠标={
r:31,
x:0,,
y:0
},
反映={
x:0,,
y:0,
r:0
};
var setup=function(){
宽度=b.宽度();
高度=b.高度();
一半。w=宽度/2;
半h=高度/2;
画布宽度=宽度;
canvas.height=高度;
move();
};
var mid=函数(){
圆(半宽,半高,1.5);
圆(半w,半h,固定半径);
};
变量圆=函数(x,y,r,c){
ctx.strokeStyle=c | |“黑色”;
ctx.beginPath();
弧(x,y,r,0,数学π*2);
ctx.stroke();
ctx.closePath();
};
var线=功能(x1、y1、x2、y2、c){
ctx.strokeStyle=c | |“黑色”;
ctx.beginPath();
ctx.moveTo(x1,y1);
ctx.lineTo(x2,y2);
ctx.stroke();
ctx.closePath();
};
变量轴=函数(){
线(半宽,0,半宽,高度,#ccc');
线(0,半高,宽度,半高,#ccc');
};
var move=功能(evt){
mouse.x=evt?evt.clientX:half.w;
mouse.y=evt?evt.clientY:half.h+11;
ctx.clearRect(0,0,宽度,高度);
轴();
mid();
圆(mouse.x,mouse.y,mouse.r);
圆圈(mouse.x,mouse.y,1,'grey');
var di={
x:mouse.x-half.w,//橙色
y:鼠标.y-half.h//绿色
}
di.v=距离(di.x,di.y);
var a=Math.atan2(di.y,di.x);//角度
行(mouse.x-di.x,mouse.y,mouse.x,mouse.y,'orange');
行(mouse.x,mouse.y-di.y,mouse.x,mouse.y,'green');
变量p1={
v:di.v+鼠标.r//青色
}; 
p1.x=半个.w+(数学cos(a)*p1.v);
p1.y=half.h+(数学sin(a)*p1.v);
圆圈(p1.x,p1.y,1.5,'cyan');
变量p2={
v:di.v-mouse.r//红色
};
p2.x=half.w+Math.cos(a)*p2.v;
p2.y=half.h+Math.sin(a)*p2.v;
圆圈(p2.x,p2.y,1.5,'红色');
变量rp1={
v:Math.pow(fixedRadius,2)/p1.v//cyan
};
rp1.x=数学cos(a)*rp1.v,
rp1.y=数学sin(a)*rp1.v;
圆(rp1.x+half.w,rp1.y+half.h,1.5,'cyan');
变量rp2={
v:Math.pow(fixedRadius,2)/p2.v//red
};
rp2.x=数学cos(a)*rp2.v,
rp2.y=数学sin(a)*rp2.v;
圆圈(rp2.x+half.w,rp2.y+half.h,1.5,'red');
var newDi={
v:dist(rp1.x-rp2.x,rp1.y-rp2.y)
};   
newDi.r=newDi.v/2,
newDi.x=rp1.x+(Math.cos(a)*newDi.r),//黄色
newDi.y=rp1.y+(Math.sin(a)*newDi.r);//紫色
if(p2.v<0){
newDi.x=rp1.x-(数学cos(a)*newDi.r),
newDi.y=rp1.y-(数学sin(a)*newDi.r);
}
reflect.x=half.w+newDi.x;
reflect.y=half.h+newDi.y
//反射线
if(di.v.0){
鼠标.r++;
}否则{
老鼠;
}
移动(evt);
};
变量点击=功能(evt){
保存的.push(['c',mouse.x,mouse.y,mouse.r]);
保存的.push(['c',reflect.x,reflect.y,reflect.r]);
保存的.push(['l',mouse.x,mouse.y,reflect.x,reflect.y]);
};
var循环=函数(){
对于(变量i=0;i


正如你所说,颠倒一个圆的中心并不能得到另一个圆的中心。同样地,如果我们将一个圆的两个反点反转,这并不意味着它们将是反转圆上的相对点。 因为三个点描述了一个唯一的圆,我们可以用它们来求逆圆的方程。这给了我们倒圆的中心。然后我们可以找到从中心到其中一个倒转点的距离,这就是半径

下面的C++代码给出了中心。(我不懂javascript)。函数v.norm2()给出向量v的平方范数

Vector2D getcircle(Vector2D p1, Vector2D p2, Vector2D p3){
    Vector2D result;
    long double div = 2*(p1.x*(p2.y-p3.y)-p1.y*(p2.x-p3.x)+p2.x*p3.y-p3.x*p2.y);
    result.x = (p1.norm2()*(p2.y-p3.y)+p2.norm2()*(p3.y-p1.y)+p3.norm2()*(p1.y-p2.y))/div;
    result.y = (p1.norm2()*(p3.x-p2.x)+p2.norm2()*(p1.x-p3.x)+p3.norm2()*(p2.x-p1.x))/div;
    return result;
}
所以如果你有一个半径为r的圆c,并且你是相对于另一个圆c和半径r反转的,你可以这样做

float getRadius(Vector2D C, float R, Vector2D c, float r){
    Vector2D p1 = Vector2D(c.x + r, c.y).invert(C, R);
    Vector2D p2 = Vector2D(c.x - r, c.y).invert(C, R);
    Vector2D p3 = Vector2D(c.x, c.y + r).invert(C, R);
    return (getcircle(p1, p2, p3) - p1).norm();
}
这是一个圆心(130,-130)和半径为128的圆的图像,它是相对于另一个圆心(0,0)和半径为40的圆(未显示)的反转。 大圆上的红点是极性相反的。然后将它们倒置,并显示在小圆圈上,您可以看到它们不是极性对立面


请用文字解释一下你到底想做什么。“我想计算一个反射圆的半径。”。。对不起,我再清楚不过了……你说的“反射圆”到底是什么意思?请在此处进行解释或提供详细解释的链接(首选wiki资源)。我们不想看那个视频。好吧,你太懒了。。。希望你们中的一个人现在能回答这个问题。。。RSSSSI编辑您的问题以使用正确的术语。人们之所以感到困惑,是因为在几何学中,反射圆的半径与原始圆的半径相同——“如果我们将一个圆的两个反点反转,并不意味着它们将是反转圆上的相对点”,为什么不呢?在我看来,情况似乎永远如此。你能给我举个例子来证明你的陈述吗?编辑答案来证明。事实上,在这个小圆圈里几乎没有黄色,这表明了周长的扭曲。(大部分在最上面的红点后面)对不起